Code Generation/Exercise 7: Difference between revisions

From Wiki**3

< Code Generation
Line 27: Line 27:
; init prt (not assignment)
; init prt (not assignment)
LOCAL +8
LOCAL +8
LOAD ; vec
LDINT ; vec
LOCAL +12
LOCAL +12
LOAD ; lim
LDINT ; lim
INT 4    ; sizeof int
INT 4    ; sizeof int
MUL
MUL
Line 38: Line 38:
SUB      ; vec + lim - 1
SUB      ; vec + lim - 1
LOCAL -4
LOCAL -4
STORE ; ptr = vec + lim - 1
STINT ; ptr = vec + lim - 1


; init ix (not assignment)
; init ix (not assignment)
LOCAL +12
LOCAL +12
LOAD ; lim
LDINT ; lim
INT 2
INT 2
SUB
SUB
LOCAL -8
LOCAL -8
STORE ; ix = lim -2
STINT ; ix = lim -2


; while start: test
; while start: test
Line 52: Line 52:
LABEL while_test
LABEL while_test
LOCAL -8
LOCAL -8
LOAD
LDINT
INT 0
INT 0
GE      ; ix >= 0
GE      ; ix >= 0
Line 61: Line 61:
; ?: operator
; ?: operator
LOCAL +8
LOCAL +8
LOAD ; vec
LDINT ; vec
LOCAL -8
LOCAL -8
LOAD ; ix
LDINT ; ix
INT 4    ; sizeof int
INT 4    ; sizeof int
MUL
MUL
ADD      ; vec + ix
ADD      ; vec + ix
LOAD     ; *(vec+ix) --> vec[ix]
LDINT     ; *(vec+ix) --> vec[ix]


LOCAL -4
LOCAL -4
LOAD ; ptr
LDINT ; ptr
LOAD ; *ptr
LDINT ; *ptr


GT
GT
Line 78: Line 78:
; ?: true part
; ?: true part
LOCAL +8
LOCAL +8
LOAD ; vec
LDINT ; vec
LOCAL -8
LOCAL -8
LOAD ; ix
LDINT ; ix
INT 4    ; sizeof int
INT 4    ; sizeof int
MUL
MUL
Line 92: Line 92:


LOCAL -4
LOCAL -4
LOAD ; ptr
LDINT ; ptr


; ?: end
; ?: end
Line 98: Line 98:
LABEL three_end
LABEL three_end


DUP     ; for assignment
DUP32     ; for assignment
LOCAL -4
LOCAL -4
STORE ; ptr = ?: ...
STINT ; ptr = ?: ...


; trash expression value (used as instruction)
; trash expression value (used as instruction)
Line 107: Line 107:
; decrement ix
; decrement ix
LOCAL -8
LOCAL -8
LOAD ; ix
LDINT ; ix
DUP
DUP32
INT 1
INT 1
SUB
SUB
LOCAL -8
LOCAL -8
STORE ; ix = ix - 1
STINT ; ix = ix - 1
TRASH 4  ; (ix-- used as instruction)
TRASH 4  ; (ix-- used as instruction)


Line 124: Line 124:
; return ptr
; return ptr
LOCAL -4
LOCAL -4
LOAD
LDINT
POP
STFVAL32
LEAVE
LEAVE
RET
RET

Revision as of 22:39, 1 May 2018

The Original Code

Consider the following C function:

<c> int *traverse(int vec[], int lim) {

 int *ptr = vec + lim - 1, ix = lim - 2;
 while (ix >= 0) {
   ptr = (vec[ix] > *ptr) ? vec + ix : ptr;
   ix--;
 }
 return ptr;

} </c>

Postfix Code

The Postfix code for the above function is as follows:

Postfix code
{{{2}}}

Compiling and Running

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

pf2asm traverse.pf
yasm -felf traverse.asm