汇编语言寻址模式(IA

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

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

    我的问题:

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

  • 在NASM语法中,该指令应该是MOV EBX, MY_TABLEMOV EBX, [MY_TABLE]要做的是将位于MY_TABLE的前4个字节MY_TABLEEBX 。 另一种选择是使用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会将地址放入寄存器中。

    链接地址: http://www.djcxy.com/p/89843.html

    上一篇: Addressing Modes in Assembly Language (IA

    下一篇: Error when trying to connect a web service with a database