Ошибка 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

Объяснение кода листинга программы

  1. AA - значение переменной AA
  2. CC - значение переменной CC
  3. EBX - значение переменной EBX
  4. EE - значение переменной EE
  5. EAX - значение переменной EAX
  6. CDQ - команда деления с остатком
  7. IDIV CC - деление EAX на CC с сохранением остатка в EAX
  8. MOV EE, EAX - значение EAX (после деления) сохраняется в переменной EE

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы