【发布时间】:2018-09-11 00:38:27
【问题描述】:
汇编器有这样的代码:
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 。
【问题讨论】:
-
这些样本 eax 值是十六进制还是十进制?
-
ja将在 CF 和 ZF 为 0 时跳转,而不是“如果 C = 1 或 Z = 1”。第一行确实减去 0x22(十六进制)= 34 十进制,所以你的测试值是什么格式的? 28 还是 0x28?使用 0x28(十进制 40)-> eax = 6 (0x28 - 0x22),cmp $7,%eax将设置 CF=1,ZF=0,跳转将被忽略。 -
可能会添加输入值范围的描述,当您期望跳转时,何时不跳转,以便可以向您显示正确的代码,您当前的代码不会跳转到 eax 值的“某个地址”从范围 0x22 (34) .. 0x29 (41)。其他一切都会跳跃。该代码看起来像常见的惯用方式,如何将 eax 限制在某个值范围内并将其标准化为最小值,即经常用于检查值是否为 ASCII 数字(将检查范围 0x30..0x39 并因此使用
sub $0x30,%eax@ 987654325@ja not_ascii_digit和这里eax包含值 0..9 取决于输入字符) -
感谢您的澄清!