This is the code I have tried and it only works with 3 digits numbers but the sum does not exceed 1000 for adding 3 digit numbers that exceeds 1000 just outputs 1000. I also have a problem fixing adding 1 and 2 digit numbers as inputting 1 and 2 digits numbers results in invalid character. I am confused and been working with this code for 6 hours now and still haven’t fixed it.
sum segment
assume cs:sum, ds:sum, ss:sum
org 0100h
program:
jmp begin
var1 db 0Dh, 0Ah, 'ADD NUMBERS PLEASE','$'
var2 db 0Dh, 0Ah, 'Add 2 Numbers.','$'
var3 db 0Dh, 0Ah, 'Input any number (0-999):', '$'
var4 db 0Dh, 0Ah, 'Input any number (0-999):', '$'
var5 db 0Dh, 0Ah, 'Sum:','$'
num11 db 0
num12 db 0
num13 db 0
num21 db 0
num22 db 0
num23 db 0
sum1 db 0
sum2 db 0
sum3 db 0
sum4 db 0
var6 db 0Dh, 0Ah, 'Invalid Character','$'
var7 db 0Dh, 0Ah, 'Do you want to repeat (y/n):','$'
showstr proc
mov ah, 09h
int 21h
ret
showstr endp
clearscr proc
push bx
mov al, 00h
mov bh, 0Fh
mov ah, 06h
int 10h
pop bx
ret
clearscr endp
checknum1 proc
cmp al, '0'
jb invalid_char1
cmp al, '9'
ja invalid_char1
ret
valid_char1:
ret
invalid_char1:
mov dx, offset var6
call showstr
jmp num1
checknum1 endp
checknum2 proc
cmp al, '0'
jb invalid_char1
cmp al, '0'
ja invalid_char1
ret
valid_char2:
ret
invalid_char2:
mov dx, offset var6
call showstr
jmp num2
checknum2 endp
add_digit1 proc
sub bh, '0'
sub bl, '0'
add bh, bl
cmp bh, 9
ja carry1
jmp nocarry1
carry1:
sub bh, 10
inc sum2
ret
nocarry1:
add sum1, bh
ret
add_digit1 endp
add_digit2 proc
sub bh, '0'
sub bl, '0'
add bh, bl
cmp bh, 9
ja carry2
jmp nocarry2
carry2:
sub bh, 10
inc sum3
ret
nocarry2:
add sum2, bh
ret
add_digit2 endp
add_digit3 proc
sub bh, '0'
sub bl, '0'
add bh, bl
cmp bh, 9
ja carry3
jmp nocarry3
carry3:
sub bh, 10
inc sum4
ret
nocarry3:
add sum3, bh
ret
add_digit3 endp
repeatprog proc
cmp al, 'y'
je begin
jmp exit
repeatprog endp
begin:
mov ax, sum
mov ds, ax
mov sum1, 0
mov sum2, 0
mov sum3, 0
mov sum4, 0
call clearscr
mov dx, offset var1
call showstr
num1:
lea dx, var3
call showstr
mov ah, 01h
int 21h
call checknum1
mov num13, al
mov ah, 01h
int 21h
call checknum1
mov num12, al
mov ah, 01h
int 21h
call checknum1
mov num11, al
num2:
lea dx, var4
call showstr
mov ah, 01h
int 21h
call checknum2
mov num23, al
mov ah, 01h
int 21h
call checknum2
mov num22, al
mov ah, 01h
int 21h
call checknum2
mov num21, al
mov bl, num11
mov bh, num21
call add_digit1
mov bl, num12
mov bh, num22
call add_digit2
mov bl, num13
mov bh, num23
call add_digit3
lea dx, var5
call showstr
mov dl, sum4
add dl, '0'
mov ah, 02h
int 21h
mov dl, sum3
add dl, '0'
mov ah, 02h
int 21h
mov dl, sum2
add dl, '0'
mov ah, 02h
int 21h
mov dl, sum1
add dl, '0'
mov ah, 02h
int 21h
lea dx, var7
call showstr
mov ah, 01h
int 21h
call repeatprog
exit:
mov ah, 4ch
int 21h
sum ends
end program
I have tried this fix but it still won’t work:
checknum1 proc
cmp al, '0'
jb invalid_char1
cmp al, '9'
ja invalid_char1
ret
valid_char1:
ret
invalid_char1:
mov dx, offset var6
call showstr
jmp num1
checknum1 endp
checknum2 proc
cmp al, '0'
jb invalid_char2
cmp al, '9'
ja invalid_char2
ret
valid_char2:
ret
invalid_char2:
mov dx, offset var6
call showstr
jmp num2
checknum2 endp
New contributor
Nathaniel Faa is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
1