汇编语言:+ vs add

问题描述:

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

mov eax,[ebx+ecx] 

是否相当于以下?

add ebx,ecx 
mov eax,[ebx] 

(忽略EBX的内容的变化)

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

希望你会继续在你自己的时间学习程序集,我还建议学习其他指令集(ARM,thumb,mips,msp430,avr等)。您经常会看到这些折衷,有时您特别想要添加而不破坏寄存器并且不修改标志。有时候你想要或者需要寄存器偏移地址来使代码更快或者更清洁,比如在每个循环中必须使用一个寄存器和每个引用的额外指令。由于知道许多处理器具有寄存器偏移量寻址功能,如果您对性能感兴趣,例如通用和特定目标都可以编写高级代码以利用这些优势。

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

更新:我刚刚看到了关于忽略更改的最后一句话......如果您想忽略这一点,那么是的,我相信这两个片段是等效的。

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