内存引用汇编语言

时间:2014-06-09 18:29:27

标签: assembly x86 nasm addressing-mode

我是汇编语言的初学者我直到现在才理解很多东西但很多天我陷入了困境,这让我感到困惑,最糟糕的是,通过互联网访问的很多页面信息再次被扭曲,这个section是寻址模式,特别是内存参考,例如在此Addressing Modes in Assembly Language (IA-32 NASM)

两条说明似乎相同,但评论不同

  1. mov esi,var :将var的地址(例如0x0040120e)复制到esi
  2. mov dword [eax],var1 :将var1中的复制到内存插槽中
    由eax指定
  3. 这两个指令都处理var或var1这些是标签,但在注释中它提到的是复制内容,而另一个则复制地址。

    所以另一个问题我会问这个指令会有什么用呢:

    • mov bx,[var]

    这些指令之间的差异也是什么

    • mov [var],bx - 如果var是一个数组,如果不是与下一条指令有什么区别,那么这只是一个应用程序
    • mov var,bx
    • lea eax,[var] - var中的值放在EAX中。here it's mean value
    • LEA EBX,[MY_TABLE] here its mean effective address

    所以我需要知道有什么不同,是否有一个我可以阅读的信心源,并确保它是正确的,顺便说一下,我使用这个tutorial和NASM作为Windows下的汇编程序。

1 个答案:

答案 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的地址位于eaxLEA表示加载有效地址。你给它一个内存操作数的方式就像你要访问内存一样,但是不是那个地址的值你得到了地址本身。

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


  

LEA EBX, [MY_TABLE]此处为平均有效地址

是。这与前一个例子没有区别。