/ / Prečo použitie jmp zabraňuje tomu, aby assembler Clang zistil absolútny výraz pre .fill? - macos, assembly, x86, clang, bootloader

Prečo používanie jmp zabraňuje tomu, aby clang assembler zistil absolútny výraz pre .fill? makro, zostava, x86, clang, bootloader

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 a 0xaa 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 a 0xaa ako jeho posledné dva bajty.

odpovede:

0 pre odpoveď č. 1

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