I've spent the whole thinking about how to solve this and I just cannot seem to make it work although I think everything should be fine.
This is supposed to be a calculator, so when user enters a number, the digits entered are stored in a 4 byte array called num1 in the order they were typed. Initially num1 array it's full of 0's, so let's suppose a user types 9764, then array will be [9,7,6,4] but if user types, say 89, array will be [8,9,0,0].
The program uses a byte counter beginning in 0 to store the number of times a user typed a number and to keep track of the position it will be placed. As a usual array, position 0 goes first, then counter increases by one with next number entered and so on up to 4.
The number entered by the user should be stored in a word called num1h beginning with a 0 value as well.
So my approach was the following... let's try with 875
num1 = [8,7,5,0]
Counter = 3
Counter - 1 = 2
num1[2] = 5
5 x 1 = 5
num1h + 5 = 5
Counter - 1 = 1
num1[1] = 7
7 x 10 = 70
num1h + 70 = 75
Counter - 1 = 0
num1[0] = 8
8 x 100 = 800
num1h + 800 = 875
So this is the code I'm using, but when I enter 875, I receive 0005 as a result
NUM1P proc
push ax
push bx
push cx
push dx
mov di, counter
mov ax,0
mov bx,1
power_base:
dec di
mov al, [num1+di]
mul bx
add num1h,ax
mov ax,bx
mov bx, 10
mul bx
mov bx,ax
mov ax,0
cmp di,0
jl exitn1p
exitn1p:
pop dx
pop cx
pop bx
pop ax
ret
endp
Printing function works perfectly fine, i've tested it implementing immediate values and it just prints 0's to the left, example 875 -> 0875, but that's totally fine. Instead when I try to transfer num1h to it, this is what happens so the problem should be in my code.
Any suggestions?
I tried some other code like this, but definately not the best solution because it takes for granted every digit in the first position it's in the thousands place and so on...
TESTPROC proc
push ax
push bx
mov ax,0
mov bx,0
movzx ax, [num1]
mov bx, 1000
mul bx
add num1h, ax
movzx ax, [num1+1]
mov bx, 100
mul bx
add num1h, ax
movzx ax, [num1+2]
mov bx, 10
mul bx
add num1h, ax
movzx ax, [num1+3]
add num1h, ax
pop bx
pop ax
ret
endp