[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
Объяснение кода листинга программы
- mov eax,AA — eax получает значение переменной AA
- sub eax,CC — из eax вычитается значение переменной CC
- imul eax,eax — eax умножается на себя
- mov EE,eax — значение eax записывается в переменную EE
- mov eax,AA — eax снова получает значение переменной AA
- shl eax,1 — eax сдвигается вправо на 1 позицию (умножается на 2)
- imul CC — edx:eax получает значение произведения переменной CC и eax
- idiv KK — eax получает частное от деления edx:eax на переменную KK
- add EE,eax — к значению переменной EE прибавляется значение eax