如何使用GNU GAS汇编程序生成像nasm -f bin这样的普通二进制文件?

时间:2011-07-26 10:27:44

标签: assembly nasm gas

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

        [BITS 64]
        [ORG 0x0000000000200000]

start:
        ...

        ret

我正在这样组装它们:

nasm -f bin abc.asm

我想用GAS写一些这些。两个问题:

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

  • 我应该传递给gccas以生成纯二进制文件?即-f bin选项对NASM的作用。

2 个答案:

答案 0 :(得分:15)

  

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

汇编程序默认为64位,您可以使用--32--64在命令行上进行选择。查看as的手册,了解如何在需要时更改代码中的体系结构(例如,.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

答案 1 :(得分:5)

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

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

另请参阅:Is there a way to get gcc to output raw binary?

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