25

我有一些通常具有以下结构的 NASM 文件:

        [BITS 64]
        [ORG 0x0000000000200000]

start:
        ...

        ret

我像这样组装它们:

nasm -f bin abc.asm

我想用 GAS 来写其中的一些。两个问题:

  • 我应该在 GAS 中使用哪些指令?我找到了“.org”指令,但 GAS 似乎没有“.bits”指令。

  • 我应该传递什么gccas生成一个普通的二进制文件?即该-f bin选项对 NASM 的作用。

4

2 回答 2

21

我应该在 GAS 中使用哪些指令?我找到了“.org”指令,但 GAS 似乎没有“.bits”指令。

汇编器对我来说默认为 64 位,您可以使用--32--64在命令行上选择。查看手册了解如何在需要时更改代码内部的体系结构(例如.code16,可用于为引导加载程序生成实模式代码)。

您很可能不想使用.org指令来指定代码的位置,但可能希望使用链接脚本或指定文本和数据段在命令行上的加载位置。(org 0x0000000000200000导致 2+ MB 的二进制文件)。

我应该将什么传递给 gcc 或生成一个普通的二进制文件?即 -f bin 选项对 NASM 的作用。

$ cat test.S
.section .text
.globl _start
_start:
        xor %rax, %rax
        mov test, %rax
        ret

test: .quad 0x1234567812345678


$ as --64 -o test.o test.S
$ ld -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: 48 31 c0 xor %rax,%rax 3: 48 8b 04 25 0c 00 20 mov 0x20000c,%rax a: 00 b: c3 retq
c: 78 56 js 0x64 e: 34 12 xor $0x12,%al 10: 78 56 js 0x68 12: 34 12 xor $0x12,%al

于 2011-07-26T11:13:22.953 回答
8

objcopy -O binary

一个不错的选择是:

as -o test.o test.S
ld -Ttext 0x7C00 -o test.elf test.o
objcopy -O binary kernel.elf kernel.bin

优势ld --oformat binary在于更容易通过以下方式使用符号进行调试:

qemu-system-i386 -hda main.img -S -s &
gdb main.elf -ex 'target remote localhost:1234'

另请参阅:https ://stackoverflow.com/a/32960272/895245

链接器脚本

-Ttext适合快速和肮脏的测试,但对于严肃的工作,您应该使用脚本来增加健壮性。

否则,ld将使用一个用于用户空间应用程序的默认脚本 ( ld --verbose),它看起来不像您的应用程序。

没有更多信息,我可以给出的最小脚本是:

SECTIONS
{
    . = 2M;
    .text :
    {
        *(.*)
    }
}

然后使用它-T

as --64 -o test.o test.S
ld -T linker.ld --oformat binary -o test.bin test.o

但是您可能希望根据您的确切应用程序修改该脚本。

另请参阅:有没有办法让 gcc 输出原始二进制文件?

我有一个存储库,其中包含一些常见用例的工作示例:

于 2015-09-15T20:21:10.507 回答