Я написал простую программу, содержащую встроенный ассемблерный код. Мой код просто добавляет переменные a и b и возвращает результат в b.Модификаторы ограничения сборки inline = и +
Что меня смущает, почему код ниже генерирует эту инструкцию movl 28 (% esp),% ecx.
Я не полностью выполняю роли модификаторов + и = играю во входных и выходных списках. Итак, было бы полезно, если бы вы могли пролить свет на это.
#include <cstdio>
int main(int argc , char ** argv)
{
int a = 2, b = 7;
__asm__
(
"addl %1,%0;"
:"+r"(b)
:"r"(a), "r"(b)
);
printf("b = %d\n",b);
return 0;
}
movl $2, 24(%esp) movl $7, 28(%esp) movl 24(%esp), %edx movl 28(%esp), %ecx movl 28(%esp), %eax addl %edx,%eax movl %eax, 28(%esp)
То, что я собираюсь показать следующий неправильно. Но это ради лучшего понимания того, что происходит в GCC.
Хорошо, теперь я изменил с + r на = r. И это код сборки GCC.
#include <cstdio>
int main(int argc , char ** argv)
{
int a = 2, b = 7;
__asm__
(
"addl %1,%0;"
:"=r"(b)
:"r"(a), "r"(b)
);
printf("b = %d\n",b);
return 0;
}
movl $2, 24(%esp) movl $7, 28(%esp) movl 24(%esp), %eax movl 28(%esp), %edx addl %eax,%eax; movl %eax, 28(%esp)
Теперь выход 4, который является неправильным. Мой вопрос: почему с «= r» GCC решил повторно использовать регистр eax для b, как показано в этой инструкции addl% eax,% eax;
спасибо за ваш ответ. Я поняла концепцию. Но у меня есть еще один пример. Я скоро обновляю свой пост с помощью нового примера. –
@takwing: Я обновил новый вопрос. Короткий ответ: если ограничения регистра не соответствуют тому, что делает сборка, то распределения регистров будут фиктивными. –
Большое спасибо за ваш ответ. Понятно об этом. Что касается документации, я читал ее снова и снова, но я все еще не понимал всей концепции. Это то, что документация говорит об этих двух модификаторах: = ' Означает, что этот операнд предназначен только для записи для этой команды: предыдущее значение отбрасывается и заменяется выходными данными. '+' Означает, что этот операнд считывается и записывается инструкцией. То, что меня смущает и все еще путает, - это использование слова «эта инструкция». Однако внутри asm() может быть последовательность инструкций по сборке. –