[masm32] Вычисление целочисленного арифметического выражения - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый день. Нужна помощь, только начал изучать асемблер есть уравнение e = (a-c)^2 + 2*a*c/k Я написал код, но ответ не совпадает. Кто знает в чем проблема и как ее решить?
; 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 
RequestK DB "input k: ",0 
MsgResult DB 13,10,"(a-c)^2 + 2*a*c/k",0AH,0DH,0 
.DATA 
AA SDWORD 0 
CC SDWORD 0 
KK SDWORD 0 
.DATA? 
EE SDWORD ? 
InOutbuf DB 100 DUP (?) 
.CODE 
Start: 
InputA: 
XOR EAX,EAX 
Invoke StdOut,ADDR RequestA 
Invoke StdIn,ADDR InOutbuf,LengthOf InOutbuf 
Invoke StripLF,ADDR InOutbuf 
Invoke atol,ADDR InOutbuf 
mov AA,EAX 
 
InputC: 
XOR EAX,EAX 
Invoke StdOut,ADDR RequestC 
Invoke StdIn,ADDR InOutbuf,LengthOf InOutbuf 
Invoke StripLF,ADDR InOutbuf 
Invoke atol,ADDR InOutbuf 
mov CC,EAX 
 
InputK: 
XOR EAX,EAX
Invoke StdOut,ADDR RequestK 
Invoke StdIn,ADDR InOutbuf,LengthOf InOutbuf 
Invoke StripLF,ADDR InOutbuf 
Invoke atol,ADDR InOutbuf
mov KK,EAX 
 
Calculate: 
XOR EAX,EAX 
 
mov EAX,AA 
sub EAX,CC 
imul EAX 
 
mov ECX,CC 
idiv KK 
 
mov EBX,AA 
imul EBX,2 
imul ECX 
 
mov EE,EAX 
add EE,EBX 
 
Invoke dwtoa,EE,ADDR InOutbuf 
Invoke StdOut,ADDR MsgResult 
Invoke StdOut,ADDR InOutbuf 
XOR EAX,EAX 
Invoke StdOut,ADDR MsgExit 
Invoke StdIn,ADDR InOutbuf,LengthOf InOutbuf 
Invoke ExitProcess,0 
End Start

Решение задачи: «[masm32] Вычисление целочисленного арифметического выражения»

textual
Листинг программы
mov eax,AA    ; eax=a
sub eax,CC    ; eax=a-c
imul eax,eax  ; eax=(a-c)^2
mov EE,eax    ; e=(a-c)^2
mov eax,AA    ; eax=a
shl eax,1     ; eax=2a
imul CC       ; edx:eax=2ac
idiv KK       ; eax=2ac/k
add EE,eax    ; e=(a-c)^2+2ac/k

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

  1. mov eax,AA — eax получает значение переменной AA
  2. sub eax,CC — из eax вычитается значение переменной CC
  3. imul eax,eax — eax умножается на себя
  4. mov EE,eax — значение eax записывается в переменную EE
  5. mov eax,AA — eax снова получает значение переменной AA
  6. shl eax,1 — eax сдвигается вправо на 1 позицию (умножается на 2)
  7. imul CC — edx:eax получает значение произведения переменной CC и eax
  8. idiv KK — eax получает частное от деления edx:eax на переменную KK
  9. add EE,eax — к значению переменной EE прибавляется значение eax

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

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