【发布时间】: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 && ld -Ttext 200000 --oformat binary -o test-nl-a.app test-nl-a.o
标签: assembly nasm gnu-assembler