当前位置: 首页 > news >正文

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)

http://www.lryc.cn/news/479015.html

相关文章:

  • 高德 阿里231滑块 分析
  • Unity 的 WebGL 构建中资源图片访问方式
  • WinForms 中使用 MVVM 模式构建应用:实现登录页面、页面导航及 SQLite 数据库连接完整框架搭建过程
  • Chrome调试工具(查看CSS属性)
  • MQTT从入门到精通之MQTT入门
  • Hadoop生态系统主要包括哪些组件以及它们的作用
  • OpenResty 1.27.1.1 已经正式发布
  • 定高虚拟列表:让大数据渲染变得轻松
  • python request与grequests该如何选择
  • Unity3D UI 拖拽
  • 介绍一下memcpy(c基础)
  • 【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
  • python-23-一篇文章帮你理解Python推导式
  • WPF中如何简单的使用CommunityToolkit.Mvvm创建一个项目并进行 增删改查
  • CesiumJS 案例 P15:检测标记、鼠标点击移动标记、鼠标拖动标记
  • Webserver(4.9)本地套接字的通信
  • [IAA系列] Image Aesthetic Assessment
  • 基于springboot的高校科研管理系统(源码+调试+LW)
  • Flutter环境配置
  • Rip动态路由及Rip动态路由优化
  • 双路快速排序和三路排序算法
  • SQL server增删改查语句和实例
  • 强化学习_06_pytorch-PPO2实践(ALE/Breakout-v5)
  • 《JVM第8课》垃圾回收算法
  • SpringBoot整合Freemarker(二)
  • element plus el-form自定义验证输入框为纯数字函数
  • Android笔记(三十一):Deeplink失效问题
  • 图神经网络初步实验
  • 创建线程时传递参数给线程
  • 兴业严选|美国总统都是不良资产出身 法拍市场是否将大众化