gpt4 book ai didi

assembly - 汇编语言中的寻址模式 (IA-32 NASM)

转载 作者:行者123 更新时间:2023-12-02 17:11:04 27 4
gpt4 key购买 nike

由于这方面的网络资源很少,为了将来的搜索,我将首先列出 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指定的内存槽中

请注意,以上内容适用于 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]?

最佳答案

  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

关于assembly - 汇编语言中的寻址模式 (IA-32 NASM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20608930/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com