Assembly 进位标志比较,什么时候设置进位标志?

Assembly 进位标志比较,什么时候设置进位标志?,assembly,x86,att,Assembly,X86,Att,汇编程序具有以下代码: sub$0x22,%eax # %eax = %eax - 22 cmp$0x7,%eax # %eax > 7 then jump *this is where I have trouble* ja some address # jump if C = 1 or Z = 1 我的目标是不跳。 我尝试过%eax=30,14,28,16,0,22的情况 问题: 我不明白为什么在我试过的所有案例中c=0和z=0 0x22是34位小数,大于假定为小数的所有样本eax值

汇编程序具有以下代码:

sub$0x22,%eax # %eax = %eax - 22
cmp$0x7,%eax  # %eax > 7 then jump *this is where I have trouble*
ja some address # jump if C = 1 or Z = 1
我的目标是不跳。 我尝试过%eax=30,14,28,16,0,22的情况

问题: 我不明白为什么在我试过的所有案例中c=0和z=0

0x22是34位小数,大于假定为小数的所有样本eax值。因此,减法的结果为负。但是负整数只是一个整数,其中最高有效位是1,也可以解释为一个大的无符号数


根据ja在概念上的含义,而不是标志上的实际逻辑,可能更容易理解ja。您可以将ja视为无符号比较。所以这些负数看起来像是大于7的大数字。如果改用jg指令,它的行为应该更像您所期望的。可以将其视为有符号比较。

这些样本eax值是十六进制还是十进制?当CF和ZF为0时,ja将跳转,而不是当C=1或Z=1时。第一行用十进制减去0x22十六进制=34,那么测试值的格式是什么?28还是0x28?使用0x28 40 decimal->eax=6 0x28-0x22,cmp$7,%eax将设置CF=1,ZF=0,跳转将被忽略。可能会添加输入值范围的说明,当您期望跳转时,以及当您不期望跳转时,这样可以显示正确的代码,您当前的代码将不会跳转到范围0x22 34中eax值的某个地址。。0x2941。其他一切都会跳起来。代码看起来像是一种常见的惯用方法,如何将eax限制在特定的值范围内,并根据其最小值对其进行规范化,即,通常用于检查值是否为ASCII数字的代码将检查范围0x30..0x39,从而使用sub$0x30,%eax cmp$0x9,%eax ja不是ascii数字,此处eax包含值0..9,具体取决于输入图表感谢您的澄清!小心:JA基于CF,而不是SF。所以重要的是执行,而不是子结果的顶部。对于小的正输入,这些恰好是同一件事,但一般情况下并非如此。