3

我有一些 NASM 文件有一行:

%INCLUDE "bmdev.asm"

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

b_print_newline         equ 0x0000000000100040

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

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   

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

4

2 回答 2

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   

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

于 2011-07-27T12:44:30.850 回答
1

在 binutils 邮件列表中提出了这个问题。这似乎是一个错误。有人建议我提交错误报告并且我已经这样做了

已将修复程序签入到 binutils 树中。

于 2011-07-31T02:47:12.020 回答