x86-64 AT&T汇编中cmp指令后ja跳转的工作逻辑是怎样的?
问题结论
你提供的AT&T汇编代码中,ja label 触发跳转的规则是 %ax 存储的无符号数值 > %bx 存储的无符号数值时跳转,也就是你所说的a>b场景(此处a对应%ax,b对应%bx)。
逻辑拆解
- 首先明确AT&T语法
cmp指令的运算逻辑:
AT&T语法中cmp 源操作数, 目的操作数的底层操作为「目的操作数 - 源操作数」,该操作不会修改两个操作数本身,仅会更新EFLAGS寄存器的标志位。你给出的cmp %bx,%ax实际执行的是%ax - %bx的无符号减法运算。 - 无符号减法与标志位的对应关系:
- 当
%ax>%bx:减法无借位,CF=0;结果非0,ZF=0 - 当
%ax=%bx:减法结果为0,ZF=1 - 当
%ax<%bx:减法需要借位,CF=1
- 当
ja指令的触发条件:ja是无符号数比较专用的跳转指令,全称Jump if Above,跳转触发条件为CF == 0 且 ZF == 0,正好对应%ax无符号值大于%bx的场景。
内容的提问来源于stack exchange,提问作者Bataata
相关产品推荐
相关产品推荐

