Я пытаюсь вникать в некоторые встроенные сборки. Это интересно, но документация скудна, а newb - недружелюбно.
Этот код работает так, как ожидалось, он правильно умножает
{
int other_var=3;
asm volatile
(
"mov $3,%0\n\t"
"roll $2,%0;"
:"=r"(other_var)
:"r"(other_var)
);
cout << "other_var equals " << other_var <<endl;
return 0;
}
но это
int other_var=3;
cout << "other_var equals " << other_var <<endl;
asm volatile
(
"roll $2,%0;"
:"=r"(other_var)
:"r"(other_var)
);
cout << "other_var equals " <<hex<< other_var <<endl;
return 0;
}
Когда я удаляю, по-видимому, произвольное mov, код ведет себя так, как будто undefined и выводит мусор. Внезапно программа не загружает other_var из памяти для регистрации, и требуется опция "= m" и "m". Почему это? Какую часть информации мне не хватает?
Вероятно, вы должны найти себе пару справочников, PDF или веб-сайтов. 1, который документирует специфический характер компилятора встроенной сборки и 1, который документирует специфику языка ассемблера. Тогда надеюсь, что никто никогда не попытается запустить ваш код на другом оборудовании.
В первом фрагменте кода вы назначаете постоянное значение 3, "$ 3", в регистр привязки "% 0". Затем вы выполняете рулон по выходному связанному регистру "% 0" по константам 2, "2", бит.
Эффективное умножение 3 на 4.
Ни один блок кода фактически не считывает исходное значение из переменной other_var.
m - для памяти, r - для регистрации. = для вывода, no = используется для ввода.
mov %1, %0; load the register used for output with the value of the register used for input..
roll $2, %0; Then roll the output register
Когда вы просто захватите регистр и начнете использовать существующий бит, найденный там, вы, скорее всего, увидите что-то похожее на "Мусор".
http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5 http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html
djgpp
? Это не похоже на ответ, хотя вы упомянули документы, которые были бы необходимы для формирования ответа. (Я не думаю, что когда-либо видел надлежащую документацию встроенного ассемблера GCC, и я не уверен, что он существует.)