| 
				     | 
				
| Line 1: | 
Line 1: | 
 | == The Original Code ==
  |  | #REDIRECT [[ist:Code Generation/Example 4]]  | 
 |    |  | 
 | Consider the following C function:
  |  | 
 |    |  | 
 | <c>
  |  | 
 | extern int printf(const char *format, ...);
  |  | 
 | int printlist(int lo, int hi) {
  |  | 
 |   int ix = lo;
  |  | 
 |   while (ix < hi) {
  |  | 
 |     printf("%d\n", ix);
  |  | 
 |     ix++;
  |  | 
 |   }
  |  | 
 |   return ix;
  |  | 
 | }
  |  | 
 | </c>
  |  | 
 |    |  | 
 | == Postfix Code ==
  |  | 
 |    |  | 
 | The Postfix code for the above function is as follows: 
  |  | 
 | {{CollapsedCode|Postfix code|
  |  | 
 | <asm>
  |  | 
 | EXTRN printf
  |  | 
 |    |  | 
 | TEXT
  |  | 
 | ALIGN
  |  | 
 | GLOBL printlist, FUNC
  |  | 
 | LABEL printlist
  |  | 
 |    |  | 
 | ENTER 4  ; ix@-4 lo@+8 hi@+12
  |  | 
 |    |  | 
 | ; int ix = lo is NOT an assignment
  |  | 
 | LOCAL +8
  |  | 
 | LDINT ; read lo
  |  | 
 | LOCAL -4
  |  | 
 | STINT ; write to ix
  |  | 
 |    |  | 
 | ALIGN
  |  | 
 | LABEL whiletest
  |  | 
 | LOCAL -4
  |  | 
 | LDINT  ; read ix
  |  | 
 | LOCAL +12
  |  | 
 | LDINT ; read hi
  |  | 
 | LT
  |  | 
 | JZ whileend
  |  | 
 |    |  | 
 | ; start while body
  |  | 
 |    |  | 
 | ; prepare arguments for calling printf
  |  | 
 |    |  | 
 | LOCAL -4
  |  | 
 | LDINT     ; second printf arg: read ix
  |  | 
 |    |  | 
 | ; put string literal in read-only memory
  |  | 
 | RODATA
  |  | 
 | ALIGN
  |  | 
 | LABEL strlit
  |  | 
 | SSTRING "%d\n"
  |  | 
 | ; now get the address of the string literal (strlit)
  |  | 
 | TEXT
  |  | 
 | ADDR strlit ; first printf arg: string literal address
  |  | 
 |    |  | 
 | ; args are in the stack: call the function
  |  | 
 | CALL printf
  |  | 
 |    |  | 
 | ; clean args
  |  | 
 | TRASH 8
  |  | 
 |    |  | 
 | ; get printf return value
  |  | 
 | LDFVAL32
  |  | 
 |    |  | 
 | ; get rid of return value (printf used as instruction)
  |  | 
 | TRASH 4
  |  | 
 |    |  | 
 | ; increment ix
  |  | 
 | LOCAL -4
  |  | 
 | LDINT ; read ix
  |  | 
 | DUP32
  |  | 
 | INT 1
  |  | 
 | ADD
  |  | 
 | LOCAL -4
  |  | 
 | STINT ; ix = ix + 1
  |  | 
 |    |  | 
 | ; trash old value of ix
  |  | 
 | TRASH 4
  |  | 
 |    |  | 
 | ; end while body
  |  | 
 |    |  | 
 | ; restart while cycle
  |  | 
 | JMP whiletest
  |  | 
 |    |  | 
 | ; this is the while exit point
  |  | 
 | ALIGN
  |  | 
 | LABEL whileend
  |  | 
 |    |  | 
 | ; prepare return value
  |  | 
 | LOCAL -4
  |  | 
 | LDINT ; read ix
  |  | 
 |    |  | 
 | ; put it in the accumulator (register) to conform with Cdecl
  |  | 
 | STFVAL32
  |  | 
 |    |  | 
 | LEAVE  ; release stack frame
  |  | 
 | RET     ; return control to caller
  |  | 
 |    |  | 
 | </asm>
  |  | 
 | }}
  |  | 
 |    |  | 
 | == Compiling and Running ==
  |  | 
 |    |  | 
 | To compile the Postfix code directly, [[pf2asm]] can be used:
  |  | 
 |    |  | 
 | * pf2asm while.pf
  |  | 
 | * yasm -felf while.asm
  |  | 
 |    |  | 
 | [[category:Compiladores]]
  |  | 
 | [[category:Ensino]]
  |  |