我有一些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
我发布了一个(希望)更清晰的问题版本。关闭这个。
答案 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)
I brought this issue up。这似乎是一个错误。 It was suggested that I file a bug report和I've done so。
已将fix签入binutils树。