显示结果和执行所选算术运算时出错

问题描述 投票:0回答:1
.model small

.stack 100h



.data

    greeting db 'WELCOME TO YOUR CALCULATOR', 0Dh, 0Ah, '$'

    menu db '1 - ADDITION', 0Dh, 0Ah, '2 - SUBTRACTION', 0Dh, 0Ah, '3 - MULTIPLICATION', 0Dh, 0Ah, '4 - DIVISION', 0Dh, 0Ah, '$'

    choicePrompt db 'Enter your choice: $'

    prompt1 db 'Enter 1st Number: $'

    prompt2 db 'Enter 2nd Number: $'

    resultMsg db 'The result is: $'

    buffer db 6, ?, 5 dup(0) ; Buffer to store input (max 5 digits)

    userChoice db ?

    num1 dw 0

    num2 dw 0

    result dw 0



.code

main proc

    mov ax, @data

    mov ds, ax



    ; Print the greeting and menu

    lea dx, greeting

    mov ah, 09h

    int 21h



    lea dx, menu

    mov ah, 09h

    int 21h



    ; Print choice prompt

    lea dx, choicePrompt

    mov ah, 09h

    int 21h



    ; Read user's choice

    mov ah, 01h

    int 21h

    sub al, '0'

    mov userChoice, al

    call getch



    ; Print newline

    call printNewline



    ; Print prompt1 and read first number

    lea dx, prompt1

    mov ah, 09h

    int 21h

    call readNumber

    mov num1, ax



    call printNewline



    ; Print prompt2 and read second number

    lea dx, prompt2

    mov ah, 09h

    int 21h

    call readNumber

    mov num2, ax



    ; Perform the chosen operation

    mov ax, num1

    mov bx, num2

    cmp userChoice, 1

    je additionOp

    cmp userChoice, 2

    je subtractionOp

    cmp userChoice, 3

    je multiplicationOp

    cmp userChoice, 4

    je divisionOp

    jmp endProgram



additionOp:

    add ax, bx

    mov result, ax ; Store the result

    jmp displayResult



subtractionOp:

    sub ax, bx

    mov result, ax ; Store the result

    jmp displayResult



multiplicationOp:

    mul bx

    mov result, ax ; Store the result

    jmp displayResult



divisionOp:

    xor dx, dx

    div bx

    mov result, ax ; Store the result

    jmp displayResult



displayResult:

    ; Print the result message

    lea dx, resultMsg

    mov ah, 09h

    int 21h



    ; Print the actual result

    mov ax, result

    call printNumber



    ; Print a newline

    call printNewline



    ret



endProgram:

    mov ah, 4Ch

    int 21h



main endp



getch proc

    mov ah, 07h

    int 21h

    ret

getch endp



readNumber proc

    lea dx, buffer

    mov ah, 0Ah

    int 21h



    lea si, buffer + 2

    mov cx, 0



convertLoop:

    lodsb

    cmp al, 0Dh

    je endConvert

    sub al, '0'

    mov bx, 10

    mul cx

    add cx, ax

    jmp convertLoop



endConvert:

    mov ax, cx

    ret

readNumber endp



printNewline proc

    mov ah, 02h

    mov dl, 0Dh

    int 21h

    mov dl, 0Ah

    int 21h

    ret

printNewline endp



printNumber proc

    mov bx, 10

    xor cx, cx



convertLoop2:

    xor dx, dx

    div bx

    add dl, '0'

    push dx

    inc cx

    cmp ax, 0

    jne convertLoop2



printLoop:

    pop dx

    mov ah, 02h

    int 21h

    loop printLoop



    ret

printNumber endp
end main

所以我试图制作一个简单的计算器,用户可以选择将使用什么算术运算,将提示用户输入数字最大数字 5 两次并显示结果,但我在显示总数时遇到问题结果,用户插入第二个数字后,“输入第二个数字:”将被删除,并替换为“结果是:0:21”假设数字 21 是提示2中插入的整数,代码应该能够让用户选择以下算术运算符之一,让用户输入最多 5 个数字的整数,并根据用户选择的算术运算进行加或减,并在最后显示结果

assembly calculator x86-16 dosbox
1个回答
0
投票

前三个错误

  1. 在输入第一个和第二个数字之间,您发出一个

    call printNewline
    ,但您忘记在输入第二个数字和显示结果之间执行相同的操作。这就是第二个提示被覆盖的原因。一个有趣的解决方案是在结果消息中包含换行代码:
    resultMsg db 13, 10, 'The result is: $'

  2. 如果用户输入一个 5 位数字,您将丢失有关对该数字执行的操作的信息。原因是 buffer 短了 1 个字节。正确设置:

    buffer db 6, ?, 6 dup(0) ; max 5 digits
    userChoice db ?

  3. convertLoop在使用

    mul cx
    时是错误的。这种形式的
    mul
    指令将 AX 乘以 CX,并将结果保留在 DX:AX 中。
    最好将正在构建的结果保留在 AX 中,并用其他不触及 AX 的指令替换
    lodsb
    (强制使用 AL):

     lea  si, buffer + 2
     xor  ax, ax
    convertLoop:
     mov  cl, [si]
     inc  si
     cmp  cl, 13
     je   endConvert
     and  cx, 15       ; ['0','9'] -> [0,9]
     mov  bx, 10
     mul  bx
     add  ax, cx
     jmp convertLoop
    endConvert:
     ret
    
© www.soinside.com 2019 - 2024. All rights reserved.