8 Stimmen

Wie kompiliert man eine Assembler-Datei in ein rohes Binärformat (wie DOS .com) mit GNU Assembler (as)?

Ich möchte diesen Quellcode unter Windows kompilieren (dies ist nur ein Beispiel):

start:
NOP
NOP

Wenn ich es mit NASM oder FASM kompiliere, beträgt die Länge der Ausgabedatei 2 Byte. Aber wenn ich es mit GNU Assembler (as) kompiliere, ist die Ausgabedatei 292 Bytes lang!

Wie kompiliert man eine Assembler-Datei in ein rohes Binärformat (wie DOS .com) mit GNU Assembler (as)?


Warum ich das tue?

Ich möchte mein eigenes einfaches Betriebssystem schreiben, ich schreibe meine Codes in C (ohne irgendwelche C-Standardbibliotheken zu verwenden, sogar stdio.h oder math.h) und konvertiere sie in Assembler:

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

Dann kompiliere ich die Assemblierungsdatei in eine Rohbinärdatei:

as my_os.asm

Dann benenne ich um a.out (Ausgabe des Assemblers) nach my_os.flp und endlich mein Betriebssystem mit VMWare starten :)

7voto

ld --oformat binary

Für schnelle und schmutzige Tests können Sie das tun:

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

Gibt:

00000000  90 90                                             |..|
00000002

Leider gibt dies eine Warnung aus:

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

was nicht viel Sinn macht bei binary . Es könnte mit zum Schweigen gebracht werden:

.section .text
.globl start
start:
nop
nop

und:

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

oder einfach mit:

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

die besagt ld dass der Einstiegspunkt nicht _start aber der Code an der Adresse 0 .

Es ist eine Schande, dass weder as noch ld kann Eingaben / Ausgaben von stdin / stdout entgegennehmen, also kein Piping.

Ordnungsgemäßer Bootsektor

Wenn Sie etwas Ernsthafteres vorhaben, ist die beste Methode, ein sauberes minimales Linker-Skript zu erstellen. linker.ld :

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

Hier platzieren wir auch die magischen Bytes mit dem Linkerskript.

Das Linkerskript ist vor allem wichtig, um die Ausgabeadressen nach der Verschiebung zu kontrollieren. Erfahren Sie mehr über Relokation unter: https://stackoverflow.com/a/30507725/895245

Verwenden Sie es als:

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

Und dann können Sie als booten:

qemu-system-i386 -hda a.img

Arbeitsbeispiele in diesem Repository: https://github.com/cirosantilli/x86-bare-metal-examples/blob/d217b180be4220a0b4a453f31275d38e697a99e0/Makefile

Getestet auf Binutils 2.24, Ubuntu 14.04.

0voto

Alexey Frunze Punkte 59460

Verwenden Sie NASM mit dem -f bin um Ihren Assemblercode in eine Rohbinärdatei zu kompilieren.

0voto

sarkiroka Punkte 1380
org 100h
nop
nop

Sie können verwenden fasm zu kompilieren:

fasm yourcode.asm targetfilename.com

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X