汇编语言添加两个数字代码错误问题

问题描述 投票:0回答:1

我正在研究将两个用户输入数字相加然后返回总和的汇编语言。但是,我的代码无法正常工作。有人可以检查这个问题吗?

.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

我尝试过一些号码更改,但没有成功

assembly virtualbox x86-16
1个回答
0
投票
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 有多个问题!

  • 将 BL 中的当前数字与当前数字相加时,所使用的加法必须确保 BH 寄存器为 0。
  • DOS 给您的输入是不是以零结尾的。 DOS 使用的终止符是回车符,因此您需要编写
    cmp bl, 0
    ,而不是
    cmp bl, 13
  • 你可以稍微缩短乘法。您可以使用 10 加载 DX,而不是将 AX 传输到 DX,然后加载 AX 10。从
    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 ...

© www.soinside.com 2019 - 2024. All rights reserved.