25

一般的に次のような構造を持つ NASM ファイルがいくつかあります。

        [BITS 64]
        [ORG 0x0000000000200000]

start:
        ...

        ret

私はそれらを次のように組み立てています:

nasm -f bin abc.asm

代わりに GAS を使用してこれらのいくつかを書きたいと思います。2 つの質問:

  • GAS ではどのディレクティブを使用する必要がありますか? 「.org」ディレクティブは見つかりましたが、GAS には「.bits」ディレクティブがないようです。

  • プレーン バイナリ ファイルを生成するには、gcc何を渡す必要がありますか? asつまり、-f binオプションが NASM で行うことです。

4

2 に答える 2

21

GAS ではどのディレクティブを使用する必要がありますか? 「.org」ディレクティブは見つかりましたが、GAS には「.bits」ディレクティブがないようです。

アセンブラのデフォルトは 64 ビットです。コマンド ラインで--32orを使用して選択できます。必要に応じてコード内のアーキテクチャを変更する方法については、 as--64のマニュアルを参照してください (たとえば、ブート ローダーのリアル モード コードを生成するために使用できます)。.code16

.orgほとんどの場合、ディレクティブを使用してコードの場所を指定することは望ましくありませんが、リンク スクリプトを使用するか、コマンド ラインでテキスト セグメントとデータ セグメントをロードする場所を指定する必要があります。( org 0x00000000002000002 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 に答える