Code Generation/Example 4
From Wiki**3
< Code Generation
The Original Code
Consider the following C function:
<c> extern int printf(const char *format, ...); int printlist(int lo, int hi) {
int ix = lo; while (ix < hi) { printf("%d\n", ix); ix++; } return ix;
} </c>
Postfix Code
The Postfix code for the above function is as follows:
<asm> EXTRN printf
TEXT ALIGN GLOBL printlist, FUNC LABEL printlist
ENTER 4 ; ix@-4 lo@+8 hi@+12
- int ix = lo is NOT an assignment
LOCV +8 ; read lo LOCA -4 ; write to ix
ALIGN LABEL whiletest LOCV -4 ; read ix LOCV +12 ; read hi LT JZ whileend
- put string literal in read-only memory
RODATA ALIGN LABEL strlit STR "%d\n"
TEXT
- start while body
LOCV -4 ; second printf arg: read ix ADDR strlit ; first printf arg: string lit address CALL printf
- clean args
TRASH 8
- get printf return value
PUSH
- get rid of return value (printf used as instruction)
TRASH 4
- increment ix
LOCV -4 ; read ix DUP INT 1 ADD LOCA -4 ; ix = ix + 1
- end while body
- restart while cycle
JMP whiletest
- this is the while exit point
ALIGN LABEL whileend
- prepare return value
LOCV -4 ; read ix
- put it in the accumulator (register) to conform with Cdecl
POP
- release stack frame
LEAVE
- return control to caller
RET
</asm>
Compiling and Running
To compile the Postfix code directly, pf2asm can be used:
- pf2asm while.pf
- yasm -felf while.asm