【发布时间】:2022-02-09 14:18:18
【问题描述】:
我对组装很陌生,现在我正试图了解cmp 的工作原理。这是wiki中写的内容:
cmp arg2, arg1
在 arg1 和 arg2 之间执行比较操作。比较 通过从 arg1 中减去 arg2 来执行(有符号),结果 其中可以称为Temp。 Temp 然后被丢弃。
“Temp is then discarded”是什么意思?它存储在哪里?如何访问此比较结果?谁能解释一下?
【问题讨论】:
-
@Carcigenicate *ax?因为 AFAIK,它经常与
je一起使用。但是 je 需要知道条件是真还是假。 -
请注意,您指的是 wikibooks,它是 wikis 的特定集合。 wiki 只是一种用户可以编辑的网站。因此,wikibooks 绝对不是 x86 程序集定义的主要资源(这是一个很好的例子,为什么有时依赖专家文档而不是用户生成的文档更好)。使用谷歌寻找另一个来源,并解释它!
-
je不需要知道条件是真还是假,je是jz的别名,jz是“如果设置了零标志则跳转”。因此,无论最后一条指令是否修改了 ZF,该指令都会预测下一个je是否会跳转(ZF=1)或不跳转(ZF=0)。新的 asm 程序员没有得到它的有趣后果之一是编写像sub ax,1cmp ax,0jne myLoop... 这样的代码,那里不需要cmp,因为之前的sub已经将 ZF 设置为足够的jne工作的方式(但更合乎逻辑的是使用jnz myLoop别名,即读作“跳转非零循环” - 几乎是英语。 -
“比较是通过(有符号的)减法执行的”——用 2 的补数进行减法既不是有符号的也不是无符号的,两者都是完全相同的操作。
jz/je和jnz/jne也不关心比较是有符号还是无符号。但是,其他 x86 比较条件分支确实需要指定为有符号或无符号。有符号的称为“jump if (not) less/less-or-equal/greater/greater-or-equal”,给出指令jl、jg等。无符号比较条件称为“jump if (not) ) 下方/上方/等”、jb、ja等
标签: assembly x86 comparison