使用“.intel_syntax noprefix”如何获取标签的内存地址?

时间:2016-04-27 19:16:46

标签: assembly x86 gas real-mode intel-syntax

我正在学习如何创建组装和链接的实模式程序:

  • GCC汇编程序版本2.25
  • Binutils 2.25版本
  • GCC版本5.2.0

我使用的英特尔语法没有使用.intel_syntax noprefix

指定的前缀

我想将字符串的地址加载到 SI 寄存器中。我知道,如何引用 NASM 中的内存位置,但是当我在GNU汇编程序代码中执行相同操作时,它只将字符串的WORD移动到寄存器而不是标签的地址。

我的代码是:

.code16
.intel_syntax noprefix

mov cx, 11
mov si, name
mov di, 0x7E00
push di
rep cmpsb
pop di
je LOAD

当我使用GCC编译它时,我可以在调试器中看到处理器执行:

mov si, WORD ptr ds:0x7d2d

但我希望字符串的地址移入寄存器,而不是它指向的数据。

我还尝试在名称旁边加上方括号:

.code16
.intel_syntax noprefix

mov cx, 11
mov si, [name]
mov di, 0x7E00
push di
rep cmpsb
pop di
je LOAD

没有什么区别。

NASM 我知道这个汇编代码可以工作:

mov si, name

NASM 将生成将name的地址移动到寄存器 SI 中的指令。

我的问题:有没有办法强制 GCC 使用带有无前缀的英特尔语法将符号的地址加载到寄存器中?

1 个答案:

答案 0 :(得分:7)

如果您使用GNU汇编代码(通过 GCC )和指令:

.intel_syntax noprefix

然后语法似乎有点不寻常,并且在规范来源中没有详细记录。这段代码:

mov si, name

将标记name指向的内存位置的16位 WORD 移动到 SI 。以下说明执行相同的操作,但我更喜欢方括号[],因为代码的意图更清晰:

mov si, name              
mov si, [name]
mov si, word ptr [name]   # This is the same as two above in long form
                          #     The use of "word ptr" here is similar to MASM

要获取name的地址并将其放入注册表,您需要使用offset,如下所示:

mov si, offset name

如果有人的规范来源实际上描述了可以与.intel_syntax noprefix一起使用的语法,请在评论中告诉我。我知道blogs about the syntax,还有一些蔑视,但没有任何正式的。