用汇编语言寻址模式(IA-32 NASM)

时间:2013-12-16 10:45:08

标签: assembly x86 nasm addressing-mode

由于网络资源稀少,为了将来的搜索,我将首先列出IA-32汇编语言(NASM)的地址模式,然后跟进一个简单的问题。

  1. 注册寻址
    • mov eax,ebx:将ebx中的内容复制到eax中
    • mov esi,var:将var的地址(比如0x0040120e)复制到esi中
  2. 立即寻址(第二个操作数是立即数)
    • mov bx,20:16位寄存器bx获得实际值20
  3. 直接内存寻址(通过指定地址直接从内存加载)
    • mov ax,[1000h]:从地址4096处的字节(十六进制为0x1000)将一个2字节对象加载到一个名为“ax”的16位寄存器中
    • mov [1000h],ax:地址1000h处的内存获取ax
    • 的值
  4. 直接偏移寻址(与3相同,仅使用算术来修改地址)
    • mov al,[byte_tbl + 2]
  5. 间接注册(使用寄存器中存储的地址访问内存)
    • mov ax,[di]:将di指定的内存地址的值复制到ax
    • mov dword [eax],var1:将var1中的值复制到eax指定的内存插槽中
  6. 请注意,以上内容适用于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 
    

    我的问题:

    1. 不应该“MOV EBX,[MY_TABLE]”实际上是“MOV EBX,MY_TABLE”,因为我们想把表的地址放在EBX中,而不是值本身?
    2. 肯定是MY_TABLE [2]最后等于123,而不是MY_TABLE [1]?

2 个答案:

答案 0 :(得分:6)

  1. 在NASM语法中,该指令应为MOV EBX, MY_TABLEMOV EBX, [MY_TABLE]将执行的操作是将位于MY_TABLE的前4个字节加载到EBX。另一种方法是使用LEA,如LEA EBX, [MY_TABLE]

  2. 在这种情况下,教程是正确的。 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会将地址放入注册表中。