Line 27: | Line 27: | ||
ALIGN | ALIGN | ||
LABEL _L123 | LABEL _L123 | ||
− | + | SDOUBLE 3.3e-2 | |
;;-- load literal onto stack | ;;-- load literal onto stack | ||
TEXT | TEXT | ||
ADDR _L123 | ADDR _L123 | ||
− | + | LDDOUBLE | |
;;-- to perform the first assignment (to "e"), duplicate the value on the stack | ;;-- to perform the first assignment (to "e"), duplicate the value on the stack | ||
− | + | DUP64 | |
LOCAL -16 ; write value to "e" | LOCAL -16 ; write value to "e" | ||
− | + | STDOUBLE | |
;;-- to perform the second assignment (to "d"), duplicate the value on the stack | ;;-- to perform the second assignment (to "d"), duplicate the value on the stack | ||
− | + | DUP64 | |
LOCAL -8 ; write value to "d" | LOCAL -8 ; write value to "d" | ||
− | + | STDOUBLE | |
;;-- the assignments are an instruction: trash the value left on the stack | ;;-- the assignments are an instruction: trash the value left on the stack | ||
Line 51: | Line 51: | ||
;;-- now to perform the add operation | ;;-- now to perform the add operation | ||
LOCAL -8 | LOCAL -8 | ||
− | + | LDDOUBLE ; load "d" | |
LOCAL -16 | LOCAL -16 | ||
− | + | LDDOUBLE ; load "e" | |
DADD ; leaves result on the stack | DADD ; leaves result on the stack | ||
Line 63: | Line 63: | ||
INT 0 | INT 0 | ||
− | + | STFVAL32 | |
LEAVE | LEAVE | ||
RET | RET |
The following pure-Postfix program illustrates duplication of double-precision floating point numbers on the stack.
The C equivalent would be (roughly):
<c> int main() {
extern void printd(double); double d, e; d = e = 3.3e-2; printd(d + e); return 0;
} </c>
Note that this program's code does not necessarily correspond to any particular code generator output.
Postfix code |
---|
<asm>
TEXT ALIGN GLOBAL _main, FUNC LABEL _main ENTER 16 ; d@-8 and e@-16
RODATA ALIGN LABEL _L123 SDOUBLE 3.3e-2
TEXT ADDR _L123 LDDOUBLE
DUP64 LOCAL -16 ; write value to "e" STDOUBLE
DUP64 LOCAL -8 ; write value to "d" STDOUBLE
TRASH 8
LOCAL -8 LDDOUBLE ; load "d" LOCAL -16 LDDOUBLE ; load "e" DADD ; leaves result on the stack EXTERN printd CALL printd TRASH 8 ; argument value no longer needed INT 0 STFVAL32 LEAVE RET </asm> |
Assuming that the code above is in file dbl.pf, the following commands would compile and run the program:
pf2asm dbl.pf yasm -felf dbl.asm ld -o dbl dbl.o -lrts ./dbl