(→Postfix Code) |
|||
(One intermediate revision by the same user not shown) | |||
Line 35: | Line 35: | ||
;-- while cycle: | ;-- while cycle: | ||
− | |||
LABEL "while" | LABEL "while" | ||
− | + | LOCAL -4 ; &n | |
+ | LDINT | ||
DUP32 ; n (because of n--) | DUP32 ; n (because of n--) | ||
INT 1 | INT 1 | ||
SUB ; n-1 | SUB ; 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" | ||
− | + | LOCAL -8 ; &i | |
− | + | LDINT ; i | |
+ | LOCAL -12 ; &j | ||
+ | LDINT ; j | ||
ADD ; i+j | ADD ; i+j | ||
DUP32 ; same value (for assignment) | DUP32 ; same value (for assignment) | ||
− | + | LOCAL -16 ; &seg | |
+ | LDINT ; seg | ||
STINT ; *seg = i+j | 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 | ||
Line 55: | Line 59: | ||
;-- compute trenary operator's value | ;-- compute trenary operator's value | ||
− | + | LOCAL -16 ; &seg | |
+ | LDINT ; seg | ||
LOCAL -8 ; &i | LOCAL -8 ; &i | ||
EQ ; seg == &i | EQ ; seg == &i | ||
Line 62: | Line 67: | ||
JMP "end3" ; jump to end of trenary operator | JMP "end3" ; jump to end of trenary operator | ||
− | |||
LABEL "false3" | LABEL "false3" | ||
LOCAL -8 ; &i | LOCAL -8 ; &i | ||
− | |||
LABEL "end3" | LABEL "end3" | ||
DUP32 ; trenary operator's value (duplicated because of assignment) | 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 | TRASH 4 ; trash assignment's value, since we used it as an instruction | ||
JMP "while" ; restart while cycle | JMP "while" ; restart while cycle | ||
− | |||
LABEL "endwhile" | LABEL "endwhile" | ||
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;
}
The Postfix code for the above function is as follows:
[Expand] Postfix code |
---|