(→Postfix Code) |
(→Postfix Code) |
||
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 |
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>
The Postfix code for the above function is as follows:
Postfix code |
---|
{{{2}}} |
To compile the Postfix code directly, pf2asm can be used:
pf2asm traverse.pf yasm -felf traverse.asm