Code Generation/Example 1

From Wiki**3

< Code Generation
Revision as of 09:24, 25 May 2009 by Root (talk | contribs) (New page: == The Problem == Translate into Postfix the following C function. <c> int main() { int n = 45, i = 0, j = 1, *seg = &i; while (n-- > 0) { print(*seg = i + j); seg = (seg == &...)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

The Problem

Translate into Postfix the following C function. <c> int main() {

 int n = 45, i = 0, j = 1, *seg = &i;
 while (n-- > 0) {
   print(*seg = i + j);
   seg = (seg == &i) ? &j : &i;
 }
 return 0;

} </c>

Postfix Code

<asm> TEXT ALIGN GLOBL "main",FUNC LABEL "main" ENTER 16  ; n@-4, i@-8, j@-12, seg@-16

-- initialization

INT 45 LOCA -4  ; n = 45 INT 0 LOCA -8  ; i = 0 INT 1 LOCA -12  ; j = 1 LOCAL -8  ; &i LOCA -16  ; seg = &i

-- while cycle

LABEL "while" LOCV -4  ; n DUP  ; n (because of n--) INT 1 SUB  ; n-1 LOCA -4  ; n = n-1 INT 0 GT  ; n > 0 (n before decrement) JZ "endwhile" LOCV -8  ; i LOCV -12  ; j ADD  ; i+j DUP  ; same value (for assignment) LOCV -16  ; seg STORE  ; *seg = i+j CALL "print"  ; we assume that "print" does not return any value TRASH 4  ; trash argument (int)

-- compute trenary operator's value

LOCV -16  ; seg LOCAL -8  ; &i EQ  ; seg == &i JZ "false3"  ; jump to "false" expression of trenary operator LOCAL -12  ; &j JMP "end3"  ; jump to end of trenary operator LABEL "false3" LOCAL -8  ; &i LABEL "end3" DUP  ; trenary operator's value (duplicated because of assignment) LOCA -16  ; seg = (seg == &i) ? &j : &i TRASH 4  ; trash assignment's value, since we used it as an instruction

JMP "while"  ; restart while cycle LABEL "endwhile"

-- rest of function

INT 0 POP  ; return value is 0 LEAVE RET </asm>