Myslím si, že by se hodilo ukázat i 16bitový, nebo alespoň 32bitový výstup GCC. Moje instalace GCC se s volbou -m16 o 16bitový výstup snaží – ale vypadne z ní 32bitový elf plný 66h prefixů. I tak mi to přijde víc relevantní než ukazovat 64bitový kód, obzvlášť používající SIMD instrukce. SIMD instrukce nedávají při porovnávání s 16bitovou x86 smysl.
Tak jsem ten -m16 zkoušel a vygeneruje to 16bitový kód, ale s 32bitovými registry atd. V podstatě tedy jako DOS na 386 nebo 486. Předpokládám, že to používá jádro pro boot v realtime a přechod do chráněného režimu.
Když se to donutí použít 16bitové registry, tak to vypadá takto:
short int add(short int a, short int b) {
return a+b;
}
A optimalizace dopadne:
mov eax, DWORD PTR [esp+8]
add ax, WORD PTR [esp+4]
ret
proč tam dává EAX je ovšem trošku záhadou :-)
Zahadou to nie je, je to priamo v dokumentacii:
The -m16 option is the same as -m32, except for that it outputs the .code16gcc assembly directive at the beginning of the assembly output so that the binary can run in 16-bit mode.
Taktiez vidno, ze stale pouziva 32-bit ABI (premenne na zasobniku su zarovnane na 32-bit).
Skutocny 16-bitovy rezim ale v gcc bol, minimalne Atari ho pouzivalo v prvej polovici 90-tych rokov.
14. 5. 2025, 09:03 editováno autorem komentáře