我是汇编语言的初学者我直到现在才理解很多东西但很多天我陷入了困境,这让我感到困惑,最糟糕的是,通过互联网访问的很多页面信息再次被扭曲,这个section是寻址模式,特别是内存参考,例如在此Addressing Modes in Assembly Language (IA-32 NASM)
两条说明似乎相同,但评论不同
这两个指令都处理var或var1这些是标签,但在注释中它提到的是复制内容,而另一个则复制地址。
所以另一个问题我会问这个指令会有什么用呢:
这些指令之间的差异也是什么
所以我需要知道有什么不同,是否有一个我可以阅读的信心源,并确保它是正确的,顺便说一下,我使用这个tutorial和NASM作为Windows下的汇编程序。
答案 0 :(得分:1)
指定的内存插槽中
mov dword [eax], var1
:将var1中的值复制到eax
不。如果var1
是标签,则会将 var1
的地址作为32位值存储到eax
指向的内存中。例如,如果var1
的地址为0x04000000
且eax包含0x12345678
,那么这会将0x04000000
写入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
的地址位于eax
。 LEA
表示加载有效地址。你给它一个内存操作数的方式就像你要访问内存一样,但是不是那个地址的值你得到了地址本身。
LEA
也可用于执行一些简单的算术运算。例如,lea ebx,[eax*4 + eax]
会计算eax*5
并将结果放入ebx
。
LEA EBX, [MY_TABLE]
此处为平均有效地址
是。这与前一个例子没有区别。