Ошибка idiv - Assembler
Формулировка задачи:
Добрый день. Начинаю изучать ассемблер. Столкнулся с проблемой, при использовании idiv программа вылетает. Хотел бы узнать в чем проблема)
P.S sub add, mul и imul работают.
; Template for console application .586 .MODEL flat, stdcall OPTION CASEMAP:NONE Include kernel32.inc Include masm32.inc IncludeLib kernel32.lib IncludeLib masm32.lib .CONST MsgExit DB 13,10,"Press Enter to Exit",0AH,0DH,0 RequestA DB "input a: ",0 RequestC DB "input c: ",0 MsgCheck DB 13,10,"a/c = ",0; строка проверки MsgFirst DB 13,10,"(a-c)^2+c = ",0; если a/c > 2 MsgSecond DB 13,10,"a+2*c = ",0; если a/c < 2 .DATA .DATA? AA DWORD ? CC DWORD ? EE DWORD ? InOutbuf DB 100 DUP (?); буфер ввода/вывода .CODE Start: InputA: XOR EAX,EAX; очистка EAX Invoke StdOut,ADDR RequestA; запрос на ввод Invoke StdIn,ADDR InOutbuf,LengthOf InOutbuf Invoke StripLF,ADDR InOutbuf Invoke atol,ADDR InOutbuf; преобразование в SDWORD,результат в EAX mov AA,EAX InputC: XOR EAX,EAX; очистка EAX Invoke StdOut,ADDR RequestC; запрос на ввод Invoke StdIn,ADDR InOutbuf,LengthOf InOutbuf Invoke StripLF,ADDR InOutbuf Invoke atol,ADDR InOutbuf; преобразование в SDWORD,результат в EAX mov CC,EAX Calculate: XOR EBX,EBX ; вычисление a/c mov EBX,AA sub EBX,CC mov EE,EBX Invoke dwtoa,EE,ADDR InOutbuf; преобразование E в строку Invoke StdOut,ADDR MsgCheck Invoke StdOut,ADDR InOutbuf cmp EBX,2; Сравнение с 2 jl CalcSecond CalcFirst: XOR EAX,EAX mov EAX,AA; EAX = a sub EAX,CC; EAX = a-c imul EAX,EAX; EAX = (a-c)^2 add EAX,CC; EAX = (a-c)^2 + c mov EE,EAX; e = (a-c)^2 + c jmp First CalcSecond: XOR EAX,EAX mov EAX,CC; EAX = c shl EAX,1; EAX = 2*c add EAX,AA; EAX = 2*c + a mov EE,EAX; e = 2*c + a jmp Second First: Invoke StdOut,ADDR MsgFirst jmp OutPut Second: Invoke StdOut,ADDR MsgSecond OutPut: Invoke dwtoa,EE,ADDR InOutbuf; преобразование E в строку Invoke StdOut,ADDR InOutbuf Ending: XOR EAX,EAX Invoke StdOut,ADDR MsgExit Invoke StdIn,ADDR InOutbuf,LengthOf InOutbuf Invoke ExitProcess,0 End Start
Решение задачи: «Ошибка idiv»
textual
Листинг программы
; вычисление a/c ;mov EBX,AA ;sub EBX,CC ;mov EE,EBX mov EAX,AA cdq idiv CC mov EE,EAX
Объяснение кода листинга программы
- AA - значение переменной AA
- CC - значение переменной CC
- EBX - значение переменной EBX
- EE - значение переменной EE
- EAX - значение переменной EAX
- CDQ - команда деления с остатком
- IDIV CC - деление EAX на CC с сохранением остатка в EAX
- MOV EE, EAX - значение EAX (после деления) сохраняется в переменной EE
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д