Runtime error of TASM language help!
Posted
by dominoos
on Stack Overflow
See other posts from Stack Overflow
or by dominoos
Published on 2010-05-20T20:05:58Z
Indexed on
2010/05/20
20:10 UTC
Read the original article
Hit count: 486
.model small .stack 400h .data
message db "hello. ", 0ah, 0dh, "$" firstdigit db ? seconddigit db ? thirddigit db ? number dw ? newnumber db ? anumber dw 0d bnumber dw 0d Firstn db 0ah, 0dh, "Enter first 3 digit number: ","$" secondn db 0ah, 0dh, "Enter second 3 digit number: ","$" messageB db 0ah, 0dh, "HCF of two number is: ","$" linebreaker db 0ah, 0dh, ' ', 0ah, 0dh, '$'
.code
Start: mov ax, @data ; establish access to the data segment mov ds, ax ; mov number, 0d
mov dx, offset message ; print the string "yob choi 0648293"
mov ah, 9h
int 21h
num:
mov dx, offset Firstn ; print the string "put 1st 3 digit"
mov ah, 9h
int 21h ;run
JMP FirstFirst ; jump to FirstFirst
FirstFirst:
;first digit
mov ah, 1d ;bios code for read a keystroke
int 21h ;call bios, it is understood that the ascii code will be returned in al
mov firstdigit, al ;may as well save a copy
sub al, 30h ;Convert code to an actual integer
cbw ;CONVERT BYTE TO WORD. This takes whatever number is in al and
;extends it to ax, doubling its size from 8 bits to 16 bits
;The first digit now occupies all of ax as an integer
mov cx, 100d ;This is so we can calculate 100*1st digit +10*2nd digit + 3rd digit
mul cx ;start to accumulate the 3 digit number in the variable imul cx
;it is understood that the other operand is ax
; the result will use both dx::ax
;dx will contain only leading zeros
add anumber, ax ;save
;Second Digit
mov ah, 1d ;bios code for read a keystroke
int 21h ;call bios, it is understood that the ascii code will be returned in al
mov seconddigit, al ;may as well save a copy
sub al, 30h ;Convert code to an actual integer
cbw ;CONVERT BYTE TO WORD. This takes whatever number is in al and
;extends it to ax, boubling its size from 8 bits to 16 bits
;The first digit now occupies all of ax as an integer
mov cx, 10d ;continue to accumulate the 3 digit number in the variable
mul cx ;it is understood that the other operand is ax, containing first digit
;the result will use both dx::ax
;dx will contain only leading zeros.
add anumber, ax ;save
;third Digit mov ah, 1d ;samething as above int 21h ; mov thirddigit, al ; sub al, 30h ; cbw ;
add anumber, ax ; jmp num2 ;go to checks
Num2:
mov dx, offset secondn ; print the string "put 2nd 3 digits"
mov ah, 9h
int 21h ;run
JMP SecondSecond
SecondSecond:
;first digit
mov ah, 1d ;bios code for read a keystroke
int 21h ;call bios, it is understood that the ascii code will be returned in al
mov firstdigit, al ;may as well save a copy
sub al, 30h ;Convert code to an actual integer
cbw ;CONVERT BYTE TO WORD. This takes whatever number is in al and
;extends it to ax, doubling its size from 8 bits to 16 bits
;The first digit now occupies all of ax as an integer
mov cx, 100d ;This is so we can calculate 100*1st digit +10*2nd digit + 3rd digit
mul cx ;start to accumulate the 3 digit number in the variable imul cx
;it is understood that the other operand is ax
; the result will use both dx::ax
;dx will contain only leading zeros
add bnumber, ax ;save
;Second Digit
mov ah, 1d ;bios code for read a keystroke
int 21h ;call bios, it is understood that the ascii code will be returned in al
mov seconddigit, al ;may as well save a copy
sub al, 30h ;Convert code to an actual integer
cbw ;CONVERT BYTE TO WORD. This takes whatever number is in al and
;extends it to ax, boubling its size from 8 bits to 16 bits
;The first digit now occupies all of ax as an integer
mov cx, 10d ;continue to accumulate the 3 digit number in the variable
mul cx ;it is understood that the other operand is ax, containing first digit
;the result will use both dx::ax
;dx will contain only leading zeros.
add bnumber, ax ;save
;third Digit mov ah, 1d ;samething as above int 21h ; mov thirddigit, al ; sub al, 30h ; cbw ;
add bnumber, ax ; jmp compare ;go to compare
compare:
CMP ax, anumber ;comparing numbB and Number JA comp1 ;go to comp1 if anumber is bigger CMP ax, anumber ; JB comp2 ;go to comp2 if anumber is smaller CMP ax, anumber ; JE equal ;go to equal if two numbers are the same JMP compare ;go to compare (avioding error)
comp1:
SUB ax, anumber; subtract smaller number from bigger number JMP compare ;
comp2: SUB anumber, ax; subtract smaller number from bigger number JMP compare ;
equal: mov ah, 9d ;make linkbreak after the 2nd 3 digit number mov dx, offset linebreaker int 21h mov ah, 9d ;print "HCF of two number is:" mov dx, offset messageB int 21h
mov ax,anumber ;copying 2nd number into ax
add al,30h ; converting to ascii
mov newnumber,al ; copying from low part of register into newnumb
mov ah, 2d ;bios code for print a character mov dl, newnumber ;we had saved the ascii code here int 21h ;call to bios
JMP exit;
exit:
mov ah, 4ch
int 21h ;exit the program
End
hi, this is a program that finds highest common factor of 2 different 3digit number. if i put 200, 235,312 (low numbers) it works fine. but if i put 500, 550, 654(bigger number) the program crashes after the 2nd 3digit number is entered. can you help me to find out what problem is?
© Stack Overflow or respective owner