(→Compiling and Running) |
|||
(13 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | + | The following pure-Postfix program illustrates duplication of double-precision floating point numbers on the stack. | |
− | <asm> | + | The C equivalent would be (roughly): |
+ | |||
+ | <source lang="c"> | ||
+ | int main() { | ||
+ | extern void printd(double); | ||
+ | double d, e; | ||
+ | d = e = 3.3e-2; | ||
+ | printd(d + e); | ||
+ | return 0; | ||
+ | } | ||
+ | </source> | ||
+ | |||
+ | Note that this program's code does not necessarily correspond to any particular code generator output. | ||
+ | {{CollapsedCode|Postfix code| | ||
+ | <source lang="asm"> | ||
+ | ;;-- generation of the "_main" function | ||
+ | TEXT | ||
+ | ALIGN | ||
+ | GLOBAL _main, FUNC | ||
+ | LABEL _main | ||
+ | ENTER 16 ; d@-8 and e@-16 | ||
+ | |||
+ | ;;-- put double literal in RODATA | ||
RODATA | RODATA | ||
ALIGN | ALIGN | ||
LABEL _L123 | LABEL _L123 | ||
− | + | SDOUBLE 3.3e-2 | |
+ | ;;-- load literal onto stack | ||
TEXT | TEXT | ||
− | + | ADDR _L123 | |
− | + | LDDOUBLE | |
− | + | ||
− | + | ;;-- to perform the first assignment (to "e"), duplicate the value on the stack | |
+ | DUP64 | ||
+ | |||
+ | LOCAL -16 ; write value to "e" | ||
+ | STDOUBLE | ||
+ | |||
+ | ;;-- to perform the second assignment (to "d"), duplicate the value on the stack | ||
+ | DUP64 | ||
+ | |||
+ | LOCAL -8 ; write value to "d" | ||
+ | STDOUBLE | ||
− | + | ;;-- the assignments are an instruction: trash the value left on the stack | |
− | + | TRASH 8 | |
− | + | ;;-- now to perform the add operation | |
− | + | LOCAL -8 | |
+ | LDDOUBLE ; load "d" | ||
+ | LOCAL -16 | ||
+ | LDDOUBLE ; load "e" | ||
− | DADD | + | DADD ; leaves result on the stack |
− | + | EXTERN printd | |
CALL printd | CALL printd | ||
− | TRASH 8 | + | TRASH 8 ; argument value no longer needed |
INT 0 | INT 0 | ||
− | + | STFVAL32 | |
LEAVE | LEAVE | ||
RET | RET | ||
− | </asm | + | </source> |
+ | }} | ||
+ | == Compiling and Running == | ||
+ | |||
+ | Assuming that the code above is in file dbl.pf, the following commands ([[Compiladores/Projecto de Compiladores/Compiladores Exemplo|pf2asm]]) would compile and run the program: | ||
+ | |||
+ | pf2asm dbl.pf | ||
+ | yasm -felf32 dbl.asm | ||
+ | ld -m elf_i386 -o dbl dbl.o -lrts | ||
+ | ./dbl | ||
− | [[category: | + | [[category:Compiladores]] |
− | [[category: | + | [[category:Ensino]] |
The following pure-Postfix program illustrates duplication of double-precision floating point numbers on the stack.
The C equivalent would be (roughly):
int main() {
extern void printd(double);
double d, e;
d = e = 3.3e-2;
printd(d + e);
return 0;
}
Note that this program's code does not necessarily correspond to any particular code generator output.
Postfix code |
---|
;;-- generation of the "_main" function
TEXT
ALIGN
GLOBAL _main, FUNC
LABEL _main
ENTER 16 ; d@-8 and e@-16
;;-- put double literal in RODATA
RODATA
ALIGN
LABEL _L123
SDOUBLE 3.3e-2
;;-- load literal onto stack
TEXT
ADDR _L123
LDDOUBLE
;;-- to perform the first assignment (to "e"), duplicate the value on the stack
DUP64
LOCAL -16 ; write value to "e"
STDOUBLE
;;-- to perform the second assignment (to "d"), duplicate the value on the stack
DUP64
LOCAL -8 ; write value to "d"
STDOUBLE
;;-- the assignments are an instruction: trash the value left on the stack
TRASH 8
;;-- now to perform the add operation
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
|
Assuming that the code above is in file dbl.pf, the following commands (pf2asm) would compile and run the program:
pf2asm dbl.pf yasm -felf32 dbl.asm ld -m elf_i386 -o dbl dbl.o -lrts ./dbl