了解cmp指令
问题描述:
答
cmp arg2, arg1
执行与sub arg2, arg1
相同的操作,除了没有任何操作数被修改。 不存储区别。
然而,标志寄存器是更新,并且可以在一个条件跳转中使用,像跳如果相等(JE
),最通常为cmp
之后的下一指令。
与其他指令相比,您可以比较两个值而不会破坏它们中的任何一个。如果你做了sub arg2, arg1
而他们碰巧是平等的,那么其中之一将会是零。随着cmp
他们都在那里。
@Carcigenicate * ax? Cos AFAIK通常与'je'搭配使用。但是je需要知道条件是真是假。 –
请注意,您指的是* wikibooks *,它是* wikis *的特定集合。 A * wiki *只是用户可以编辑的一种网站。因此,Wikibooks绝对不是x86组装定义的主要资源(这是一个很好的例子,为什么依赖专家文档比用户生成的文档更好)。使用谷歌找到另一个来源,并解释! –
'je'不需要知道条件是真还是假,'je'是'jz'的别名,'jz'是'如果设置了零标记则跳转'。所以无论最后一条指令是否修改ZF,都会预测下一个“je”是否会跳转(ZF = 1)或不是(ZF = 0)。新的asm程序员没有得到它的有趣后果之一是编写像'sub ax,1''cmp ax,0''jne myLoop'这样的代码......在那里不需要'cmp',已经以足够的方式为该jne工作设置了ZF(但更合理的是使用'jnz myLoop'别名,即读作“jump not zero loop” - 几乎是英语。 – Ped7g