2

Я не понимаю, почему этот кодОшибка компиляции со встроенным ассемблером

#include <iostream> 
using namespace std; 
int main(){ 
    int result=0; 

    _asm{ 
     mov eax,3; 
     MUL eax,3; 
     mov result,eax; 
    } 

    cout<<result<<endl; 
    return 0; 
} 

показывает следующее сообщение об ошибке.

1> C: \ Users \ Дэвид \ документы \ Visual Studio 2010 \ Projects \ assembler_instructions \ assembler_instructions.cpp (11): ошибка C2414: незаконное количество операндов

Все, кажется, прекрасно, и но почему я получаю эту ошибку компилятора?

+0

Я добавил теги Visual Studio и ассемблера, поскольку этот вопрос не имеет ничего общего с C++. –

+0

У меня нет ни одного из моих справочных материалов, доступных на данный момент, и я терплю неудачу в google ... Не является ли MUL reg, imm незаконным (по крайней мере, в 8086-совместимом режиме, что может быть тем, что компилятор выполняет по умолчанию в)? –

ответ

2

использования :

imul eax, 3; 

или:

imul eax, eax, 3; 

Таким образом, вам не нужно беспокоиться о том, что edx-register подвергается сбиванию. Это «целое число со знаком». Кажется, у вас есть «int» -result, поэтому не имеет значения, используете ли вы mul или imul.

Иногда я получаю ошибки из-за отсутствия регистра edx при делении или умножении. Процессор был Intel Core2 Quad Q9550

Есть numbingly overengineered, но правильный справочник руководства инструкции Intel вы можете прочитать. Хотя Intel сломала свои сайты еще раньше. Однако вы можете попробовать найти те же справочные руководства с сайтов AMD.

Обновление: Я нашел руководство: http://www.intel.com/design/pentiumii/manuals/243191.htm

Я не знаю, когда они собираются снова ломают сайты, так что вам действительно нужно всегда искать его.

Update2: ARGHL! это с 1999 года. И, к сожалению, большинство деталей, к сожалению, одинаково.

+1

* I *, как в руководствах по эксплуатации intel. :) –

11

Согласно this page, то mul команд принимает только один аргумент:

мул Arg

Это умножает «ARG» значением соответствующего байта длины в регистр, смотрите таблицу ниже :

размер операнда 1 байт 2 байта 4 байта

другой операнд AL AX EAX

выше часть результата хранится в: AH DX EDX

нижняя часть результата хранится в: AL AX EAX

+1

@ Давит: Другими словами, попробуйте просто 'mul 3'. –

+1

Вам нужно использовать другой регистр в операторе MUL –

4

Таким образом, следуя нот, как на ссылку Джастина:

#include <iostream> 

int main() 
{ 
    int result=0; 

    _asm{ 
     mov eax, 3; 
     mov ebx, 4; 
     mul ebx; 
     mov result,eax; 
    } 

    std::cout << result << std::endl; 

    return 0; 
} 
1

Необходимо загрузить руководства по архитектуре Intel.

http://www.intel.com/products/processor/manuals/

Для вашей цели, объем 2 собирается помочь вам больше всего.

С точки зрения доступа в июле 2010 года, они являются текущими.

+0

Как вы их нашли? – Cheery

+0

@CHery: ссылка на инструкцию для справки Intel x86. Эта ссылка указывает на руководства по выпуску в июне 2010 года. –

Смежные вопросы