|
|
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:
| |
| {{CollapsedCode|Postfix code|
| |
| <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
| |
| LOCAL +8
| |
| LDINT ; read lo
| |
| LOCAL -4
| |
| STINT ; write to ix
| |
| | |
| ALIGN
| |
| LABEL whiletest
| |
| LOCAL -4
| |
| LDINT ; read ix
| |
| LOCAL +12
| |
| LDINT ; read hi
| |
| LT
| |
| JZ whileend
| |
| | |
| ; start while body
| |
| | |
| ; prepare arguments for calling printf
| |
| | |
| LOCAL -4
| |
| LDINT ; second printf arg: read ix
| |
| | |
| ; put string literal in read-only memory
| |
| RODATA
| |
| ALIGN
| |
| LABEL strlit
| |
| SSTRING "%d\n"
| |
| ; now get the address of the string literal (strlit)
| |
| TEXT
| |
| ADDR strlit ; first printf arg: string literal address
| |
| | |
| ; args are in the stack: call the function
| |
| CALL printf
| |
| | |
| ; clean args
| |
| TRASH 8
| |
| | |
| ; get printf return value
| |
| LDFVAL32
| |
| | |
| ; get rid of return value (printf used as instruction)
| |
| TRASH 4
| |
| | |
| ; increment ix
| |
| LOCAL -4
| |
| LDINT ; read ix
| |
| DUP32
| |
| INT 1
| |
| ADD
| |
| LOCAL -4
| |
| STINT ; ix = ix + 1
| |
| | |
| ; trash old value of ix
| |
| TRASH 4
| |
| | |
| ; end while body
| |
| | |
| ; restart while cycle
| |
| JMP whiletest
| |
| | |
| ; this is the while exit point
| |
| ALIGN
| |
| LABEL whileend
| |
| | |
| ; prepare return value
| |
| LOCAL -4
| |
| LDINT ; read ix
| |
| | |
| ; put it in the accumulator (register) to conform with Cdecl
| |
| STFVAL32
| |
| | |
| LEAVE ; release stack frame
| |
| RET ; return control to caller
| |
| | |
| </asm>
| |
| }}
| |
| | |
| == Compiling and Running ==
| |
| | |
| To compile the Postfix code directly, [[pf2asm]] can be used:
| |
| | |
| * pf2asm while.pf
| |
| * yasm -felf while.asm
| |
| | |
| [[category:Compiladores]]
| |
| [[category:Ensino]]
| |