Witam
Mam mały problem , w programie licze na koprocesorze całkę x^3 z przedzialu od -1 do 2 , a konkretnie pole pod wykresem , metoda trapezow, nie wiem czemu ale cos gdzies sknocilem i nie wypisuje mi wyniku i nie moge dosc co jest nie tak .
Bardzobylbym wdzieczny za wskazanie bledu lub ewentulane poprawinie tego.
Z gory dziekuje i pozdrawiam oraz życzę wesolych świat :)
.
.model small
.stack 512
.486
.data
n dw 0
n1 dw 0
n2 dw 0
n3 dw 0
a dd 0
a1 dw 0
a2 dw 0
a3 dw 0
b dd 0
b1 dw 0
b2 dw 0
b3 dw 0
c dd 0
d dd 0
x dd 0
lic dd 0
przesun dd 0
przesun2 dd 0
pods1 dd 0
pods2 dd 0
pole dd 0
calo dw 0
znak dw 0
db '$'
wyn1 dw 0
suma dd 0.0
dz dd 10.0
sto dd 100.0
jed dw 0000000000000001b
min dw 1111111111111111b
dwa dw 0000000000000010b
zero dw 0
pobieraniecyfry db 'Podaj n [liczba z zakresu 001-999]:$'
poba db 'a=$'
pobb db 'b=$'
wynik db 'Wynik calki x^3 wynosi: $'
clrscr macro ; czyszczenie ekranu
mov al,0
mov cx,0
mov dh,25
mov dl,80
mov bh,15
mov ah,6
int 10h
endm
ustaw_kursor macro A,B ; ustawianie kursora w danym miejscu programu
mov dh,A
mov dl,B
mov bh,0
mov ah,2
int 10h
endm
wysw_cyfre macro G ; wstawaniaie cyfry poprzed dodanie 30 aby mogl wyswietlic litere
mov dl, G
add dl, 30h
mov ah,2
int 21h
endm
konwertuj macro
fst suma
fld suma
frndint
call zaok_dol
fist calo
mov bx, calo
fxch
fsubr
fld dz
fmul
endm
.code
mov ax,@data
mov ds,ax
clrscr
ustaw_kursor 4,10
lea dx,pobieraniecyfry
mov ah,9
int 21h
ustaw_kursor 5,10
call pob_cyf
mov n1,ax
call pob_cyf
mov n2,ax
call pob_cyf
mov n3,ax
;------------ Zamienianie n asci na liczbe --------------
;finit
; fild n3
; fild n2
; fld dz
;fild n1
; fld sto
; fmulp
; fxch ST(2)
; fmulp
; faddp
; faddp
; fistp n
ustaw_kursor 7,10
lea dx, poba
mov ah,9
int 21h
;-----------Pobieranie i zamienianie zmiennej a------------
call pob_znak
mov znak,ax
cmp ax,'-'
jz p1
mov min,0000000000000001b
p1:
call pob_cyf
mov a1,ax
call wysw_kr
call pob_cyf
mov a2,ax
call pob_cyf
mov a3,ax
finit
fild min
fild a1
fld dz
fild a2
fild a3
fld sto
fdivp
fxch ST(2)
fdivp
faddp
faddp
fmulp
fstp a
ustaw_kursor 8,10
lea dx, pobb
mov ah,9
int 21h
mov min,1111111111111111b
;-----------Pobieranie i zamienianie zmiennej b------------
call pob_znak
mov znak,ax
cmp ax,'-'
jz p2
mov min,0000000000000001b
p2:
call pob_cyf
mov b1,ax
call wysw_kr
call pob_cyf
mov b2,ax
call pob_cyf
mov b3,ax
finit
fild min
fild b1
fld dz
fild b2
fild b3
fld sto
fdivp
fxch ST(2)
fdivp
faddp
faddp
fmulp
fstp b
; tu zaczyna sie liczenie calki na koprocesorze
;-----------Wyznaczanie pierwszych wartosci x, c i d ------------
fld b ;x=(b-a)/n
fld a
fsubp
fild n
fdivp
fstp x
;--wyznaczanie pola jednego z trapezow--------------------------
mov cx ,n
petla_liczaca:
fild a
fild x ;c=1/a
fadd
fstp przesun ; wyznaczanie 2 odcinkow ktore sa potrzebne do wyznaczenia podstawy
fild a
fild x ; C= przesun !!
fadd
fstp przesun2
;---------------wyznaczenie x^3 dla obu stanow
fild przesun
fild przesun
fmul
fild przesun
fmul
fstp pods1
fild przesun2
fild przesun2
fmul
fild przesun2
fmul
fstp pods2
; liczenie danego pola najmiejszego elementranego trapezu
fild pods1
fild pods2
fadd
fild dwa
fdiv
fild x
fmul
fstp pole
;===============wyznaczanie sumy danego przejscia
fild pole
fild suma
fadd
fstp suma
loop petla_liczaca
fst suma ;przepisywanie wyniku ze stosu do zmiennej suma
;--------------Wyswietlanie wyniku---------------
ustaw_kursor 10,10
lea dx,wynik
mov ah, 9
int 21h
fild zero
fcomp st(1)
fstsw ax
sahf
jz calosc
jc wieksza
mniejsza:
mov dl,'-'
mov ah,2
int 21h
jmp calosc
wieksza:
mov dl,'+'
mov ah,2
int 21h
calosc:
fabs
konwertuj
cmp bl,10
jge dwucyf
jl jednocyf
dwucyf:
xor ax,ax
mov al,bl
mov bl,10
idiv bl
mov bl,ah
wysw_cyfre al
wysw_cyfre bl
jmp krr
jednocyf:
wysw_cyfre bl
krr:
call wysw_kr
mov cx,6
poprzecinku:
konwertuj
wysw_cyfre bl
loop poprzecinku
;-------Zakonczenie programu----------------------
mov ah,7
int 21h
mov ah,4ch
int 21h
zaok_dol proc
fcom st(1)
fstsw ax
sahf
jc mn
fild jed
fxch
fsubr
mn:
ret
endp
wysw_kr proc
mov dl,','
mov ah,2
int 21h
ret
endp
pob_znak proc
et1:
mov ah,7
int 21h
cmp al,'-'
je et2
cmp al,'+'
jl et1
jg et1
et2:
mov dl,al
mov ah,2
int 21h
mov ah,0
ret
endp
pob_cyf proc
ety1:
mov ah,7
int 21h
cmp al,'0'
jl ety1
cmp al,'9'
jg ety1
mov dl,al
mov ah,2
int 21h
sub al,30h
mov ah,0
ret
endp
end
</quote>