Všetky knižky o kompileroch venujú veľa priestoru teórii. To by až tak nevadilo, keby častokrát úplne nevypúšťali časť venujúcu sa generovaniu kódu. A práve pohľad na generovaný kód pomôže pochopiť ako funguje kompiler. 8080 je tak trochu už 16-bit procesor. Má tri registrové páry zložené z dvojíc registrov: BC, DE a HL. Tieto registrové páry umožňujú 16 bitové operácie ako add, sub, lhld, shld, lxi. SmallC používa takzvaný primary/secondary register koncept. Používa len dva registrové páry. Primárny je HL, secondary je DE. BC sa nepoužíva.
SmallC má jednu vynikajúcu vlastnosť. Umožňuje interaktívnu prácu. Človek napíše riadok C kódu, stlačí ENTER a hneď dostane výstupný asm kód. Je to perfektné pre zoznámenie sa s kompilerom. Poďme si to vyskúšať. Tu je preložená verzia pre Windows. scc8080. Záujemci o linux verziu si zdrojový kód https://github.com/ncb85/SmallC-85 iste bez problémov skompilujú sami.
Otvoríme si prompt a spustíme kompiler: scc8080 -t
Flag -t hovorí, že vstupné riadky budú kopírované do výsledného asm kódu ako komentáre. Nezadali sme názov file, takže vstup aj výstup bude na konzole. Mali by sme vidieť takéto niečo:
; Small C 8080napíšem: int a; a stlačím CTRL-Z a ENTER čím pošlem EOF znak. Na niektorých OS je treba poslať znak CTRL-D. SmallC vidí koniec file EOF a preto už nečaká na ďalší riadok ale skončí. Mal by vypísať toto:
; Coder (2.4,84/11/27)
; Front End (2.7,84/11/28)
; Front End for ASXXXX (2.8,13/01/20)
;program area SMALLC_GENERATED is RELOCATABLE
.area SMALLC_GENERATED (REL,CON)
.module SMALLC_GENERATED
.list (err, loc, bin, eqt, cyc, lin, src, lst, md)
.nlist (pag)
.area SMALLC_GENERATED (REL,CON,CSEG)
.area SMALLC_GENERATED_DATA (REL,CON,DSEG)
.globl a
a:
.dw #0
;0 error(s) in compilation
; literal pool:0
; global pool:1
; Macro pool:45
; .end
Vo výstupnom asm je label s názvom našej deklarovanej premennej a má rezervované miesto 2 bytes (DB - Define Byte, 8 bits. DW - Define Word, 16 bits) čo je správne, pretože a je int. A nielen to, má aj východziu hodnotu. Tá je nastavená na 0. SmallC sa postará o to, aby globálne premenné mali garantovanú hodnotu. Vhodné sú ďalšie experimenty, deklarácia viacerých premenných, rôznych typov (int, char, unsigned int, unsigned char).
No comments:
Post a Comment