Я пытаюсь создать программу, которая сначала спросит пользователя об операторе, запросит два числа, а затем отобразит операцию в целом. Например, если пользователь выбрал «+», затем «2», а затем «3», результат должен быть «2 + 3 = 5»
Мне удалось заставить сложение и вычитание работать правильно , но я не могу понять, как заставить части умножения и деления отображаться правильно, так как результаты будут отображать числа в неправильных местах или не связаны с операцией, введенной пользователем. Кто-нибудь знает, как это исправить, чтобы результаты отображались правильно?
Вот код:
%include "CPsub64.inc"
global main ;entry point for assembly
section .text
main:
mov rcx, 1
mov rdi, 1
loop2:
;display
mov rax, 1
mov rsi, message
mov rdx, length
syscall
;take input
mov rdx, 255
mov rcx, userInput1
mov rbx, 0
mov rax, 3
int 80h
;display
mov rax, 1
mov rsi, message1
mov rdx, length1
syscall
;take input
mov rdx, 255
mov rcx, userInput2
mov rbx, 0
mov rax, 3
int 80h
;convert to number
mov rdx, userInput2
mov rcx, 255
call ParseInteger64
mov r8, rax
;display
mov rax, 1
mov rsi, message2
mov rdx, length2
syscall
;take input
mov rdx, 255
mov rcx, userInput3
mov rbx, 0
mov rax, 3
int 80h
;convert to number
mov rdx, userInput3
mov rcx, 255
call ParseInteger64
mov r9, rax
;Set up operator
mov rsi, 0
mov rsi, [userInput1]
cmp sil, '+'
je add
mov rsi, 0
mov rsi, [userInput1]
cmp sil, '-'
mov rsi, 0
mov rsi, [userInput1]
cmp sil, '*'
mov rsi, 0
mov rsi, [userInput1]
cmp sil, '/'
; jump if addition
cmp sil, '+'
; jump if subtraction
cmp sil, '-'
je subtract
; jump if multiplication
cmp sil, '*'
je multiply
; jump if division
cmp sil, '/'
je divide
;add
add:
mov r10, r8
add r10, r9
;display
mov rax, r8
call WriteInt
syscall
;display
mov rax, 1
mov rsi, messageadd
mov rdx, lengthadd
syscall
;display
mov rax, r9
call WriteInt
syscall
;display
mov rax, 1
mov rsi, messageeq
mov rdx, lengtheq
syscall
;display answer
mov rax, r10
call WriteInt
jmp loop
;subtract
subtract:
mov r10, r8
sub r10, r9
;display
mov rax, r8
call WriteInt
syscall
;display
mov rax, 1
mov rsi, messagesub
mov rdx, lengthsub
syscall
;display
mov rax, r9
call WriteInt
syscall
;display
mov rax, 1
mov rsi, messageeq
mov rdx, lengtheq
syscall
;display answer
mov rax, r10
call WriteInt
jmp loop
;multiply
multiply:
mov rax, r8
mov rax, r9
mul rax
;display
mov rax, r8
call WriteInt
syscall
;display
mov rax, 1
mov rsi, messagemul
mov rdx, lengthmul
syscall
;display
mov rax, r9
call WriteInt
syscall
;display
mov rax, 1
mov rsi, messageeq
mov rdx, lengtheq
syscall
;display answer
mov rax, r9
call WriteInt
jmp loop
;divide
divide:
mov rdx, 0
mov rax, r8
mov rax, r9
div rax
;display
mov rax, r8
call WriteInt
syscall
;display
mov rax, 1
mov rsi, messagediv
mov rdx, lengthdiv
syscall
;display
mov rax, r9
call WriteInt
syscall
;display
mov rax, 1
mov rsi, messageeq
mov rdx, lengtheq
syscall
;display answer
mov rax, r9
call WriteInt
jmp loop
loop:
;blank
mov rax, 1
mov rsi, blank1
mov rdx, lengthblank
syscall
;blank
mov rax, 1
mov rsi, blank1
mov rdx, lengthblank
syscall
;display
mov rax, 1
mov rsi, message3
mov rdx, length3
syscall
;take input
mov rdx, 255
mov rcx, userInput4
mov rbx, 0
mov rax, 3
int 80h
mov rsi, 0
mov rsi, [userInput4]
cmp sil, 'y'
;jump if answer is yes
cmp sil, 'y'
je loop2
;blank
mov rax, 1
mov rsi, blank1
mov rdx, lengthblank
syscall
;exit
mov rax, 60
xor rdi, rdi
syscall
section .data
;addition message
message: db "Enter the arithmetic operator (+ - * /):",0,0ah
length: equ ($-message)
message1: db "Please enter the 1st number",0,0ah
length1: equ ($-message1)
message2: db "Please enter the 2nd number",0,0ah
length2: equ ($-message2)
messageadd: db " + ",0
lengthadd: equ ($-messageadd)
messagesub: db " - ",0
lengthsub: equ ($-messagesub)
messagemul: db " * ",0
lengthmul: equ ($-messagemul)
messagediv: db " / ",0
lengthdiv: equ ($-messagediv)
messageeq: db " = ",0
lengtheq: equ ($-messageeq)
message3: db "Would you like to perform another operation? [y = yes / n = no]",0,0ah
length3: equ ($-message3)
blank1: db " ",0,0ah
lengthblank: equ ($-blank1)
;user inputs
section .bss
userInput1: resb 255
userInput2: resb 255
userInput3: resb 255
userInput4: resb 255