@SomeManEa

Почему не получается перемножать и делить assembler?

Я, вроде как стал понимать, что если я присвою значение al, потом присвою значение cl
напишу mul cl, то я смогу присвоить ax перемножение al и cl (ax=al*cl)
Но почему-то мне пишет ошибки: operand size conflict, illegal number of operands когда я присваиваю al число, введенное с клавиатуры, а потом его умножаю на 5

Нужно решить уравнение, с помощью ассемблера: Х= 5А + 2В*C – B / 4 + 131

Вот мой код:
#include <iostream>

using namespace std;

int main()
{
    short a, b, c, x;
    cout << "a = "; cin >> a;
    cout << "b = "; cin >> b;
    cout << "c = "; cin >> c;

    _asm {
        mov al,a
        mul al,5
        mov bx,ax
        mov cl,b
        shl cl,1
        mov al,c
        mul cl
        mov cx,b
        idiv cx,4
        add bx,ax
        sub bx,cx
        add bx,131
        mov x,bx
       }
    cout <<"x="<< x<<endl;
}


И я не знаю, почему не получается, что я делаю не так?
  • Вопрос задан
  • 194 просмотра
Пригласить эксперта
Ответы на вопрос 3
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
short: представляет целое число в диапазоне от –32768 до 32767. Занимает в памяти 2 байта (16 бит)

short a, b, c, x;
...
    _asm {
        mov al, a

В al - помещается один байт
Ответ написан
Комментировать
@none7
По моему дело в компиляторе Си. sizeof(al) != sizeof(short) отсюда и ошибка. Вторая ошибка это в том, что idiv принимает только один аргумент и делит dx:ax на указанный аргумент.
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
mul al,5

Нет такого опкода. mul вообще на непосредственное значение умножать не может. imul который может, умножает как минимум 16-битное значение в ax.
Вместо mul умножить на 5 можно через lea (начиная с i386) либо через сдвиг на 2 и сложение.

idiv cx,4

idiv так не умеет. Куда проще было бы сделать sar cx, 2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы