Code Generation/Example 4: Difference between revisions

From Wiki**3

< Code Generation
(Redirected page to ist:Code Generation/Example 4)
 
(2 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
 
; start while body
 
; prepare arguments for calling printf
 
LOCV -4    ; second printf arg: read ix
 
; put string literal in read-only memory
RODATA
ALIGN
LABEL strlit
STR "%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
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
 
; 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
LOCV -4 ; read ix
 
; put it in the accumulator (register) to conform with Cdecl
POP
 
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]]

Latest revision as of 18:14, 6 December 2018