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 = Xn;

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)

相关推荐
kyle~1 天前
x86 汇编LOCK前缀 --- 硬件架构向软件提供的核心同步原语
汇编·c++·性能优化·硬件架构·实时系统
典典分享指南2 天前
飞书 + 企业微信 + 微信文档多端协同实践指南
汇编·flask·intellij-idea·fastapi
极客互动API7 天前
企业微信 iPad 协议服务搭建与 AI 回调实战
网络·汇编·人工智能·微信·企业微信·ipad
wechatbot88812 天前
极客互动企业微信 SCRM 私域运营实战效果全景
大数据·汇编·微信·自动化·企业微信·rpa
祈禾17 天前
计算机组成原理之编译、汇编、链接、解释
开发语言·汇编·笔记·学习
水饺编程19 天前
AT&T 汇编语言学习笔记开篇语
c语言·汇编·c++
iCxhust19 天前
8088单板机VScode集成开发环境使用方法二(汇编版)
汇编·单片机·微机原理·8088单板机
·薯条大王20 天前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
txg66621 天前
VULOC:基于汇编切片的漏洞定位框架,精准锁定二进制中的危险代码
汇编·人工智能·深度学习·安全·网络安全
sunburn-22 天前
Java 队列全面详解:从入门到面试实战
java·开发语言·汇编·ide·idea