我正在研究将两个用户输入数字相加然后返回总和的汇编语言。但是,我的代码无法正常工作。有人可以检查这个问题吗?
.model small
.stack 100h
.data
message1 db 'Enter the first number: $'
message2 db 'Enter the second number: $'
result_message db 'The sum is: $'
newline db 13, 10, '$'
buffer db 6, ?, 6 dup('$')
num1 dw ?
num2 dw ?
sum dw ?
.code
main:
mov ax, @data
mov ds, ax
; Display message to enter the first number
mov ah, 9
lea dx, message1
int 21h
; Read the first number
mov ah, 0ah ;
lea dx, buffer
int 21h
mov si, offset buffer + 2
mov cx, 0
mov cl, buffer[1]
call convert_to_number
; Store the first number
mov num1, ax
; Display message to enter the second number
mov ah, 9
lea dx, message2
int 21h
; Read the second number
mov ah, 0ah ;
lea dx, buffer
int 21h
mov si, offset buffer + 2
mov cx, 0
mov cl, buffer[1]
call convert_to_number
; Store the second number
mov num2, ax
; Add the numbers
mov ax, num1
add ax, num2
mov sum, ax
; Display the result
mov ah, 9
lea dx, result_message
int 21h
; Convert sum to ASCII
mov ax, sum
call convert_to_ascii ; Fixed error: Corrected procedure call
; Display sum
mov ah, 9
lea dx, buffer + 5 ; Fixed error: Adjusted offset
int 21h
; New line
mov ah, 9
lea dx, newline
int 21h
; Exit program
mov ax, 4c00h
int 21h
convert_to_number:
xor ax, ax
convert_loop:
mov bl, byte ptr [si]
cmp bl, 0
je convert_done
sub bl, '0'
mov dx, ax
mov ax, 10
mul dx
add ax, bx
inc si
jmp convert_loop
convert_done:
ret
convert_to_ascii:
mov bx, 10
mov si, offset buffer + 5
mov byte ptr [si], '$'
convert_loop2:
xor dx, dx
div bx
add dl, '0'
dec si
mov [si], dl
test ax, ax
jnz convert_loop2
ret
end main
我尝试过一些号码更改,但没有成功
mov ax, sum call convert_to_ascii ; Fixed error: Corrected procedure call ; Display sum mov ah, 9 lea dx, buffer + 5 ; Fixed error: Adjusted offset int 21h
您的 convert_to_ascii 代码是正确的,但它永远不会显示任何内容,因为您已将 DX 寄存器设置为缓冲区的末尾(放置字符串终止符 $ 的位置)。从 convert_to_ascii 返回后,SI 寄存器指向转换后的数字的第一位,因此您需要做的是写入
mov dx, si
。
convert_to_number: xor ax, ax convert_loop: mov bl, byte ptr [si] cmp bl, 0 je convert_done sub bl, '0' mov dx, ax mov ax, 10 mul dx add ax, bx inc si jmp convert_loop convert_done: ret
您的 convert_to_number 有多个问题!
cmp bl, 0
,而不是 cmp bl, 13
。mov dx, ax
mov ax, 10
mul dx
到 mov dx, 10
mul dx
。convert_to_number:
xor ax, ax
xor bx, bx <- bullet 1
convert_loop:
mov bl, byte ptr [si]
cmp bl, 13 <- bullet 2
je convert_done
sub bl, '0'
mov dx, 10 <- bullet 3
mul dx
add ax, bx
inc si
jmp convert_loop
convert_done:
ret
mov cx, 0 mov cl, buffer[1] call convert_to_number
由于该算法不使用 CX,最好不要浪费代码从 DOS 缓冲区检索 CX ...