Difference between revisions of "Code Generation/Example 1"

From Wiki**3

< Code Generation
(Postfix Code)
(Postfix Code)
 
(4 intermediate revisions by the same user not shown)
Line 2: Line 2:
  
 
Consider the following C function:
 
Consider the following C function:
<c>
+
<source lang="c">
 
int main() {
 
int main() {
 
   int n = 45, i = 0, j = 1, *seg = &i;
 
   int n = 45, i = 0, j = 1, *seg = &i;
Line 11: Line 11:
 
   return 0;
 
   return 0;
 
}
 
}
</c>
+
</source>
  
 
== Postfix Code ==
 
== Postfix Code ==
  
 
The Postfix code for the above function is as follows:
 
The Postfix code for the above function is as follows:
<asm>
+
{{CollapsedCode|Postfix code|
 +
<source lang="asm">
 
TEXT
 
TEXT
 
ALIGN
 
ALIGN
Line 34: Line 35:
  
 
;-- while cycle:
 
;-- while cycle:
ALIGN
 
 
LABEL "while"
 
LABEL "while"
LOCV -4          ; n
+
LOCAL -4          ; &n
DUP             ; n (because of n--)
+
LDINT
 +
DUP32             ; n (because of n--)
 
INT 1
 
INT 1
 
SUB              ; n-1
 
SUB              ; n-1
LOCA -4          ; n = n-1
+
LOCAL -4
 +
STINT         ; n = n-1
 
INT 0
 
INT 0
 
GT              ; n > 0 (n before decrement)
 
GT              ; n > 0 (n before decrement)
 
JZ "endwhile"
 
JZ "endwhile"
LOCV -8          ; i
+
LOCAL -8          ; &i
LOCV -12        ; j
+
LDINT          ; i
 +
LOCAL -12         ; &j
 +
LDINT         ; j
 
ADD              ; i+j
 
ADD              ; i+j
DUP             ; same value (for assignment)
+
DUP32             ; same value (for assignment)
LOCV -16        ; seg
+
LOCAL -16        ; &seg
STORE           ; *seg = i+j
+
LDINT        ; seg
 +
STINT           ; *seg = i+j
 
CALL "print"    ; we assume that "print" does not return any value
 
CALL "print"    ; we assume that "print" does not return any value
 
TRASH 4          ; trash argument (int)
 
TRASH 4          ; trash argument (int)
  
 
;-- compute trenary operator's value
 
;-- compute trenary operator's value
LOCV -16        ; seg
+
LOCAL -16         ; &seg
 +
LDINT         ; seg
 
LOCAL -8        ; &i
 
LOCAL -8        ; &i
 
EQ              ; seg == &i
 
EQ              ; seg == &i
Line 61: Line 67:
 
JMP "end3"      ; jump to end of trenary operator
 
JMP "end3"      ; jump to end of trenary operator
  
ALIGN
 
 
LABEL "false3"
 
LABEL "false3"
 
LOCAL -8        ; &i
 
LOCAL -8        ; &i
  
ALIGN
 
 
LABEL "end3"
 
LABEL "end3"
DUP             ; trenary operator's value (duplicated because of assignment)
+
DUP32             ; trenary operator's value (duplicated because of assignment)
LOCA -16        ; seg = (seg == &i) ? &j : &i
+
LOCAL -16        
 +
STINT         ; seg = (seg == &i) ? &j : &i
 
TRASH 4          ; trash assignment's value, since we used it as an instruction
 
TRASH 4          ; trash assignment's value, since we used it as an instruction
  
 
JMP "while"      ; restart while cycle
 
JMP "while"      ; restart while cycle
  
ALIGN
 
 
LABEL "endwhile"
 
LABEL "endwhile"
  
 
;-- rest of function
 
;-- rest of function
 
INT 0
 
INT 0
POP             ; return value is 0
+
STFVAL32             ; return value is 0
 
LEAVE
 
LEAVE
 
RET
 
RET
</asm>
+
</source>
 +
}}
  
 
[[category:Compiladores]]
 
[[category:Compiladores]]
 
[[category:Ensino]]
 
[[category:Ensino]]

Latest revision as of 08:58, 14 May 2021

The Original Code

Consider the following C function:

int main() {
  int n = 45, i = 0, j = 1, *seg = &i;
  while (n-- > 0) {
    print(*seg = i + j);
    seg = (seg == &i) ? &j : &i;
  }
  return 0;
}

Postfix Code

The Postfix code for the above function is as follows:

Postfix code
TEXT
ALIGN
GLOBAL "main",FUNC
LABEL "main"
ENTER 16    ; n@-4, i@-8, j@-12, seg@-16

;-- initialization:
INT 45
LOCA -4          ; n = 45
INT 0
LOCA -8          ; i = 0
INT 1
LOCA -12         ; j = 1
LOCAL -8         ; &i
LOCA -16         ; seg = &i

;-- while cycle:
LABEL "while"
LOCAL -4          ; &n
LDINT
DUP32              ; n (because of n--)
INT 1
SUB              ; n-1
LOCAL -4
STINT          ; n = n-1
INT 0
GT               ; n > 0 (n before decrement)
JZ "endwhile"
LOCAL -8          ; &i
LDINT          ; i
LOCAL -12         ; &j
LDINT         ; j
ADD              ; i+j
DUP32              ; same value (for assignment)
LOCAL -16         ; &seg
LDINT         ; seg
STINT            ; *seg = i+j
CALL "print"     ; we assume that "print" does not return any value
TRASH 4          ; trash argument (int)

;-- compute trenary operator's value
LOCAL -16         ; &seg
LDINT         ; seg
LOCAL -8         ; &i
EQ               ; seg == &i
JZ "false3"      ; jump to "false" expression of trenary operator
LOCAL -12        ; &j
JMP "end3"       ; jump to end of trenary operator

LABEL "false3"
LOCAL -8         ; &i

LABEL "end3"
DUP32              ; trenary operator's value (duplicated because of assignment)
LOCAL -16         
STINT         ; seg = (seg == &i) ? &j : &i
TRASH 4          ; trash assignment's value, since we used it as an instruction

JMP "while"      ; restart while cycle

LABEL "endwhile"

;-- rest of function
INT 0
STFVAL32              ; return value is 0
LEAVE
RET