7

このソースコードをWindowsでコンパイルしたい(これは単なる例です):

start:
NOP
NOP

NASMまたはFASMでコンパイルすると、出力ファイルの長さは2バイトになります。しかし、GNUアセンブラでコンパイルすると、出力ファイルの長さは292バイトになります。

GNUアセンブラ(as)を使用してアセンブリファイルを生のバイナリ(DOS .comなど)形式にコンパイルするにはどうすればよいですか?


なぜ私はこれをするのですか?

独自のシンプルなOSを作成したいので、Cを使用してコードを作成し(stdio.hやmath.hでもC標準ライブラリを使用せずに)、アセンブリに変換します。

gcc -S my_os.c -o my_os.asm -masm=intel

次に、アセンブリファイルを生のバイナリにコンパイルします。

as my_os.asm

次に、名前をa.out(アセンブラーの出力)に変更しmy_os.flp、最後にVMWareでOSを起動します:)

4

3 に答える 3

7

ld --oformat binary

迅速で汚いテストのためにあなたはすることができます:

as -o a.o a.S
ld --oformat binary -o a.out a.o
hd a.out

与える:

00000000  90 90                                             |..|
00000002

残念ながら、これは警告を出します:

ld: warning: cannot find entry symbol _start; defaulting to 0000000000400000

これは、ではあまり意味がありませんbinary。それは次のように沈黙させることができます:

.section .text
.globl start
start:
nop
nop

と:

ld -e start --oformat binary -o a.out a.o

または単に:

ld -e 0 --oformat binary -o a.out a.o

これはld、エントリポイントが_startアドレスのコードではないことを示しています0

stdin/stdoutからinput/ouptutを取得することも、取得することasもできないので、配管がないのは残念です。ld

適切なブートセクター

もっと深刻なことに取り組む場合、最善の方法は、クリーンで最小限のリンカースクリプトを生成することです。linker.ld

SECTIONS
{
    . = 0x7c00;
    .text :
    {
        *(.*)
        . = 0x1FE;
        SHORT(0xAA55)
    }
}

ここでは、リンカースクリプトを使用してマジックバイトも配置します。

リンカスクリプトは、再配置後に出力アドレスを制御するために何よりも重要です。再配置の詳細については、https ://stackoverflow.com/a/30507725/895245をご覧ください。

次のように使用します。

as -o a.o a.S
ld --oformat binary -o a.img -T linker.ld a.o

そして、次のように起動できます。

qemu-system-i386 -hda a.img

このリポジトリでの実例:https ://github.com/cirosantilli/x86-bare-metal-examples/blob/d217b180be4220a0b4a453f31275d38e697a99e0/Makefile

Binutils 2.24、Ubuntu14.04でテスト済み。

于 2015-08-26T21:32:26.850 に答える
0

-f binアセンブリコードを生のバイナリファイルにコンパイルするオプションを指定してNASMを使用します。

于 2011-12-12T23:36:26.383 に答える
0
org 100h
nop
nop

fasmを使用してコンパイルできます。

fasm yourcode.asm targetfilename.com
于 2018-06-22T17:57:58.957 に答える