|   |     | 
| (One intermediate revision 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 ==
 |  | 
|  |   |  | 
|  | The Postfix code for the above function is as follows:
 |  | 
|  | {{CollapsedCode|Postfix code|
 |  | 
|  | <asm>
 |  | 
|  | TEXT
 |  | 
|  | ALIGN
 |  | 
|  | GLOBAL "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>
 |  | 
|  | }}
 |  | 
|  |   |  | 
|  | [[category:Compiladores]]
 |  | 
|  | [[category:Ensino]]
 |  |