|
|
(6 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| == The Original Code ==
| | #REDIRECT [[ist:Code Generation/Example 4]] |
| | |
| 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
| |
| | |
| [[category:Compilers]]
| |
| [[category:Teaching]]
| |