【问题标题】:NASM to GAS: Calling equ'd symbolsNASM 到 GAS:调用 equ'd 符号
【发布时间】:2011-10-13 09:53:06
【问题描述】:

我有一些 NASM 文件有一行:

%INCLUDE "bmdev.asm"

bmdev.asm 文件具有 equ 指令,例如:

b_print_newline         equ 0x0000000000100040

包含bmdev.asm 的文件可以调用这些项目。即

call b_print_newline

有没有办法将其转换为 GAS?当我尝试进行直接翻译时,即

.set b_print_newline , 0x100040

call b_print_string

它似乎没有分解到正确的东西:

callq  *0x100040

NASM 调用反汇编为:

callq  0xfffffffffff00040

这里的目标是通过 GAS 而不是 NASM 为 BareMetal OS 生成二进制文件。

有效的二进制文件的完整反汇编:

$ objdump -D -b binary -m i386:x86-64 test-nl.app 

test-nl.app:     file format binary


Disassembly of section .data:

0000000000000000 <.data>:
   0:   e8 3b 00 f0 ff          callq  0xfffffffffff00040
   5:   c3                      retq   

完全反汇编不起作用的二进制文件:

$ objdump -D -b binary -m i386:x86-64 test-nl-a.app 

test-nl-a.app:     file format binary


Disassembly of section .data:

0000000000000000 <.data>:
   0:   ff 14 25 40 00 10 00    callq  *0x100040
   7:   c3                      retq   

我已经发布了这个问题的(希望是)更清晰的版本。关闭这个。

【问题讨论】:

  • 如果你能显示它们组装成的字节(十六进制)可能会有所帮助。
  • @user786653 我用完整的反汇编信息更新了这个问题。
  • 它对我来说工作正常(在我将 b_print_string 更改为 0x100040 之后)。 call b_print_string 生成正确的二进制文件,但 call *b_print_string 生成错误的二进制文件。也许它不在代码中,而是在编译时的参数中?
  • 我更新了问题,使其更加一致。第一部分提到了 b_print_string,后来我使用了 b_print_newline。我将所有内容都更新为 b_print_newline。问题基本相同。
  • @ughoavgfhw 我正在使用以下内容进行组装和链接:as -o test-nl-a.o test-nl-a.s &amp;&amp; ld -Ttext 200000 --oformat binary -o test-nl-a.app test-nl-a.o

标签: assembly nasm gnu-assembler


【解决方案1】:

让 AS 产生相对调用如此困难,这似乎有点奇怪,也许更聪明的人可以加入。

不管怎样,做:

.set b_print_newline, 0x100040
call b_print_newline

导致(如您所见)AS 产生间接跳转。

您可以使用. (dot) 伪变量自行伪造它:

call b_print_newline - .

或者您可以使用链接器(命令行或脚本)来定义具有正确名称的符号,在这种情况下,代码会按照您的意愿进行编译。

$ cat test.S
.section .text
.globl _start
_start:
    call b_print_newline
    ret
$ as --64 -o test.o test.S
$ ld --defsym b_print_newline=0x100040 -Ttext 200000 --oformat binary -o test.bin test.o
$ objdump -D -b binary -m i386:x86-64 test.bin
test.bin:     file format binary

Disassembly of section .data:

0000000000000000 <.data>:
   0:   e8 3b 00 f0 ff          callq  0xfffffffffff00040
   5:   c3                      retq   

可能有一种方法可以在不使用链接器定义符号的情况下使其工作,但我一直无法找到方法。

【讨论】:

  • 像往常一样的好技巧。谢谢@user786653!
【解决方案2】:

I brought this issue up 在 binutils 邮件列表中。这似乎是一个错误。 It was suggested that I file a bug reportI've done so

fix 已签入 binutils 树。

【讨论】:

  • 很高兴您得到了答复。这也解释了为什么我无法让它工作:)
猜你喜欢
  • 2011-10-13
  • 2015-01-13
  • 2023-03-30
  • 2016-01-24
  • 2015-01-31
  • 2012-11-27
相关资源
最近更新 更多