由于网络资源稀少,为了将来的搜索,我将首先列出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
我的问题:
答案 0 :(得分:6)
在NASM语法中,该指令应为MOV EBX, MY_TABLE
。 MOV EBX, [MY_TABLE]
将执行的操作是将位于MY_TABLE
的前4个字节加载到EBX
。另一种方法是使用LEA
,如LEA EBX, [MY_TABLE]
。
在这种情况下,教程是正确的。 MY_TABLE
被定义为一个单词数组。 x86上的一个字是2个字节,因此MY_TABLE
的第二个元素确实位于MY_TABLE + 2
。
答案 1 :(得分:0)
该教程甚至不是有效的NASM代码。有关不吮吸的x86指南/资源/手册的链接,请参阅此处的the x86 tag wiki。
MOV [EBX], 110
将无法汇编,因为neither operand implies an operand-size。 (我认为即使是MASM也不会组装它,但是像emu8086这样的一些糟糕的汇编器对于这样的指令有一个默认的操作数大小。)mov word [ebx], 110
会做一个16位的存储。
MOV EBX, [MY_TABLE]
将汇编,但会从表中加载前2个字。 mov ebx, MY_TABLE
会将地址放入注册表中。