汇编语言寻址模式(IA
由于这方面的网络资源很少,为了以后的搜索,我将首先列出IA-32汇编语言(NASM)的地址模式,然后跟进一个简短的问题。
请注意,以上是针对NASM的。 对于MASM / TASM,您将使用“mov esi,OFFSET foo”来获取地址,而“mov esi,foo”和“mov esi,[foo]”都会获得该值(声称为@Michael)。
所以,在我的问题上。 它与以下教程第29页底部的示例相关:http://www.tutorialspoint.com/assembly_programming/assembly_tutorial.pdf
它基本上列出了下面的代码作为间接内存寻址的一个例子。
MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110 ; MY_TABLE[0] = 110
ADD EBX, 2 ; EBX = EBX +2
MOV [EBX], 123 ; MY_TABLE[1] = 123
我的问题:
在NASM语法中,该指令应该是MOV EBX, MY_TABLE
。 MOV EBX, [MY_TABLE]
要做的是将位于MY_TABLE
的前4个字节MY_TABLE
到EBX
。 另一种选择是使用LEA
,如LEA EBX, [MY_TABLE]
。
在这种情况下,教程是正确的。 MY_TABLE
被定义为一个单词数组。 x86上的单词是2个字节,所以MY_TABLE
的第二个元素的确位于MY_TABLE + 2
。
该教程甚至不是有效的NASM代码。 有关不支持x86引导程序/资源/手册的链接,请参阅SO上的x86标记wiki。
MOV [EBX], 110
将不会组装,因为操作数都不意味着操作数大小。 (我想即使MASM也不会装配它,但是像emu8086这样的一些不好的汇编程序有这样的指令的缺省操作数大小。) mov word [ebx], 110
会做16位存储。
MOV EBX, [MY_TABLE]
将进行汇编,但会从表中加载前两个单词。 mov ebx, MY_TABLE
会将地址放入寄存器中。
上一篇: Addressing Modes in Assembly Language (IA
下一篇: Error when trying to connect a web service with a database