Разработать программу, вычисляющую заданное выражение. Просмотреть в отладчике. - Assembler

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

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

Разработать программу, вычисляющую заданное выражение. Просмотреть в отладчике и зафиксировать в отчете ход выполнения вычислений (покомандно). Убедиться в правильности программы.
; Template for console appliaction
.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
 
.DATA
d SWORD ?
fd SWORD 0 ; старшее слово результата
Zapros DB 13,10,'Input k',13,10,0
Result DB 'Result='
ResStr DB 16 DUP (' '),0
 
.DATA?
k SWORD ?
fk SWORD ? ; старшее слово переменной А
Buffer DB 10 DUP (?)
inbuf DB 100 DUP (?)
 
.CODE
Start: Invoke StdOut,ADDR Zapros
Invoke StdIn,ADDR Buffer,LengthOf Buffer
Invoke StripLF,ADDR Buffer
 
; Преобразование в SDWORD
Invoke atol,ADDR Buffer ;результат в EAX
mov DWORD PTR k,EAX
 
; Вычисления
mov CX,k
imul CX,2; CX:=2*k
mov BX,k
sub BX,5; BX:=k-5
mov AX,BX
imul AX,BX; AX = (k-5)(k-5)
mov DX,AX
idiv DX,4; DX = (k-5)(k-5)/4
add DX,CX;

; Преобразование
Invoke dwtoa,d,ADDR ResStr
 
; Вывод
Invoke StdOut,ADDR Result
XOR EAX,EAX
Invoke StdOut,ADDR MsgExit
Invoke StdIn,ADDR inbuf,LengthOf inbuf
Invoke ExitProcess,0
End Start
не могу разобраться с делением вот здесь:
mov CX,k   
imul CX,2; CX:=2*k 
mov BX,k
sub BX,5; BX:=k-5
mov AX,BX
imul AX,BX; AX = (k-5)(k-5)
mov DX,AX
idiv DX,4; DX = (k-5)(k-5)/4
add DX,CX;
вот что нужно получить:

Решение задачи: «Разработать программу, вычисляющую заданное выражение. Просмотреть в отладчике.»

textual
Листинг программы
movsx eax,k
mov ebx,eax
shl ebx,1   ; ebx = 2k
sub eax,5   ; eax = k-5
imul eax    ; eax = (k-5)^2
sar eax,2   ; eax = [(k-5)^2]/4
add eax,ebx ; eax = [(k-5)^2]/4+2k
mov d,eax

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

  1. movsx eax,k — загрузка переменной k в регистр eax с использованием операции расширения (sx)
  2. mov ebx,eax — копирование содержимого регистра eax в регистр ebx
  3. shl ebx,1 - сдвиг содержимого регистра ebx вправо на 1 позицию (на 1 в двоичной системе равно удвоению)
  4. sub eax,5 - вычитание из содержимого регистра eax числа 5
  5. imul eax — умножение содержимого регистра eax на самого себя
  6. sar eax,2 - сдвиг содержимого регистра eax вправо на 2 позиции (на 2 в двоичной системе равно делению на 4)
  7. add eax,ebx — сложение содержимого регистра eax и ebx
  8. mov d,eax — копирование содержимого регистра eax в переменную d

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


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

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

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