Code Generation/Example 1

From Wiki**3

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

The Original Code

Consider 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

The Postfix code for the above function is as follows: <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

ALIGN 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

ALIGN LABEL "false3" LOCAL -8  ; &i

ALIGN 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

ALIGN LABEL "endwhile"

-- rest of function

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