2017-08-26 63 views
0

我很新装配,现在我试图了解cmp如何工作。下面要说的写在wiki了解cmp指令

cmp arg2, arg1 

执行ARG1和ARG2之间的比较操作。比较 通过从arg1(有符号)减去arg2来执行,结果 可以被称为Temp。 温度然后被丢弃

这是什么意思“Temp然后被丢弃”?它存储在哪里?我怎样才能访问这个比较结果?有人可以解释吗?

+0

@Carcigenicate * ax? Cos AFAIK通常与'je'搭配使用。但是je需要知道条件是真是假。 –

+1

请注意,您指的是* wikibooks *,它是* wikis *的特定集合。 A * wiki *只是用户可以编辑的一种网站。因此,Wikibooks绝对不是x86组装定义的主要资源(这是一个很好的例子,为什么依赖专家文档比用户生成的文档更好)。使用谷歌找到另一个来源,并解释! –

+1

'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

回答

4

cmp arg2, arg1执行与sub arg2, arg1相同的操作,除了没有任何操作数被修改。 不存储区别。

然而,标志寄存器更新,并且可以在一个条件跳转中使用,像跳如果相等(JE),最通常为cmp之后的下一指令。

与其他指令相比,您可以比较两个值而不会破坏它们中的任何一个。如果你做了sub arg2, arg1而他们碰巧是平等的,那么其中之一将会是零。随着cmp他们都在那里。