Code Generation/Exercise 7: Difference between revisions
From Wiki**3
< Code Generation
| Line 27: | Line 27: | ||
; init prt (not assignment)  | ; init prt (not assignment)  | ||
LOCAL +8  | LOCAL +8  | ||
LDINT  ; vec  | |||
LOCAL +12  | LOCAL +12  | ||
LDINT ; lim  | |||
INT 4    ; sizeof int  | INT 4    ; sizeof int  | ||
MUL  | MUL  | ||
| Line 38: | Line 38: | ||
SUB      ; vec + lim - 1  | SUB      ; vec + lim - 1  | ||
LOCAL -4  | LOCAL -4  | ||
STINT  ; ptr = vec + lim - 1  | |||
; init ix (not assignment)  | ; init ix (not assignment)  | ||
LOCAL +12  | LOCAL +12  | ||
LDINT ; lim  | |||
INT 2  | INT 2  | ||
SUB  | SUB  | ||
LOCAL -8  | LOCAL -8  | ||
STINT  ; ix = lim -2  | |||
; while start: test  | ; while start: test  | ||
| Line 52: | Line 52: | ||
LABEL while_test  | LABEL while_test  | ||
LOCAL -8  | LOCAL -8  | ||
LDINT  | |||
INT 0  | INT 0  | ||
GE       ; ix >= 0  | GE       ; ix >= 0  | ||
| Line 61: | Line 61: | ||
; ?: operator  | ; ?: operator  | ||
LOCAL +8  | LOCAL +8  | ||
LDINT  ; vec  | |||
LOCAL -8  | LOCAL -8  | ||
LDINT  ; ix  | |||
INT 4    ; sizeof int  | INT 4    ; sizeof int  | ||
MUL  | MUL  | ||
ADD      ; vec + ix  | ADD      ; vec + ix  | ||
LDINT     ; *(vec+ix) --> vec[ix]  | |||
LOCAL -4  | LOCAL -4  | ||
LDINT  ; ptr  | |||
LDINT  ; *ptr  | |||
GT  | GT  | ||
| Line 78: | Line 78: | ||
; ?: true part  | ; ?: true part  | ||
LOCAL +8  | LOCAL +8  | ||
LDINT  ; vec  | |||
LOCAL -8  | LOCAL -8  | ||
LDINT  ; ix  | |||
INT 4    ; sizeof int  | INT 4    ; sizeof int  | ||
MUL  | MUL  | ||
| Line 92: | Line 92: | ||
LOCAL -4  | LOCAL -4  | ||
LDINT  ; ptr  | |||
; ?: end  | ; ?: end  | ||
| Line 98: | Line 98: | ||
LABEL three_end  | LABEL three_end  | ||
DUP32      ; for assignment  | |||
LOCAL -4  | LOCAL -4  | ||
STINT  ; ptr = ?: ...  | |||
; trash expression value (used as instruction)  | ; trash expression value (used as instruction)  | ||
| Line 107: | Line 107: | ||
; decrement ix  | ; decrement ix  | ||
LOCAL -8  | LOCAL -8  | ||
LDINT  ; ix  | |||
DUP32  | |||
INT 1  | INT 1  | ||
SUB  | SUB  | ||
LOCAL -8  | LOCAL -8  | ||
STINT  ; ix = ix - 1  | |||
TRASH 4  ; (ix-- used as instruction)  | TRASH 4  ; (ix-- used as instruction)  | ||
| Line 124: | Line 124: | ||
; return ptr  | ; return ptr  | ||
LOCAL -4  | LOCAL -4  | ||
LDINT  | |||
STFVAL32  | |||
LEAVE  | LEAVE  | ||
RET  | RET  | ||
Revision as of 22:39, 1 May 2018
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:
| Postfix code | 
|---|
| {{{2}}} | 
Compiling and Running
To compile the Postfix code directly, pf2asm can be used:
pf2asm traverse.pf yasm -felf traverse.asm