diff --git a/x86/PROGRAM.ASM b/x86/PROGRAM.ASM
@@ -1,29 +1,130 @@
.model tiny
+.stack 100h
+
.data
- intro db "Hey", 0dh, 0ah, "$"
- proof db "The conjecture is proved for all natural numbers smaller or equals to", 0dh, 0ah, "10000!", 0dh, 0ah, "$"
+ buffer db 20 DUP(30h)
+ invalid db " is not a natural number!", 0dh, 0ah, 0dh, 0ah, "$"
+
+ proof db "The conjecture is proved for all natural numbers smaller or equals to 10000!", 0dh, 0ah, "$"
+
+ intro1 db 0dh, 0ah, "This program is a simple test for the following conjecture:", 0dh, 0ah, "$"
+ intro2 db 0dh, 0ah, "Let S: N -> N be the sum of the digits of a positive integer.", 0dh, 0ah, "$"
+ intro3 db "For all A and B in N, S(A + B) = S(A) + S(B) - 9k, where k is an integer.", 0dh, 0ah, "$"
+ intro4 db 0dh, 0ah, "What value would you like to test the conjecture for? $"
.code
-org 100h
+ org 100h
start:
- mov dx, offset intro
+ mov ax, @data
+ mov ds, ax
+
+ ; Print the intro messages to the screen
mov ah, 9h
+ mov dx, offset intro1
+ int 21h
+ mov dx, offset intro2
int 21h
+ mov dx, offset intro3
+ int 21h
+ mov dx, offset intro4
+ int 21h
+
+ ; Retrieve user input
+ call read_uint
+ mov bx, ax
mov ax, 0
call iter
+read_uint:
+ ; Load the user input into the buffer
+ mov ax, cs
+ mov ds, ax
+ mov dx, 0
+ mov buffer[0], 20 ; Configure the buffer length
+ mov dl, offset buffer
+ mov ah, 0ah
+ int 21h
+
+ mov ax, 0 ; Initialize the register were the result will be stored
+ mov cx, 2 ; Initialize a counter
+ mov si, offset buffer
+ add si, 3
+
+read_loop:
+ mov bx, 0 ; Clear bx
+ mov bl, [si] ; Read a character into bx
+ inc cx ; Increment the counter
+ inc si ; Increment the source index
+
+ ; Check if it's a numeric character
+ cmp bl, 30h
+ jb short invalid_input
+ cmp bl, 39h
+ ja short invalid_input
+
+ ; Convert the character code into a decimal digit
+ sub bl, 30h
+
+ ; ax = ax * 10 + bx
+ push cx
+ mov cx, 10
+ mul cx
+ pop cx
+ add ax, bx
+
+ ; Jump if the counter is still smaller than the buffer length
+ cmp cl, buffer[0]
+ jb short read_loop
+ cmp cl, buffer[1]
+ jb short read_loop
+ ret
+
+invalid_input:
+ mov ah, 2
+
+ ; Print '\''
+ mov dx, 27h
+ int 21h
+
+ mov si, offset buffer
+ mov cx, 0
+
+invalid_input_loop:
+ mov dl, [si]
+ int 21h
+ inc cx
+ inc si
+
+ cmp cl, 6
+ jbe short invalid_input_loop
+
+invalid_input_end:
+ ; Print '\''
+ mov dx, 27h
+ int 21h
+
+ ; Print the rest of the message
+ mov ah, 9h
+ mov dx, offset invalid
+ int 21h
+
+ call quit
+ ret
+
+; Iterate ax from 0 to 10000
iter:
call test_num
- add ax, 1
+ inc ax
cmp ax, 10000
- jle short iter
+ jbe short iter
call proved
+; Iterate bx from 0 to ax
test_num:
mov bx, 0
test_loop:
@@ -36,10 +137,10 @@ test_loop:
pop ax
pop bx
- add bx, 1
+ inc bx
cmp bx, ax
- jle short test_loop
+ jbe short test_loop
ret
test_pair:
@@ -86,25 +187,24 @@ sum_loop:
; Loop until ax equals 0
cmp ax, 0
- jg short sum_loop
+ ja short sum_loop
ret
proved:
- ; Print the message to the screen
- mov dx, offset proof
mov ah, 9h
+ mov dx, offset proof
int 21h
call quit
ret
+
disproved:
- mov dx, offset proof
mov ah, 9h
+ mov dx, offset proof
int 21h
call quit
ret
quit:
- mov ah, 4ch
- int 21h
+ int 20h
end start