Вычислить арифметическое выражение - 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)

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

  1. mov al,[a] — в коде используется команда mov, которая переносит значение из памяти в регистр. В данном случае, значение переменной a переносится в регистр al.
  2. imul [a]; ax=a*a — команда imul выполняет умножение значения в регистре al на значение, переданное в качестве аргумента команды (в данном случае [a]), и сохраняет результат в регистре ax. То есть, ax становится равным a*a.
  3. inc ax; ax=a*a+1 — команда inc увеличивает значение регистра ax на единицу. То есть, ax становится равным a*a+1.
  4. add ax,d; ax=d+a*a+1 — команда add складывает значение регистра ax с переменной d. То есть, ax становится равным d+a*a+1.
  5. mov bx,ax — команда mov переносит значение регистра ax в регистр bx.
  6. mov ax,25 — команда mov устанавливает значение регистра ax равным 25.
  7. idiv [c]; al=25/c — команда idiv выполняет деление значения регистра ax на значение переменной c. Результат деления сохраняется в регистре al.
  8. cbw — команда cbw конвертирует значение регистра bx в слово с старшим битом равным 0 и сохраняет его в регистре ax. То есть, ax становится равным bx.
  9. add ax,2; ax=25/c+2 — команда add увеличивает значение регистра ax на два. То есть, ax становится равным 25/c+2.
  10. sub ax,[d] — команда sub вычитает значение переменной d из значения регистра ax. То есть, ax становится равным ax-d.
  11. cwd; dx:ax=25/c-d+2 — команда cwd конвертирует значение регистра ax в слово с старшим битом равным 1 и сохраняет его в регистре dx. То есть, dx:ax становится равным 25/c-d+2.
  12. idiv bx; ax=(25/с — d +2)/(d+a*a+1) — команда idiv выполняет деление значения регистра ax на значение переменной bx. Результат деления сохраняется в регистре al. То есть, ax становится равным (25/с — d +2)/(d+a*a+1).

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

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