Вычислить арифметическое выражение - Assembler (225018)
Формулировка задачи:
(25/с - d +2)/(d+a*a+1)
Напишите что как и куда, если не трудно
Я не могу разделить числитель на знаменатель. Вот мой код:
#include "stdafx.h" #include <iostream> #include "conio.h" using namespace std; void _tmain() { setlocale(LC_ALL, "Rus"); BYTE a = 5; BYTE c = 5; WORD d = 6; //25/c-d+2/(d+a*a+2) WORD res = 0; //cout << "Enter a,c,d:" << endl; //cin >> a >> c >> d; __asm { pusha mov al, 25; cwd div c; ax < --25 / c add ax, 2 sub ax, d mov bx, ax mov al, a cwd imul a; ax =64 sub ax, 1 add ax, d popa } cout << "Результат = " << (int)res << "\n"; _getch(); }
Решение задачи: «Вычислить арифметическое выражение»
textual
Листинг программы
mov al,[a] imul [a]; ax=a*a inc ax; ax=a*a+1 add ax,d; ax=d+a*a+1 mov bx,ax mov ax,25 idiv [c]; al=25/c cbw; ax=25/c add ax,2; ax=25/c+2 sub ax,[d] cwd; dx:ax=25/c-d+2 idiv bx; ax=(25/с - d +2)/(d+a*a+1)
Объяснение кода листинга программы
mov al,[a]
— в коде используется командаmov
, которая переносит значение из памяти в регистр. В данном случае, значение переменнойa
переносится в регистрal
.imul [a]; ax=a*a
— командаimul
выполняет умножение значения в регистреal
на значение, переданное в качестве аргумента команды (в данном случае[a]
), и сохраняет результат в регистреax
. То есть,ax
становится равнымa*a
.inc ax; ax=a*a+1
— командаinc
увеличивает значение регистраax
на единицу. То есть,ax
становится равнымa*a+1
.add ax,d; ax=d+a*a+1
— командаadd
складывает значение регистраax
с переменнойd
. То есть,ax
становится равнымd+a*a+1
.mov bx,ax
— командаmov
переносит значение регистраax
в регистрbx
.mov ax,25
— командаmov
устанавливает значение регистраax
равным 25.idiv [c]; al=25/c
— командаidiv
выполняет деление значения регистраax
на значение переменнойc
. Результат деления сохраняется в регистреal
.cbw
— командаcbw
конвертирует значение регистраbx
в слово с старшим битом равным 0 и сохраняет его в регистреax
. То есть,ax
становится равнымbx
.add ax,2; ax=25/c+2
— командаadd
увеличивает значение регистраax
на два. То есть,ax
становится равным25/c+2
.sub ax,[d]
— командаsub
вычитает значение переменнойd
из значения регистраax
. То есть,ax
становится равнымax-d
.cwd; dx:ax=25/c-d+2
— командаcwd
конвертирует значение регистраax
в слово с старшим битом равным 1 и сохраняет его в регистреdx
. То есть,dx:ax
становится равным25/c-d+2
.idiv bx; ax=(25/с — d +2)/(d+a*a+1)
— командаidiv
выполняет деление значения регистраax
на значение переменнойbx
. Результат деления сохраняется в регистреal
. То есть,ax
становится равным(25/с — d +2)/(d+a*a+1)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д