| 
				     | 
				
| (2 intermediate revisions by the same user not shown) | 
| Line 1: | 
Line 1: | 
 | == The Original Code ==
  |  | #REDIRECT [[ist:Code Generation/Exercise 7]]  | 
 |    |  | 
 | Consider the following C function:
  |  | 
 |    |  | 
 | <c>
  |  | 
 | int *traverse(int vec[], int lim) {
  |  | 
 |   int *ptr = vec + lim - 1, ix = lim - 2;
  |  | 
 |   while (ix >= 0) {
  |  | 
 |     ptr = (vec[ix] > *ptr) ? vec + ix : ptr;
  |  | 
 |     ix--;
  |  | 
 |   }
  |  | 
 |   return ptr;
  |  | 
 | }
  |  | 
 | </c>
  |  | 
 |    |  | 
 | == Postfix Code ==
  |  | 
 |    |  | 
 | The Postfix code for the above function is as follows: 
  |  | 
 |    |  | 
 | <asm>
  |  | 
 | TEXT
  |  | 
 | ALIGN
  |  | 
 | GLOBL traverse, FUNC
  |  | 
 | LABEL traverse
  |  | 
 | ENTER 8  ; ptr@-4 ix@-8 vec@+8 lim@+12
  |  | 
 |    |  | 
 | ; init prt (not assignment)
  |  | 
 | LOCAL +8
  |  | 
 | LOAD  ; vec
  |  | 
 | LOCAL +12
  |  | 
 | LOAD ; lim
  |  | 
 | INT 4    ; sizeof int
  |  | 
 | MUL
  |  | 
 | ADD      ; vec + lim
  |  | 
 | INT 1
  |  | 
 | INT 4    ; sizeof int
  |  | 
 | MUL
  |  | 
 | SUB      ; vec + lim - 1
  |  | 
 | LOCAL -4
  |  | 
 | STORE  ; ptr = vec + lim - 1
  |  | 
 |    |  | 
 | ; init ix (not assignment)
  |  | 
 | LOCAL +12
  |  | 
 | LOAD ; lim
  |  | 
 | INT 2
  |  | 
 | SUB
  |  | 
 | LOCAL -8
  |  | 
 | STORE  ; ix = lim -2
  |  | 
 |    |  | 
 | ; while start: test
  |  | 
 | ALIGN
  |  | 
 | LABEL while_test
  |  | 
 | LOCAL -8
  |  | 
 | LOAD
  |  | 
 | INT 0
  |  | 
 | GE       ; ix >= 0
  |  | 
 | JZ while_end
  |  | 
 |    |  | 
 | ; while block
  |  | 
 |    |  | 
 | ; ?: operator
  |  | 
 | LOCAL +8
  |  | 
 | LOAD  ; vec
  |  | 
 | LOCAL -8
  |  | 
 | LOAD  ; ix
  |  | 
 | INT 4    ; sizeof int
  |  | 
 | MUL
  |  | 
 | ADD      ; vec + ix
  |  | 
 | LOAD     ; *(vec+ix) --> vec[ix]
  |  | 
 |    |  | 
 | LOCAL -4
  |  | 
 | LOAD  ; ptr
  |  | 
 | LOAD  ; *ptr
  |  | 
 |    |  | 
 | GT
  |  | 
 | JZ three_false_part
  |  | 
 |    |  | 
 | ; ?: true part
  |  | 
 | LOCAL +8
  |  | 
 | LOAD  ; vec
  |  | 
 | LOCAL -8
  |  | 
 | LOAD  ; ix
  |  | 
 | INT 4    ; sizeof int
  |  | 
 | MUL
  |  | 
 | ADD      ; vec + ix
  |  | 
 |    |  | 
 | JMP three_end
  |  | 
 |    |  | 
 | ; ?: false part
  |  | 
 | ALIGN
  |  | 
 | LABEL three_false_part
  |  | 
 |    |  | 
 | LOCAL -4
  |  | 
 | LOAD  ; ptr
  |  | 
 |    |  | 
 | ; ?: end
  |  | 
 | ALIGN
  |  | 
 | LABEL three_end
  |  | 
 |    |  | 
 | DUP      ; for assignment
  |  | 
 | LOCAL -4
  |  | 
 | STORE  ; ptr = ?: ...
  |  | 
 |    |  | 
 | ; trash expression value (used as instruction)
  |  | 
 | TRASH 4
  |  | 
 |    |  | 
 | ; decrement ix
  |  | 
 | LOCAL -8
  |  | 
 | LOAD  ; ix
  |  | 
 | DUP
  |  | 
 | INT 1
  |  | 
 | SUB
  |  | 
 | LOCAL -8
  |  | 
 | STORE  ; ix = ix - 1
  |  | 
 | TRASH 4  ; (ix-- used as instruction)
  |  | 
 |    |  | 
 | ; end while block
  |  | 
 | JMP while_test
  |  | 
 |    |  | 
 | ; exit while cycle
  |  | 
 | ALIGN
  |  | 
 | LABEL while_end
  |  | 
 |    |  | 
 | ; return ptr
  |  | 
 | LOCAL -4
  |  | 
 | LOAD
  |  | 
 | POP
  |  | 
 | LEAVE
  |  | 
 | RET
  |  | 
 | </asm>
  |  | 
 |    |  | 
 | == Compiling and Running ==
  |  | 
 |    |  | 
 | To compile the Postfix code directly, [[pf2asm]] can be used:
  |  | 
 |    |  | 
 |  pf2asm traverse.pf
  |  | 
 |  yasm -felf traverse.asm
  |  | 
 |    |  | 
 | [[category:Compiladores]]
  |  | 
 | [[category:Ensino]]
  |  |