{ASM}Calka x^3

0

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>
0

Dorzuć jakieś komentarze.....

1 użytkowników online, w tym zalogowanych: 0, gości: 1