ARM base instruction -- ccmp (immediate)

Conditional Compare (immediate) sets the value of the condition flags to the result of the comparison of a register value and an immediate value if the condition is TRUE, and an immediate value otherwise.

此指令一般出现在 cmp 指令之后,表示双重比较。

条件比较(立即数)将条件标志的值设置为寄存器值和立即数(如果条件为真)的比较结果,否则把条件标志设置为#<nzcv>的值。

<nzcv> = 1 1 1 1

n = 0x8

z = 0x4

c = 0x2

v = 0x1

32-bit variant

Applies when sf == 0.

CCMP <Wn>, #<imm>, #<nzcv>, <cond>

64-bit variant

Applies when sf == 1.

CCMP <Xn>, #<imm>, #<nzcv>, <cond>

Decode for all variants of this encoding

integer n = UInt(Rn);

integer datasize = if sf == '1' then 64 else 32;

bits(4) flags = nzcv;

bits(datasize) imm = ZeroExtend(imm5, datasize);

bits(N) ZeroExtend(bits(M) x, integer N)

assert N >= M;

return Zeros(N-M) : x;

bits(N) Zeros(integer N)

return Replicate('0',N);

bits(N) Replicate(bits(M) x)

assert N MOD M == 0;

return Replicate(x, N DIV M);

Operation

bits(datasize) operand1 = X[n];

bits(datasize) operand2;

if ConditionHolds(cond) then

operand2 = NOT(imm);

(-, flags) = AddWithCarry(operand1, operand2, '1');

PSTATE.<N,Z,C,V> = flags;

(bits(N), bits(4)) AddWithCarry(bits(N) x, bits(N) y, bit carry_in)

integer unsigned_sum = UInt(x) + UInt(y) + UInt(carry_in);

integer signed_sum = SInt(x) + SInt(y) + UInt(carry_in);

bits(N) result = unsigned_sum<N-1:0>; // same value as signed_sum<N-1:0>

bit n = result<N-1>;

bit z = if IsZero(result) then '1' else '0';

bit c = if UInt(result) == unsigned_sum then '0' else '1';

bit v = if SInt(result) == signed_sum then '0' else '1';

return (result, n:z:c:v);

ccmp x19, #0x0, #0x4, ne # 判断 x19 是否等于 0 ,如果不等于(ne)零,z标志位为0;如果等于(eq)零,把标志位设置0x4。

4034f4: f9405a94 ldr x20, [x20, #176] // x20=walk_b->children

4034f8: f9405a73 ldr x19, [x19, #176] // x19=walk_a->children

4034fc: f100029f cmp x20, #0x0 // x20=walk_b ? 0

403500: fa401a64 ccmp x19, #0x0, #0x4, ne // x19=walk_a, 如果x19=0,ccmp会设置标志位0x4, b.eq将会跳转

403504: 54000140 b.eq 40352c <ferror@plt+0x164c> // b.none

for (walk_a = a->children, walk_b = b->children; walk_a && walk_b;

walk_a = walk_a->next, walk_b = walk_b->next) {

#<nzcv>:

ARM Process state -- CPSR

ARM Process state -- PSTATE

ARM base instruction -- ccmp (register)

相关推荐
染指111019 小时前
35.x64汇编写法(二)
汇编·windows·x64游戏·x64汇编·游戏攻防
Jacen.L2 天前
逆向工程开篇(连载中)
汇编
薛定谔的猫_C8T62 天前
程序人生-Hello’s P2P
c语言·汇编·程序人生·shell·二进制·计算机系统·hello
God_archer2 天前
程序人生-hello’s P2P
linux·c语言·汇编·程序人生
南玖yy3 天前
x86 汇编逻辑运算全解析:从【位操作】到实际应用(AND,OR,NOT,XOR,TEST)
开发语言·汇编·arm开发·后端·架构·策略模式
南玖yy3 天前
深入理解 x86 汇编中的重复前缀:REP、REPZ/REPE、REPNZ/REPNE(进阶详解版)
开发语言·网络·汇编·后端·算法·bochs
Jacen.L3 天前
四、函数调用包含单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型
汇编
网安INF4 天前
深入理解汇编语言中的顺序与分支结构
开发语言·汇编·编程
染指11105 天前
34.x64汇编写法(一)
汇编·x64汇编
廖致君6 天前
打打基础 | 从翻转链表到寄存器、汇编与内存
汇编·数据结构·链表