Thursday, February 21, 2013

SCC8. SmallC - ukladanie premenných

Keď som už ukladanie hodnôt do premenných v minulých blogoch načal, tak dám aj jeden príklad. Pozrieme sa ako sa narába s rôznymi typmi premenných. Vždy keď je treba uložiť hodnotu do nejakej premennej je volaná táto metóda.
store(LVALUE *lval) {
   if (lval->indirect == 0)
     gen_put_memory (lval->symbol);
   else
     gen_put_indirect (lval->indirect);
}
Je tvorená jedným if, ktorý sa pozrie, či narábame s pointerom, alebo s premennou. Presnejšie povedané, môže ísť o pointer. Ale nie o premennú nepriamo referencovanú pointerom. Podľa toho zavolá ďalšiu metódu. Ak sa jedná o premennú, je to jednoduché.
void gen_put_memory(SYMBOL *sym) {
   if ((sym->identity != POINTER) && (sym->type & CCHAR)) {
     output_line ("mov \ta,l");
     output_with_tab ("sta \t");
   } else {
     output_with_tab ("shld\t");
   }
   output_string (sym->name);
   newline ();
}
Tu je zase len jeden if. Ten sa pozerá, či je veľkosť byte alebo int. Aj pointer má veľkosť ako int. Ak je to teda byte, tak sa vygeneruje STA. Ešte predtým sa vygeneruje inštrukcia na presun low byte z primary registra do akumulárora. Ak sa jedná o dva byty, tak sa vygeneruje SHLD. Nakoniec sa vygeneruje label, pre inštruckie STA/SHLD. Label je miesto, kde má premenná rezervované miesto pomocou DB, DW.

Teraz sa pozrime na premenné nepriamo referencované pointerom.
void gen_put_indirect(char typeobj) {
   gen_pop ();
   if (typeobj & CCHAR) {
     output_line("mov \ta,l");
     output_line("stax\td");
   } else {
     if (uflag) {
       output_line("shlx");
     } else {
       gen_call("ccpint");
     }
   }
}
Ako prvý máme POP DE. Prečo ? Pretože v primárnom registri máme hodnotu premennej a na stacku máme jej adresu. Ciže hodnotu kam ukazuje pointer. Je to takéto jednoduché, pretože používame koncept primárneho registra. Potom sa zase rozhodujeme podľa hodnoty zo symbol table, či ide o byte alebo o int. V prípade byte je to klasika, vygenerujeme inštrukciu STAX D.

V prípade, že sa jedná o int sa ešte rozhodujeme, či chceme používať nedokumentovanú inštrukciu CPU 8085. SHLX uloží hodnotu v HL na adresu v DE. Ak sa chceme držať dokumentácie, prípadne generujeme kód pre CPU 8080, je to komplikovanejšie. Musíme volať maličký podprogram, ktorý urobí to isté ako jediná inštrukcia v 8085. Vyzerá takto.
; store int from HL into (DE)
ccpint: mov a,l
stax d
inx d
mov a,h
stax d
ret

No comments:

Post a Comment