|
|
(6 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| == The Original Code ==
| | #REDIRECT [[ist:Code Generation/Example 1]] |
| | |
| 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 ==
| |
| | |
| <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>
| |
| | |
| [[category:Compilers]]
| |
| [[category:Teaching]]
| |