10

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

  • GCC 汇编器版本 2.25
  • Binutils 2.25 版
  • GCC 版本 5.2.0

我使用没有指定前缀的 Intel 语法.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使用无前缀的英特尔语法将符号的地址加载到寄存器中?

4

1 回答 1

11

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

.intel_syntax noprefix

然后语法可能看起来有点不寻常,并且在规范来源中没有很好的记录。这段代码:

mov si, name

将label 指向的内存位置的 16 位WORDname移动到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请在评论中告诉我。我知道有关语法的博客,以及一些蔑视,但没有任何官方。

于 2016-04-27T19:40:43.820 回答