Pomotám sa s písaním jednoduchého nakladača hračiek (ďalšie informácie v dolnej časti príspevku). Nasledujúci text nasm
kód ukazuje, ako vyzeral bootloader v jednom okamihu predtým, ako som sa pokúsil prejsť na Clang. Pri zostavovaní pomocou nasm -f bin -o nasm.out boot.asm
, potom spustite pomocou qemu-system-i386 nasm.out
, vytlačí nekonečný prúd !
znakov na obrazovku:
bits 16
global main
main:
mov ah, 0x0e
mov al, "!"
int 0x10
jmp main
times 510 - ($ - $$) db 0x00
db 0x55
db 0xaa
Bol som zvedavý, či môžem použiť Clang ako môj assembler namiesto nasm, a tak som skúsil preložiť program na to, čo si myslím, že je ekvivalentom syntaxe GAS:
.code16
.global main
main:
mov $0x0e, %ah
mov $"!", %al
int $0x10
jmp main
.fill 510 - (. - main)
.byte 0x55
.byte 0xaa
Pri kompilácii pomocou /usr/local/opt/llvm/bin/clang --target=i386-elf -m16 -c boot.s -o boot.o
, Mám nasledujúcu chybu:
boot.s:9:7: error: expected absolute expression
.fill 510 - (. - main)
^
Kompilácia je úspešná, ak jmp main
sa nahrádza jmp *0x00
alebo ne-jmp
poučenie. Nie je to úplne rovnocenné, ale zdá sa, že to smeruje k niečomu o značke, ktorá dáva Clangovi problémy.
nasm
nemal som žiadne problémy so zisťovaním, koľko bajtov sa má použiť na výplň. Prečo sa Clang bráni, keď ho o to požiadam? Existuje nejaká jemná (alebo zrejmá) vec, ktorá mi chýbala?
Vždy môžem manuálne zistiť, koľko bajtov výplne potrebujem, ale je to zdĺhavé a náchylné na chyby a zdá sa to ako niečo, čo by mal byť assembler schopný urobiť sám.
Používam program Clang 4.0, nainštalovaný prostredníctvom Homebrew, na macOS 10.12.6.
- Rýchla aktualizácia bootloaderu, ak ju potrebujete: bootovací sektor je dlhý 512 bajtov a musí mať hodnoty
0x55
a0xaa
pri offsetoch 510, respektíve 511. Jednoduchým spôsobom, ako to zabezpečiť, je ubezpečiť sa, že binárny výstup je presne 512 bajtov dlhý a má0x55
a0xaa
ako jeho posledné dva bajty.
odpovede:
0 pre odpoveď č. 1Clang má svoj vlastný assembler, ktorý nerozumie všetkej syntaxi GNU assemblera. Skúste sa namiesto toho zhromaždiť s GNU assemblerom, t. J. Pomocou as --32 -o boot.o boot.s
, potom by to malo fungovať.