UMBC | CMSC 313 -- Assembly Language Segment | Previous | Next |
What is important to us is that there are 8 data registers, which are treated as a stack. The top of the stack is referred to as ST0 and things are pushed and popped onto the stack. Actually, the top is ST0, the next one down is ST1, then ST2. Whenever something is put on the stack, the new item becomes ST0, the old ST0 becomes ST1, etc. When something comes off the stack, the old ST1 becomes ST0, the old ST2 becomes ST1, etc. Load operations push a value on top of the stack. Store operates pop a value of the stack. Well, sort of! There are load and store intstructions that do not do a push or pop.
section .data fnr1 dd 1.2 fnr2 dd 2.3 fnr3 dd 3.4 outstr db 'result is %f',10,0 section .bss qnr1 resq 1 section .text global main ;must be declared for linker (ld) ;; just like main in C -- if linking with gcc, must be main, otherwise does not have to. main: ;tell linker entry point extern printf ;; put your code here finit ; Initialize the FPU and clear errors fld dword [ fnr1 ] ; st0 : 1.2000000476837158203125 fld dword [ fnr2 ] ; st0 : 2.2999999523162841796875 ; st1 : 1.2000000476837158203125 fadd st1 ; st0 : 3.5 ; st1 : 1.2000000476837158203125 fld dword [ fnr3 ] ; st0 : 3.400000095367431640625 ; st1 : 3.5 ; st2 : 1.2000000476837158203125 fadd st1 ; st0 : 6.900000095367431640625 ; st1 : 3.5 ; st2 : 1.2000000476837158203125 fstp qword [ qnr1 ] ; st0 : 3.5 ; st1 : 1.2000000476837158203125 push dword [ qnr1 +4] push dword [ qnr1 ] push outstr call printf add esp, 8 ;; The final part of the program must be a call to the operating system to exit ;;; the program. mov ebx,0 ;successful termination of program mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel