/ / Perché l'uso di jmp impedisce all'assemblatore Clang di trovare un'espressione assoluta per .fill? - macos, assembly, x86, clang, bootloader

Perché l'uso di jmp impedisce all'assemblatore Clang di trovare un'espressione assoluta per .fill? - macos, assembly, x86, clang, bootloader

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 e 0xaa 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 sia 0x55 e 0xaa come i suoi ultimi due byte.

risposte:

0 per risposta № 1

Clang 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.