Difference between revisions of "Code Generation/Exercise 7"

From Wiki**3

< Code Generation
(Compiling and Running)
(Postfix Code)
Line 26: Line 26:
  
 
; init prt (not assignment)
 
; init prt (not assignment)
LOCV +8  ; vec
+
LOCAL +8
LOCV +12 ; lim
+
LOAD ; vec
 +
LOCAL +12
 +
LOAD ; lim
 
INT 4    ; sizeof int
 
INT 4    ; sizeof int
 
MUL
 
MUL
Line 35: Line 37:
 
MUL
 
MUL
 
SUB      ; vec + lim - 1
 
SUB      ; vec + lim - 1
LOCA -4  ; ptr = vec + lim - 1
+
LOCAL -4
 +
STORE ; ptr = vec + lim - 1
  
 
; init ix (not assignment)
 
; init ix (not assignment)
LOCV +12 ; lim
+
LOCAL +12
 +
LOAD ; lim
 
INT 2
 
INT 2
 
SUB
 
SUB
LOCA -8  ; ix = lim -2
+
LOCAL -8
 +
STORE ; ix = lim -2
  
 
; while start: test
 
; while start: test
 
ALIGN
 
ALIGN
 
LABEL while_test
 
LABEL while_test
LOCV -8
+
LOCAL -8
 +
LOAD
 
INT 0
 
INT 0
 
GE      ; ix >= 0
 
GE      ; ix >= 0
Line 54: Line 60:
  
 
; ?: operator
 
; ?: operator
LOCV +8  ; vec
+
LOCAL +8
LOCV -8  ; ix
+
LOAD ; vec
 +
LOCAL -8
 +
LOAD ; ix
 
INT 4    ; sizeof int
 
INT 4    ; sizeof int
 
MUL
 
MUL
Line 61: Line 69:
 
LOAD    ; *(vec+ix) --> vec[ix]
 
LOAD    ; *(vec+ix) --> vec[ix]
  
LOCV -4  ; ptr
+
LOCAL -4
LOAD     ; *ptr
+
LOAD ; ptr
 +
LOAD ; *ptr
  
 
GT
 
GT
Line 68: Line 77:
  
 
; ?: true part
 
; ?: true part
LOCV +8  ; vec
+
LOCAL +8
LOCV -8  ; ix
+
LOAD ; vec
 +
LOCAL -8
 +
LOAD ; ix
 
INT 4    ; sizeof int
 
INT 4    ; sizeof int
 
MUL
 
MUL
Line 80: Line 91:
 
LABEL three_false_part
 
LABEL three_false_part
  
LOCV -4  ; ptr
+
LOCAL -4
 +
LOAD ; ptr
  
 
; ?: end
 
; ?: end
Line 87: Line 99:
  
 
DUP      ; for assignment
 
DUP      ; for assignment
LOCA -4  ; ptr = ?: ...
+
LOCAL -4
 +
STORE ; ptr = ?: ...
  
 
; trash expression value (used as instruction)
 
; trash expression value (used as instruction)
Line 93: Line 106:
  
 
; decrement ix
 
; decrement ix
LOCV -8  ; ix
+
LOCAL -8
 +
LOAD ; ix
 
DUP
 
DUP
 
INT 1
 
INT 1
 
SUB
 
SUB
LOCA -8  ; ix = ix - 1
+
LOCAL -8
 +
STORE ; ix = ix - 1
 
TRASH 4  ; (ix-- used as instruction)
 
TRASH 4  ; (ix-- used as instruction)
  
Line 108: Line 123:
  
 
; return ptr
 
; return ptr
LOCV -4
+
LOCAL -4
 +
LOAD
 
POP
 
POP
 
LEAVE
 
LEAVE

Revision as of 09:17, 9 May 2017

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:

<asm> TEXT ALIGN GLOBL traverse, FUNC LABEL traverse ENTER 8  ; ptr@-4 ix@-8 vec@+8 lim@+12

init prt (not assignment)

LOCAL +8 LOAD  ; vec LOCAL +12 LOAD ; lim INT 4  ; sizeof int MUL ADD  ; vec + lim INT 1 INT 4  ; sizeof int MUL SUB  ; vec + lim - 1 LOCAL -4 STORE  ; ptr = vec + lim - 1

init ix (not assignment)

LOCAL +12 LOAD ; lim INT 2 SUB LOCAL -8 STORE  ; ix = lim -2

while start
test

ALIGN LABEL while_test LOCAL -8 LOAD INT 0 GE  ; ix >= 0 JZ while_end

while block
 ?
operator

LOCAL +8 LOAD  ; vec LOCAL -8 LOAD  ; ix INT 4  ; sizeof int MUL ADD  ; vec + ix LOAD  ; *(vec+ix) --> vec[ix]

LOCAL -4 LOAD  ; ptr LOAD  ; *ptr

GT JZ three_false_part

 ?
true part

LOCAL +8 LOAD  ; vec LOCAL -8 LOAD  ; ix INT 4  ; sizeof int MUL ADD  ; vec + ix

JMP three_end

 ?
false part

ALIGN LABEL three_false_part

LOCAL -4 LOAD  ; ptr

 ?
end

ALIGN LABEL three_end

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

trash expression value (used as instruction)

TRASH 4

decrement ix

LOCAL -8 LOAD  ; ix DUP INT 1 SUB LOCAL -8 STORE  ; ix = ix - 1 TRASH 4  ; (ix-- used as instruction)

end while block

JMP while_test

exit while cycle

ALIGN LABEL while_end

return ptr

LOCAL -4 LOAD POP LEAVE RET </asm>

Compiling and Running

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

pf2asm traverse.pf
yasm -felf traverse.asm