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

Posted

技术标签:

【中文标题】汇编语言中的寻址模式 (IA-32 NASM)【英文标题】:Addressing Modes in Assembly Language (IA-32 NASM) 【发布时间】:2014-01-03 17:25:51 【问题描述】:

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

我的问题:

    “MOV EBX, [MY_TABLE]”实际上不应该是“MOV EBX, MY_TABLE”,因为我们希望将表的地址放入 EBX,而不是值本身? 确定是 MY_TABLE[2] 最后等于 123,而不是 MY_TABLE[1]?

【问题讨论】:

网络资源稀少?! Intel manual 详细解释了这一切。 我进行了相当多的搜索,并认为找到一个包含简单示例的列表并不容易,特别是在第二个子项目符号中包含示例到第一个要点的列表。因此,如果其他人发现自己处于我的位置,或者对 NASM/MASM/TASM 在该主题上的区别感到困惑,他们可能会发现该摘要很有用。 另请参阅***.com/a/34058400/224132,了解寻址模式的概要。以及***.com/tags/x86/info中的其他链接 非常感谢!英特尔谈到了这个深度,但这个简单的解释对我帮助很大。 该教程不是有效的 NASM 代码。 MOV [EBX], 110 不会汇编,因为这两个操作数都不意味着操作数大小。 (我认为即使是 MASM 也不会组装它。) 【参考方案1】:

    在 NASM 语法中,该指令应为 MOV EBX, MY_TABLEMOV EBX, [MY_TABLE] 所做的是将位于 MY_TABLE 的前 4 个字节加载到 EBX 中。另一种选择是使用LEA,如LEA EBX, [MY_TABLE]

    在这种情况下,教程是正确的。 MY_TABLE 被定义为一个单词数组。 x86上的一个字是2个字节,所以MY_TABLE的第二个元素确实位于MY_TABLE + 2

【讨论】:

1.它是否加载前 4 个字节,因为 mov 指令总是在 IA-32 上复制 32 位?这是为什么? 2.啊,+2是不是增加了2个字节? 1.它加载 4 个字节,因为目标寄存器是 EBX,大小为 4 个字节。 2. 对。如果 MY_TABLE 位于地址 0,而您执行了 MOV EBX, [MY_TABLE+2],则您将从地址 2 开始读取 DWORD。没有像 C 中那样隐式缩放偏移量。 但是,如果你在 pdf 教程的同一页面上向上滚动,它会说 word_table+3 也给出了元素 4。那不对吗? 是的,WORD_TABLE+3 不会得到WORD_TABLE 的第四个元素。 你能看看这个吗? ***.com/questions/29708532/…【参考方案2】:

该教程甚至不是有效的 NASM 代码。对于糟糕的 x86 指南/资源/手册的链接,请参阅 SO 上的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 会将地址放入寄存器中。

【讨论】:

以上是关于汇编语言中的寻址模式 (IA-32 NASM)的主要内容,如果未能解决你的问题,请参考以下文章

X86-64 汇编学习1

X86-64 汇编学习1

汇编语言指令寻址

知识索引汇编语言

知识索引汇编语言

知识索引汇编语言