(→Compiling and Running) |
(→Postfix Code) |
||
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 |
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:
<asm> TEXT ALIGN GLOBL traverse, FUNC LABEL traverse ENTER 8 ; ptr@-4 ix@-8 vec@+8 lim@+12
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
LOCAL +12 LOAD ; lim INT 2 SUB LOCAL -8 STORE ; ix = lim -2
ALIGN LABEL while_test LOCAL -8 LOAD INT 0 GE ; ix >= 0 JZ while_end
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
LOCAL +8 LOAD ; vec LOCAL -8 LOAD ; ix INT 4 ; sizeof int MUL ADD ; vec + ix
JMP three_end
ALIGN LABEL three_false_part
LOCAL -4 LOAD ; ptr
ALIGN LABEL three_end
DUP ; for assignment LOCAL -4 STORE ; ptr = ?: ...
TRASH 4
LOCAL -8 LOAD ; ix DUP INT 1 SUB LOCAL -8 STORE ; ix = ix - 1 TRASH 4 ; (ix-- used as instruction)
JMP while_test
ALIGN LABEL while_end
LOCAL -4 LOAD POP LEAVE RET </asm>
To compile the Postfix code directly, pf2asm can be used:
pf2asm traverse.pf yasm -felf traverse.asm