【问题标题】:Using ".intel_syntax noprefix" how can I get memory address of a label?使用“.intel_syntax noprefix”如何获取标签的内存地址?
【发布时间】:2023-03-20 07:45:01
【问题描述】:

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

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

【问题讨论】:

  • 事后我发现了一个相关的问题,Stackoverflow answer 是相似的。根据不同的观点,这个问题可能会被认为是重复的。

标签: assembly x86 gnu-assembler real-mode intel-syntax


【解决方案1】:

如果您使用带有指令的 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

如果有人有一个 canonical 来源,它实际上描述了可以与.intel_syntax noprefix 一起使用的语法,请在 cmets 中告诉我。我知道blogs about the syntax,还有一些蔑视,但没有官方的。

【讨论】:

  • 我还没有看到任何带有.intel_syntax 源文件的开源项目。项目通常选择 AT&T 语法,或者使用 NASM 或 YASM。不过,我想不出/记得为什么 GNU .intel_syntax 不太好的任何具体原因。例如我不认为你可以在 AT&T 语法中做任何你不能在intel_syntax 中做的事情,或者额外的歧义。 (对我来说缺点是它类似于 MASM 语法,而我更喜欢 NASM 语法,其中所有有效地址都需要[]。)
  • @PeterCordes :我同意,而且这种语法不是我经常看到的——我知道其中的一些歧义,但这绝对是我缺乏第一手经验的一个领域。如果我使用 GAS,我通常会满足于 AT&T 语法,如果我想要 Intel,我会使用 NASM、YASM 等。如果你被 GAS 卡住而别无选择并且不习惯 AT&T 语法,那么我猜这可能在这里成为一个用例。想象一下当我找不到完整语法的规范源时我的失望。阅读 binutils 源代码太像工作了 ;-)
  • 是的,我希望它也会被正式记录在某个地方。不过,我并不完全感到震惊,但它似乎并非如此。对我来说,它是反汇编/编译器输出的主要读取格式,而不是写入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多