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)

相关推荐
pigfu1 天前
go 通过汇编学习atomic原子操作原理
汇编·golang·atomic·缓存行·lock指令
小鹿撞出了脑震荡2 天前
汇编学习——iOS开发对arm64汇编的初步了解
汇编·学习·ios
染指11103 天前
21.第二阶段x64游戏实战-分析采集物偏移
汇编·游戏·反游戏外挂·游戏逆向·x64dbg·x64游戏
楠木s6 天前
常见汇编代码及其指定
java·汇编·数据库·安全·网络攻击模型·二进制·栈溢出
suyong_yq9 天前
调试Cortex-M85 MCU启动汇编和链接命令文件 - 解题一则
汇编·arm开发·嵌入式系统
染指111012 天前
18.第二阶段x64游戏实战-MFC列表框
汇编·c++·windows·游戏·游戏逆向·x64dbg
RaLi和夕15 天前
单片机学习笔记9.数码管
汇编·笔记·单片机·嵌入式硬件·学习
yu41062115 天前
GCC 内建函数汇编展开详解
汇编
手打猪大屁19 天前
ARM裸机开发——I.MX6U_汇编LED灯驱动
汇编·arm开发
zhmc21 天前
Keil A51汇编伪指令
汇编