Code Generation/Example 4: Difference between revisions
From Wiki**3
< Code Generation
(Created page with "== 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) { ...") |
|||
Line 37: | Line 37: | ||
LOCV -4 ; read ix | LOCV -4 ; read ix | ||
LOCV +12 ; read hi | LOCV +12 ; read hi | ||
LT | |||
JZ whileend | JZ whileend | ||
Revision as of 10:23, 7 May 2013
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