汇编语言:+ vs add

时间:2010-12-16 09:13:08

标签: assembly x86

我是一名大学生,在我自己的时间学习汇编语言。我注意到虽然有像add和mul这样的指令,但算术运算符经常在指令中使用。例如:

mov eax,[ebx+ecx]

以下是等同于吗?

add ebx,ecx
mov eax,[ebx]

(忽略ebx内容的变化)

3 个答案:

答案 0 :(得分:3)

...几乎 这种索引地址方法([ebx + ecx]或任何其他方法)通常用于寻址某些数组或记录中的元素。在您的情况下, ebx 可以是指向字节数组的指针, ecx 是索引。使用索引寻址可能很危险,因为算术运算后没有被激活的标志,因此我们无法检查数组范围溢出。调试模式下的Normaly高级编译器使用clasic slow方法,因此我们能够检测到数组范围溢出。当我们将编译器切换到relase模式(并且我们确定没有更多可能的错误)时,正在使用更快的索引寻址方法。

答案 1 :(得分:2)

不,它不等同。如果这是真实的代码,那么括号内的东西就是addressing mode的一个例子。寻址模式控制如何计算操作的有效地址,但通常不具有持久效果。您的第二个代码段实际上会添加到ebx寄存器中,并根据以下任何说明更改其内容。

更新:我刚刚看到你关于忽略变化的最后一句......如果你想忽略它,那么是的,我相信这两个片段是等价的。

答案 2 :(得分:1)

就从内存中读取内容而言,它们在功能上是相同的。已经提到的差异,当严格用于寄存器偏移量寻址[ebx + ecx]时,你不要修改标志,并修改ebx并销毁你的基地址。您还消耗了两倍的指令,两倍的读取次数。 x86是可变指令长度,这并不意味着两倍于指令的字节数,但它确实意味着更多的时钟周期和更多的缓存空间用于执行相同的任务。

希望你能继续按照自己的时间学习装配,我也建议学习其他指令集(ARM,thumb,mips,msp430,avr等)。您经常会看到这些权衡,有时您特别希望在不破坏寄存器且不修改标志的情况下进行添加。有时您需要或需要寄存器偏移量寻址,以使代码更快或更清晰,例如,必须为每个循环使用寄存器和每个引用的额外指令。知道许多处理器具有寄存器偏移量寻址,如果您对性能感兴趣,例如通用性和目标特定性,您可以编写高级代码以利用这些内容。