NASM到GAS:调用equ'd符号

时间:2011-07-26 13:04:53

标签: assembly nasm gas

我有一些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   

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

2 个答案:

答案 0 :(得分: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   

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

答案 1 :(得分:1)

binutils邮件列表上的

I brought this issue up。这似乎是一个错误。 It was suggested that I file a bug reportI've done so

已将fix签入binutils树。