0;
asm("mov a, 100");
cout << a << endl;
return 0;
}
Ошибка:
<inline asm>:1:6: error: invalid operand for instruction
mov a, 100
^
1 error generated.
Вроде четыре проблемы: 1. Нельзя так просто взять и записать константу в память, надо через промежуточный регистр. Например, eax. 2. Если мы хотим использовать какой-то регистр, компилятору иногда надо об этом сообщить, чтобы он не хранил в этом регистре что-то промежуточное. В случае с gcc надо использовать extended asm (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html) 3. Если gcc — нужен синтаксис AT&T, а не Intel (см. вики). В частности: а. Перед константами надо ставить доллар, иначе это будет чтение из соответствующего адреса памяти. б. Перед именами регистров надо ставить процент. в. Порядок операндов: сначала откуда, потом куда. В Intel наоборот. 4. Приведённый вами код неполный и не компилируется по причинам, не связанным с ассемблером. А ещё inline assembly вроде почти никак не регламентируется, так что могут быть дикие несовместимости между компиляторами. Какой у вас компилятор?
всё не так, ты пишешь на ассемблере там где надо писать на С
Например, на GCC можно написать так: https://ideone.com/u0FOFT Тут я использую extended asm и говорю gcc, что я буду писать в переменную a, а она должна лежать в регистре (иначе mov не сработает), внутри ассемблерного кода использую %0, чтобы получить то место, в которое gcc положит a. Если посмотреть на ассемблерный вывод, то у меня gcc заоптимизировал это до уровня "запишем сотню сразу в регистр, из которого будет читать вызванный operator<<"
Обсуждают сегодня