Difference between revisions of "Code Generation/Exercise 7"

From Wiki**3

< Code Generation
(Postfix Code)
(Postfix Code)
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 00:39, 2 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