我是汇编语言的初学者,直到现在我理解很多东西,但很多天我陷入了一个区域,这让我感到困惑,最糟糕的是,通过互联网访问的很多页面,信息再次被扭曲,这部分是 Addressing Modes 具体为 memory refrence 所以例如在Addressing Modes in Assembly Language (IA-32 NASM)中
两条说明似乎相同,但评论不同
-
mov esi, var :将var(例如0x0040120e)的 address 复制到esi中
-
mov dword [eax], var1 :将var1中的 value 复制到内存插槽中
由eax指定
这两个指令都处理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
所以我需要知道什么是差异,是否有一个我可以阅读的信心源,并确保它's correct,by the way i'使用这个tutorial,并且NASM作为Windows下的汇编程序 .
1 回答
不 . 如果
var1
是标签,则会将var1
的地址作为32位值存储到eax
指向的内存中 . 例如,如果var1
的地址是0x04000000
且eax包含0x12345678
,那么这将在0x12345678
处将0x04000000
写入内存 .(注意:汇编中的"move"真的意味着复制)
汇编程序并未真正强制执行类型 . 您可以在任何地方存储任何内容(以及允许您的程序写入的任何位置) . 所以你宣称
var
在很大程度上是无关紧要的 . 对于所有汇编程序的关注,可能存在位于var
的代码(除非您真的知道自己在做什么,否则这可能不是一个好主意) .与
mov var,bx
的区别在于mov var,bx
不是有效指令 .var
的地址是立即的,所以这有点像说mov 5, bx
,这显然不起作用 .不可以.
var
的地址位于eax
.LEA
表示加载有效地址 . 你给它一个内存操作数的方式与你要访问内存的方式相同,但是不是那个地址的值就可以获得地址本身 .LEA
也可用于执行一些简单的算术运算 . 例如,lea ebx,[eax*4 + eax]
将计算eax*5
并将结果放在ebx
中 .是 . 这与前一个例子没有区别 .