Code Generation/Example 1: Difference between revisions
From Wiki**3
< Code Generation
No edit summary |
|||
Line 83: | Line 83: | ||
</asm> | </asm> | ||
[[category: | [[category:Compiladores]] | ||
[[category: | [[category:Ensino]] |
Revision as of 14:29, 6 April 2015
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>