Code Generation/Exercise 7: Difference between revisions
From Wiki**3
< Code Generation
| Line 26: | Line 26: | ||
; init prt (not assignment)  | ; init prt (not assignment)  | ||
LOCAL +8  | |||
LOAD  ; vec  | |||
LOCAL +12  | |||
LOAD ; lim  | |||
INT 4    ; sizeof int  | INT 4    ; sizeof int  | ||
MUL  | MUL  | ||
| Line 35: | Line 37: | ||
MUL  | MUL  | ||
SUB      ; vec + lim - 1  | SUB      ; vec + lim - 1  | ||
LOCAL -4  | |||
STORE  ; ptr = vec + lim - 1  | |||
; init ix (not assignment)  | ; init ix (not assignment)  | ||
LOCAL +12  | |||
LOAD ; lim  | |||
INT 2  | INT 2  | ||
SUB  | SUB  | ||
LOCAL -8  | |||
STORE  ; ix = lim -2  | |||
; while start: test  | ; while start: test  | ||
ALIGN  | ALIGN  | ||
LABEL while_test  | LABEL while_test  | ||
LOCAL -8  | |||
LOAD  | |||
INT 0  | INT 0  | ||
GE       ; ix >= 0  | GE       ; ix >= 0  | ||
| Line 54: | Line 60: | ||
; ?: operator  | ; ?: operator  | ||
LOCAL +8  | |||
LOAD  ; vec  | |||
LOCAL -8  | |||
LOAD  ; ix  | |||
INT 4    ; sizeof int  | INT 4    ; sizeof int  | ||
MUL  | MUL  | ||
| Line 61: | Line 69: | ||
LOAD     ; *(vec+ix) --> vec[ix]  | LOAD     ; *(vec+ix) --> vec[ix]  | ||
LOCAL -4  | |||
LOAD   | LOAD  ; ptr  | ||
LOAD  ; *ptr  | |||
GT  | GT  | ||
| Line 68: | Line 77: | ||
; ?: true part  | ; ?: true part  | ||
LOCAL +8  | |||
LOAD  ; vec  | |||
LOCAL -8  | |||
LOAD  ; ix  | |||
INT 4    ; sizeof int  | INT 4    ; sizeof int  | ||
MUL  | MUL  | ||
| Line 80: | Line 91: | ||
LABEL three_false_part  | LABEL three_false_part  | ||
LOCAL -4  | |||
LOAD  ; ptr  | |||
; ?: end  | ; ?: end  | ||
| Line 87: | Line 99: | ||
DUP      ; for assignment  | DUP      ; for assignment  | ||
LOCAL -4  | |||
STORE  ; ptr = ?: ...  | |||
; trash expression value (used as instruction)  | ; trash expression value (used as instruction)  | ||
| Line 93: | Line 106: | ||
; decrement ix  | ; decrement ix  | ||
LOCAL -8  | |||
LOAD  ; ix  | |||
DUP  | DUP  | ||
INT 1  | INT 1  | ||
SUB  | SUB  | ||
LOCAL -8  | |||
STORE  ; ix = ix - 1  | |||
TRASH 4  ; (ix-- used as instruction)  | TRASH 4  ; (ix-- used as instruction)  | ||
| Line 108: | Line 123: | ||
; return ptr  | ; return ptr  | ||
LOCAL -4  | |||
LOAD  | |||
POP  | POP  | ||
LEAVE  | LEAVE  | ||
Revision as of 07:17, 9 May 2017
The Original Code
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