[Asm]problem z procedurą

0

mam program który liczy nwd i nww z tym że wynik nwd zostaje wyświetlony a wynik nww nie i nie mogę znaleźć gdzie jest błąd. program dobrze sie kompiluje - na tasmie. Jeżeli gdzieś widzicie błędy to bardzo proszę o poprawienie.

.model tiny
.data
msg1 db 'test', '$'
msg2 db 'nwd z $'
msg3 db ' i $'
msg4 db ' wynosi $'
msg5 db 0ah,0dh,'$'
msg6 db 'podaj x:$'
msg7 db 'podaj Y:$'
msg8 db 'kontynuowac(Yes/No):$'
msg8 db 'kontynuowac(Yes/No):$'
nwd dw ?

.code

START: MOV AX,@data
MOV DS,AX
MOV DX,OFFSET MSG1
CALL DISPSTR

CONTINUE:CALL NEWLINE
CALL NEWLINE
MOV DX, OFFSET MSG6
CALL DISPSTR
CALL GETDGT
MOV BX,AX
MOV DX, OFFSET MSG7
CALL DISPSTR
CALL GETDGT
CALL NEWLINE
CALL SHOWGCD
MOV DX, OFFSET MSG8
CALL DISPSTR
QUERY: MOV AH,8
INT 21H
CMP AL,'y'
JE CONTINUE
CMP AL,'Y'
JE CONTINUE
CMP AL,0DH
JE CONTINUE
CMP AL,'n'
JE EXIT
CMP AL,'N'
JE EXIT
JMP QUERY

EXIT: MOV AX,4C00H
INT 21H

NEWLINE PROC
PUSH AX
PUSH DX
MOV DX, OFFSET MSG5
MOV AH,9
INT 21H
POP DX
POP AX
RET
ENDP

GETDGT PROC
PUSH BX
PUSH CX
PUSH DX
GETDGT0:MOV BX,0
MOV CX,10
MOV AH,8
INT 21H
CMP AL,'+'
JNE G001
MOV DL,AL
MOV AH,2
INT 21H
JMP GETDGT1
G001: CMP AL,'-'
JNE G002
MOV DL,AL
MOV AH,2
INT 21H
JMP GETDGT1
G002: CMP AL,'0'
JL GETDGT0
CMP AL,'9'
JG GETDGT0
JMP GETDGT4
GETDGT1:MOV AH,8
INT 21H
GETDGT3:
CMP AL,0DH
JE GETDGT2

    CMP AL,'0' 
    JL GETDGT1
    CMP AL,'9' 
    JG GETDGT1

GETDGT4: MOV DL,AL
MOV AH,2
INT 21H
MOV DH,0
SUB DL,30H
MOV AX,BX
PUSH DX
MOV DX,0
IMUL CX
POP DX
ADD AX,DX
MOV BX,AX
JMP GETDGT1
GETDGT2:
MOV AX,BX
CMP AX,0
JE GETDGT0
POP DX
POP CX
POP BX
RET
ENDP

SHOWGCD PROC
PUSH DX
MOV DX,OFFSET MSG2
CALL DISPSTR
CALL DISPNUM
MOV DX,OFFSET MSG3
CALL DISPSTR
PUSH AX
MOV AX,BX
CALL DISPNUM
POP AX
CALL GCD
MOV DX,OFFSET MSG4
CALL DISPSTR
CALL DISPNUM
MOV DX,OFFSET MSG5
CALL DISPSTR
POP DX
RET
ENDP

GCD proc
push cx
push dx
call ABS0
push ax
mov ax,bx
call ABS0
pop bx
LOOP1: mov dx,0h
idiv bx

       mov ax,bx    
       mov bx,dx  
       mov dx,0
       cmp bx,0
       jg  LOOP1
       pop dx
       pop cx
       pop cx
       mov nwd,ax
       ret
       endp   
       ret
       endp           

ABS0 PROC
cmp ax,0
jge ABS1
not ax ;if ax<0 then ax = ax -1
inc ax
ABS1:
ret
endp

DISPNUM PROC
PUSH DX
PUSH CX
PUSH BX
PUSH AX
MOV CX,0
MOV DX,0
MOV BX,10
DISP1: IDIV BX
PUSH DX
MOV DX,0
INC CX
CMP AX,0
JNE DISP1
DISP2: CMP CX,0
JE DISP3
POP DX
DEC CX
ADD DL,'0'
MOV AH,02
INT 21H
JMP DISP2
DISP3: POP AX
POP BX
POP CX
POP DX
RET
ENDP

nww proc
push ax
push bx
push dx
push cx
call ABS0
push ax
mov ax,bx
call ABS0
pop bx
mul bx
div nwd
mov dl,ah
mov ah,02h
int 21h
pop cx
pop dx
pop bx
pop ax
ret
endp

DISPSTR PROC
PUSH AX
MOV AH,9
INT 21H
POP AX
RET
ENDP
END START

0

Jeżeli nadal ci na tym zależy to podaj maila.
Mowie do wszystkich teraz:
Jeżeli macie problemy z kodem źródłowym to podawajcie maila bo nie ma sensy zarzucanie źródłami forum.

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