1

我是汇编语言的初学者,到目前为止我了解很多东西,但是很多天我都停留在一个部分,这让我感到困惑,最糟糕的是,通过我在互联网上访问的许多页面,信息再次被扭曲,这部分是寻址模式特别是内存引用,例如在汇编语言中的寻址模式(IA-32 NASM)中

两条指令似乎相同,但评论不同

  1. mov esi, var :将 var 的地址(比如 0x0040120e)复制到 esi
  2. mov dword [eax], var1 : 将 var1 中的复制到
    eax 指定的内存槽中

两条指令都处理 var 或 var1 ,它们是标签,但在评论中提到它是复制内容,而另一个是复制地址。

所以另一个问题我问这个指令的cooment是什么:

  • mov bx, [var]

以及这些指令之间的区别是什么

所以我需要知道有什么区别,是否有一个我可以从中读取的置信来源并确保它是正确的,顺便说一下我正在使用本教程,以及 NASM 作为 Windows 下的汇编程序。

4

1 回答 1

1

mov dword [eax], var1: 将 var1 中的值复制到指定的内存槽中eax

没有。如果var1是标签,这会将的地址 var1作为 32 位值存储到 指向的内存中eax。例如,如果var1is0x04000000和 eax 的地址包含,0x12345678那么这将写入0x04000000内存 at 0x12345678


这条指令的评论是什么:mov bx, [var]

; Move the word located at var into bx

(注意:汇编中的“移动”实际上意味着复制)


mov [var], bx如果var是数组,这是否仅适用于?如果不是,它有什么不同mov var, bx

汇编器并没有真正强制执行类型。你可以在任何地方存储任何东西(嗯,你的程序可以写入的任何地方)。因此,您声明var的内容在很大程度上无关紧要。可能有var所有汇编程序关心的代码(除非您真的知道自己在做什么,否则这可能不是一个好主意)。

不同之处mov var,bx在于这mov var,bx不是一个有效的指令。的地址var是立即数,所以这有点像说mov 5, bx,这显然行不通。


lea eax, [var]— 中的值var被放置在EAX

不会。的地址 var放在 中eaxLEA表示加载有效地址。你给它一个内存操作数,就像你要访问内存一样,但是你得到的是地址本身,而不是那个地址的值。

LEA也可用于执行一些简单的算术运算。例如,lea ebx,[eax*4 + eax]将计算eax*5并将结果放入ebx.


LEA EBX, [MY_TABLE] 这里是平均有效地址

是的。这个例子和前面的例子没有区别。

于 2014-06-09T18:48:29.933 回答