Code Generation/Example 4

From Wiki**3

Revision as of 11:33, 12 February 2019 by Root (talk | contribs)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

The Original Code

Consider the following C function:

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;
}

Postfix Code

The Postfix code for the above function is as follows:

Postfix code
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

Compiling and Running

To compile the Postfix code directly, pf2asm can be used:

  • pf2asm while.pf
  • yasm -felf while.asm