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
Was it helpful?

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top