inline asm, когда использовать r и когда использовать m? почему это поведение?

0

Я пытаюсь вникать в некоторые встроенные сборки. Это интересно, но документация скудна, а 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". Почему это? Какую часть информации мне не хватает?

Теги:
inline-assembly

1 ответ

0

Вероятно, вы должны найти себе пару справочников, 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

  • 0
    Так что в основном переменные C почти всегда находятся в памяти, и я должен вручную загрузить их оттуда. Это правильно? % 1 в вашем коде это "r" (other_val) или что-то еще? Я думал, что other_val помечен как% 0. Таким образом,% 0 является регистром вывода, эквивалентным other_val в моем примере, и% 1 является регистром ввода, также эквивалентным other_val?
  • 0
    Что такое djgpp ? Это не похоже на ответ, хотя вы упомянули документы, которые были бы необходимы для формирования ответа. (Я не думаю, что когда-либо видел надлежащую документацию встроенного ассемблера GCC, и я не уверен, что он существует.)
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню