以下是程序,簡單說明幾點:
1. 由於輸入、輸出的都是字符,所以用了兩個函數。Atoi16是把輸入的字符轉為正整數,I16toa 是把整數轉成字符串。
2. 調用Atoi16時,要配好si和cl兩個寄存器。si為轉換字符串的起始地址,cl為轉換結束字符。例如輸入兩個數字,回車結束輸入,而兩個數字之間以空格分隔,比如1234 5678,那麽第壹次si指向1,cl為空格;第二次si指向5,cl為回車符,每次的轉換結果以ax返回。
3. 調用I16toa函數時,把要轉換的整數放到ax裏,si指向存儲轉換結果的字符串起始位置。
4. 輸入數字最好不要超過10000。當然超過10000也可以,比如輸入 3456 2345,只要別讓最終的計算結果超過65535就沒問題。
5. 第壹個大於val1又能整除val2的數為:((val1 / val2) + 1) * val2
dseg segment
LF equ 0ah
msg db 'Please input two numbers.', 0ah, 0dh, '$'
bufin db 20, 20 dup(?)
bufout db 10 dup(?)
val1 dw ?
val2 dw ?
dseg ends
cseg1 segment
assume cs:cseg1, ds:dseg
START:
mov ax, dseg
mov ds, ax
lea dx, msg
mov ah, 9
int 21h
lea dx, bufin
mov ah, 0ah
int 21h
mov dl, LF
mov ah, 2
int 21h
lea si, bufin + 2
mov cl, ' '
call Atoi16
mov val1, ax
inc si
mov cl, 0dh
call Atoi16
mov val2, ax
mov ax, val1
xor dx, dx
mov bx, val2
div bx
inc ax
mul bx
lea si, bufout
call I16toa
lea dx, bufout
mov ah, 9
int 21h
mov ah, 04ch
int 21h
cseg1 ends
cseg2 segment
assume cs:cseg2
Atoi16 proc far
xor ax, ax
xor bx, bx
Convert:
mov bl, [si]
mov dx, 10
mul dx
and bx, 0fh
add ax, bx
inc si
mov bl, [ si ]
cmp bl, cl
jne Convert
ret
Atoi16 endp
I16toa proc far
push ax
push bx
push cx
push dx
push si
mov bx, 10
xor cx, cx
next:
xor dx, dx
div bx
or dl, 30h
push dx
inc cx
cmp ax, 0
jnz Next
Store:
pop dx
mov [ si ], dl
inc si
loop Store
mov byte ptr[ si ], '$'
pop si
pop dx
pop cx
pop bx
pop ax
ret
I16toa endp
cseg2 ends
end START