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

Using ".intel_syntax noprefix" how can I get memory address of a label?

我正在学习如何创建实模式程序汇编和链接:

我使用不带 .intel_syntax noprefix

指定前缀的 Intel 语法

我想将一个字符串的地址加载到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.[= 的指令17=]

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

如果您使用 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,还有一些蔑视,但不是官方的。