NASM Assembly - возникают проблемы с отображением результатов при запуске программы - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь создать программу, которая сначала спросит пользователя об операторе, запросит два числа, а затем отобразит операцию в целом. Например, если пользователь выбрал «+», затем «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
...