| Цитата(ФедосеевПавел @ 25.5.2018, 11:34) | Строка 31 какая-то странная: - на метку itog управление попадает со строки 10, когда проверили, что в eax код '=' - на метке itog начинается проверка того, что в edx (sic!) находится код '+'
Т.е. у вас проблемы со структурой кода - хаотичные переходы и ветвления.
Могу показать простой калькулятор для целых чисел: - ввод выражения (строки) - разбор выражения (безприоритетное вычисление) с целыми числами - вывод результата
| Код | .686 .model flat, stdcall option casemap :none
include \masm32\include\windows.inc
include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\masm32.lib .data aszPrompt db 'Expression: ', 0Dh, 0Ah, 0 aszPressEnter db 0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0 aszResult db 10, 13, "Result of your equation is %d", 0
OpAdd equ '+' OpSub equ '-' OpMul equ '*' OpDiv equ '/'
AllowedChars db '=+-*/0123456789' LenAllowedChars equ $-AllowedChars OpChars db '=+-*/' LenOpChars equ $-OpChars .data? hConsoleOutput HANDLE ? hConsoleInput HANDLE ? Buffer db 1024 dup(?) BufLen dd ? Result dd ? Op1 dd ? Op2 dd ? Operation db ? .code
PrevOperation proc mov eax, [Op1] cdq mov ebx, [Op2] cmp [Operation], OpAdd jne @@Sub add eax, ebx jmp @@Calc @@Sub: cmp [Operation], OpSub jne @@Mul sub eax, ebx jmp @@Calc @@Mul: cmp [Operation], OpMul jne @@Div mul ebx @@Div: cmp [Operation], OpDiv jne @@Calc idiv ebx @@Calc: mov [Op1], eax mov [Op2], 0 mov al, [esi-1] mov [Operation], al ret PrevOperation endp
main proc
; получение описателей ввода и вывода консоли invoke GetStdHandle, STD_INPUT_HANDLE mov hConsoleInput, eax
invoke GetStdHandle, STD_OUTPUT_HANDLE mov hConsoleOutput, eax
invoke ClearScreen
;ввод выражения invoke WriteConsole, hConsoleOutput, ADDR aszPrompt,\ LENGTHOF aszPrompt-1, ADDR BufLen, NULL invoke ReadConsole, hConsoleInput, ADDR Buffer,\ LENGTHOF Buffer, ADDR BufLen, NULL lea esi, [Buffer] ;удаление из буфера add esi, [BufLen] ;символов перевода строки mov [esi-2],word ptr 0 sub [BufLen], 2
;обработка выражения во введённой строке mov eax, 0 mov [Op1], 0 mov [Op2], 0 mov [Operation], OpAdd
lea esi, [Buffer] mov ecx, [BufLen] @@GetCmd: push ecx lodsb ;проверка корректности введённых символов lea edi, [AllowedChars] mov ecx, [LenAllowedChars] repne scasb jnz @@Next @@ProcessChar: lea edi, [OpChars] mov ecx, [LenOpChars] repne scasb jz @@DoOperation @@TestDigits: ;введена цифра and eax, 0FFh sub al, '0' mov ebx, [Op2] lea eax, [eax+8*ebx] lea eax, [eax+2*ebx] mov [Op2], eax
pop ecx push ecx cmp ecx, 1 jne @@Next
@@DoOperation: ;сначала завершается предыдущая операция call PrevOperation cmp al, '=' jne @@Next pop ecx jmp @@Break @@Next: pop ecx loop @@GetCmd @@Break: ResultShow: ;вывод результата mov eax, [Op1] invoke wsprintf, ADDR Buffer, ADDR aszResult, eax mov [BufLen], eax invoke WriteConsole, hConsoleOutput, ADDR Buffer,\ BufLen, ADDR BufLen, NULL
;ожидание нажатия ENTER invoke WriteConsole, hConsoleOutput, ADDR aszPressEnter,\ LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL invoke ReadConsole, hConsoleInput, ADDR Buffer,\ LENGTHOF Buffer, ADDR BufLen, NULL
invoke ExitProcess, 0 main endp
end main |
|
Всё - разобрался. В цепочках "oper-->itog-->oper_ex" были лишние команды. За код - благодарю, но целые числа - это не интересно. Я уже добиваю прямую конвертацию. Ещё чуть-чуть... |