Я новичок в написании сообщений со встроенным в них кодом, так что дайте мне передохнуть, если это выглядит ужасно, или посоветуйте, как сделать так, чтобы это выглядело лучше. :)
Проблема, с которой я сталкиваюсь, в значительной степени соответствует названию. Я делаю простой калькулятор для задания, я пытаюсь, чтобы программа сравнила введенную математическую операцию, например (+,-,*,/).
* Затем настройте cmp что-то вроде....
cmp MathOper, 43...*
* Но у меня возникают проблемы с тем, чтобы программа распознавала правильные вещи. Я опубликую копию кода ниже, но имейте в виду, что это черновой вариант, просто попытка проработать некоторые идеи. *
Спасибо за любую помощь!
; Author:
; Date: 03/22/2022
.586
.MODEL FLAT
INCLUDE io.h ; header file for input/output
.STACK 4096
.DATA
num1 DWORD ?
num2 DWORD ?
MathOper DWORD ?
result DWORD 20 DUP (?), 0
string BYTE 40 DUP (?), 0
Num1prm BYTE "Enter First Number", 0
Num2prm BYTE "Enter Second Number", 0
MathOPprm BYTE "Enter Math Operation (+,-,*,/)", 0
Resultprm BYTE "The Result is: ", 0
.CODE
_MainProc PROC
loopy:
input Num1prm, string, 20
atod string
mov num1, eax
input MathOPprm, string, 20
atod string
mov MathOper, eax
input Num2prm, string, 20
atod string
mov num2, eax
;HAVING ISSUES GETTING THIS TO WORK
cmp MathOper, 43
jne SUBTRACTION
call Addition
dec ecx
jnz loopy
SUBTRACTION:
cmp MathOper, 45
jne MULTIPLICATION
call Subtraction
MULTIPLICATION:
cmp MathOper, 42
jne DIVISION
call Multiplication
DIVISION:
cmp MathOper, 47
call Division
cmp MathOper, 101
endloopy:
mov eax, 0 ; exit with return code 0
ret
_MainProc ENDP
; end of source code
Addition PROC
push ebp
mov ebp, esp
push ebx
mov eax, num1
mov ebx, num2
add eax, ebx
dtoa result, eax
output Resultprm, result, 40
pop ebx
pop ebp
ret
Addition ENDP
Subtraction PROC
push ebp
mov ebp, esp
push ebx
mov eax, num1
mov ebx, num2
sub eax, ebx
dtoa result, eax
output Resultprm, result, 40
pop ebx
pop ebp
ret
Subtraction ENDP
Multiplication PROC
push ebp
mov ebp, esp
push ebx
mov eax, num1
mov ebx, num2
mul ebx
dtoa result, eax
output Resultprm, result, 40
pop ebx
pop ebp
ret
Multiplication ENDP
Division PROC
push ebp
mov ebp, esp
push ebx
mov eax, num1
mov ebx, num2
cdq
idiv ebx
dtoa result, eax
output Resultprm, result, 40
pop ebx
pop ebp
ret
Division ENDP
END
Вы не хотите вызывать atod на string
после прочтения ввода, потому что это не число.
Просто скопируйте первый символ строки в MathOper, используя это:
movzx eax, [string]
mov MathOper, eax
Вот оно! Большое тебе спасибо. Очевидно, все еще изучаю все тонкости ассемблера. :) Такой простой ответ, который я гуглил не менее 2 часов, прежде чем сделать этот пост. ммм.. Но тем не менее, Спасибо! Может быть, кто-то еще столкнется с подобной проблемой и наткнется на это простое решение.