Sto scherzando con la scrittura di un semplice boot loader giocattolo (informazioni aggiuntive in fondo al post) nasm
codice mostra come appariva il bootloader a un certo punto prima che provassi a passare a Clang. Quando compilato usando nasm -f bin -o nasm.out boot.asm
, quindi eseguire utilizzando qemu-system-i386 nasm.out
, stampa un flusso infinito di !
personaggi sullo schermo:
bits 16
global main
main:
mov ah, 0x0e
mov al, "!"
int 0x10
jmp main
times 510 - ($ - $$) db 0x00
db 0x55
db 0xaa
Ero curioso di usare Clang come mio assemblatore invece del nasmo, quindi ho provato a tradurre il programma in quello che penso sia l'equivalente della sintassi GAS:
.code16
.global main
main:
mov $0x0e, %ah
mov $"!", %al
int $0x10
jmp main
.fill 510 - (. - main)
.byte 0x55
.byte 0xaa
Tuttavia, quando compilato usando /usr/local/opt/llvm/bin/clang --target=i386-elf -m16 -c boot.s -o boot.o
, Ottengo il seguente errore:
boot.s:9:7: error: expected absolute expression
.fill 510 - (. - main)
^
La compilazione ha successo se jmp main
è sostituito con jmp *0x00
o un non-jmp
istruzioni. Non è strettamente equivalente, ma sembra indicare qualcosa sull'etichetta che sta dando problemi a Clang.
nasm
Non ho avuto problemi a capire quanti byte usare per il padding Perché Clang balk quando gli chiedo di fare lo stesso? C'è qualcosa di sottile (o ovvio) che mi è sfuggito?
Posso sempre calcolare manualmente quanti byte di padding mi servono, ma è noioso e soggetto a errori e sembra che l'assemblatore dovrebbe essere in grado di fare da solo.
Sto eseguendo Clang 4.0, installato tramite Homebrew, su macOS 10.12.6.
- Aggiornamento rapido del bootloader, se necessario: il settore di avvio ha una lunghezza di 512 byte e deve avere i valori
0x55
e0xaa
con offset 510 e 511, rispettivamente. Il modo più semplice per garantire ciò è assicurarsi che l'output binario sia lungo esattamente 512 byte e lo sia0x55
e0xaa
come i suoi ultimi due byte.
risposte:
0 per risposta № 1Clang ha il suo assemblatore che non capisce tutta la sintassi dell'assemblatore GNU, cerca invece di assemblare con l'assemblatore GNU, cioè usando as --32 -o boot.o boot.s
, quindi dovrebbe funzionare.