.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 个数字的整数,并根据用户选择的算术运算进行加或减,并在最后显示结果
在输入第一个和第二个数字之间,您发出一个
call printNewline
,但您忘记在输入第二个数字和显示结果之间执行相同的操作。这就是第二个提示被覆盖的原因。一个有趣的解决方案是在结果消息中包含换行代码:resultMsg db 13, 10, 'The result is: $'
如果用户输入一个 5 位数字,您将丢失有关对该数字执行的操作的信息。原因是 buffer 短了 1 个字节。正确设置:
buffer db 6, ?, 6 dup(0) ; max 5 digits
userChoice db ?
convertLoop在使用
mul cx
时是错误的。这种形式的 mul
指令将 AX 乘以 CX,并将结果保留在 DX: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