Assembly: String Input (word size) and Re-printing
Question
I don't know what went wrong. I want to input string in WORD size and add a integer to the inputted value of string and reprint the results. I'm not really sure in the arithmetic operations since this is my first time in using many operations in a single program and they are in 16 bits.
clr macro
mov ax, 03h
int 10h
endm
cseg segment para 'code'
assume cs:cseg; ds:cseg; ss:cseg; es:cseg
org 100h
start: jmp begin
amount_s label word
amount_max dw 3
amount_length dw ?
amount_field dw 3 dup (?)
x1 dw 0
x2 dw 0
sum1 dw 0
sum2 dw 0
bal dw 10
begin: clr
mov ah, 0Ah ;input string
lea dx, amount_s
mov cx, amount_length
lea si, amount_field
int 21h
mov ax, [si] ;copy si to ax
sub ax, 30h ;converts value of ax to integer
mov bx, 10 ;copy 10 to bx
mul bx ;multiply it ax by bx
mov x1, ax ; copy ax to x1
inc si ;move si pointer by 1
mov ax, [si] ;copy si to ax
sub ax, 30h ;converts value of ax to integer
mov x2, ax ; copy ax to x2
add ax, x1 ;add ax which is x2 by x1
add ax, bal ; add ax by bal which is 10
mov sum1, ax ;copy the result to sum1
mov dx, 0 ; copy 0 to dx
mov bx, 10 ; copy 10 to bx
div bx ;divides ax by bx
mov sum1, ax ; copy quotient to sum1
mov sum2, dx ; copy remainder to sum2
add sum1, 30h ;convert for printing
add sum2, 30h ;convert for printing
mov ah, 02h ;prints sum1
mov dx, sum1
int 21h
mov ah, 02h ;prints sum2
mov dx, sum2
int 21h
int 20h
cseg ends
end start
La solution
How about debugging and checking reference documentation to see what goes wrong and how? :)
One thing I can tell outright, the structure that the function 0ah of int 21h uses contains byte fields, not word fields.
And yet you declare them as words (dw
), not bytes (db
):
amount_max dw 3
amount_length dw ?
amount_field dw 3 dup (?)
And you shouldn't be accessing them as words as you do with:
mov ax, [si]
Instead, read bytes:
mov al, [si]
And if you want to convert byte values into word values, just stick a 0 into the top byte of the word register like so:
mov ah, 0
The rest looks reasonable, but I have not run the code. You should do it. In a debugger, if it's not working right.