Gast
#4754278
Hallo! Ich versuche mich gerade mit x86-Assembler auf einem 8086 (bare metal chip; kein PC mit BIOS, sondern der nackte 8086). Ich habe an Adresse 0xC0000 - 0xFFFFF mein ROM (2 MBit/ 128k x 16). Nun beginnt der 8086 nach einem Reset an Adresse 0xFFFF0 den Code ausführen. Ich habe als erstes ein simples Programm geschrieben, welches einen Wert an I/O-Adresse 0 ausgibt (dort habe ich ein Latch mit 8 LEDs): <code> .intel_syntax .code16 .globl _start _start: cli movb %al, 0xaa mov %dx, 0x0 outb %dx, %al </code> Wenn ich das jetzt übersetze mit <code> as -32 -o test.o test.s ld -m elf_i386 --oformat binary test.o -o test.bin </code> dann kommt folgendes heraus: <code> hexdump test.bin 0000000 b0fa baaa 0000 f4ee 0000008 </code> Wenn ich das jetzt manuell in der EPROM-Programmiersoftware an die Adresse 3FFF0 (da das EPROM bei C0000 beginnt ist die Adresse im System dann 0xFFFF0) kopiere und das EPROM brenne, dann funktioniert es wie gedacht und die CPU schreibt 0xaa an I/O-Adresse 0. Nun habe ich am Reset-Vektor 0xFFFF0 nur noch 16 Bytes bis zum Ende des ROMs Platz. Daher würde ich gerne von da zum Anfang des ROM springen. Wie bekomme ich meine Assembler-Datei hin, so dass das Ergebnis (Binärdatei) so groß wie das ROM wird (256kB), der Code bei 0xC0000 beginnt und ich bei 0xFFFF0 einem jmp zu einem Label am Anfang meines Codes habe? Ich habe folgendes probiert: <code> .intel_syntax .code16 .org 0xc0000 .section .text .globl _start _start: cli movb %al, 0xaa mov %dx, 0x0 outb %dx, %al hlt .org 0xffff0 jmp _start .org 0xfffff .byte 0 </code> Dann wird aber das Object-File und das gelinkte Binary 1MiB groß...