You are on page 1of 20

LOOP dekrementuje ECX

Return value se vždy ukládá do EAX


%include 'rw32-2022.inc'

;extern printf ;extern printf se nachazi v knihovne rw32

section .data

w_float dd -1234.5678
w_double dq 2.718281828459045

r_float dd 0.0
r_double dq 0.0

frm_tisk db "Cislo typu double pomoci printf: %f",10,13,0

section .text

main:
; vypis: 32-bitove cislo
mov eax,[w_float]
call WriteFloat
call WriteNewLine

; vypis: 64-bitove cislo


fld qword [w_double]
call WriteDouble
call WriteNewLine

; cteni: 32-bitove cislo


call ReadFloat
; ulozeni nacteneho cisla do pameti
mov [r_float],eax
; vypis
call WriteFloat
call WriteNewLine

; cteni: 64-bitove cislo


call ReadDouble
; ulozeni nacteneho cisla do pameti
fst qword [r_double]
; vypis
call WriteDouble
call WriteNewLine

; vypis: 64-bitove 'double' pomoci printf


push dword [r_double+4] ; 64-bitove cislo na 2x protoze ve 32-bitovem
push dword [r_double] ; rezimu neni podporvana instrukce PUSH QWORD ...
push dword frm_tisk
call printf
add esp,12 ; odstrani 4*3 byte ze zasobniku (parametry printf)
ret
Užitečné ukázky kódu
===================================================================

; st0 st1 st2 st3 st4 st5 st6 st7

fld dword [a] ; a - - - - - - -

fld qword [b] ; b a - - - - - -

fld tword [c] ; c b a - - - - -

fild dword [d] ; d c b a - - - -

fild word [e] ; e d c b a - - -

push 10

fild dword [esp] ; 10 e d c b a

add esp, 4

fld1 ; 1 10 e b c d a

fldz ; 0 1 10 e b c d a

;fldpi ; 3.14 ... zde dojde k preteceni zasobniku a v fstat se

;ulozi error ktery ale nejde videt ale je kriticky

fst dword [a] ; do [a] se ulozi vrchol zasobniku jako float

fist dword [b] ; do [b] se ulozi vrchol zasobniku jako int

; do [b] se ulozi vrchol zasobniku jako float a vrchol se popne

fstp qword [b] ; 1 10 e b c d a -

; do [e] se ulozi vrchol zasobniku jako int a vrchol se popne

fistp word [e] ; 10 e b c d a - -

; vyprazdnit zasobnik se da pomoci

fstp st0 ; takto muzu popnout jakykoliv st registr, pozor na podteceni

fxch st0, st3 ; prohodi st registry

=====================================================================
===================================================================

; fcom = porovna dva floaty - st0 ? st1


; fcmom src - st0 ? src
; fcom src0, src1 - src0 ? src1

; fcomp st0 ? st1 && pop


; fcompp st0 ? st1 && pop && pop

; ficom src - st0 ? src


; ficom src0, src1 - src0 ? src1

; vysledek fcom se uklada do stavoveho registru fstat

fld1
fldpi
fcom

;fstsw src
; src = mem/ax
fstsw ax
sahf
; fcomi == fcom && fstsw && sahf

; ftst ... st0 ? 0.0

ja .st0_vetsi_st1
jb .st0_mensi_st1
je .st0_je_st1

.st0_vetsi_st1:
nop
jmp cont
.st0_mensi_st1:
nop
jmp cont
.st0_je_st1:
nop
jmp cont
cont:

====================================================================
;jak vyrobit NaN
FPU_COND_MASK EQU 0x4500
FPU_IS_NAN EQU 0x0100
FPU_INF_POS EQU 0x7f80_0000
FPU_INF_NEG EQU 0xff80_0000
FPU_NAN_POS EQU 0x7fc0_0100
FPU_NAN_NEG EQU 0xffc0_0100
; fxam - kontroluje ze v st0 je normal number
fxam
fstsw ax
sahf
and ax, FPU_COND_MASK ; maska abych si vytahl c3,c2,c0
cmp ax, FPU_IS_NAN ; je to NaN?
je .je_nan

.je_nan:

;Jak pushnout floaty jako argumenty:

push __float32__(10.0)
push __float32__(1.0)
push __float32__(5.0)
call fce
add esp, 12

You might also like