Да, выглядит мне правильно , за исключением того, что "+m"
делает ввод "m"
для того же массива избыточным. Используйте "+m"
для массива только для чтения и записи и "m"
для массива только для чтения. Но с тем же преобразованием в массив, что и вы.
Отдельные входные и "=m"
операнды могут теоретически сказать компилятору, что он может использовать ваш asm в качестве функции копирования и обработки (так чтоне делайте этого, если это не правда, что вы используете разные указатели для чтения ввода и записи вывода). Хотя в отличие от скаляра, я не думаю, что GCC изобрел бы новую копию массива. Но "+m"
означает изменение на месте, чтобы компилятор не имел этой опции.
См. Как я могу указать, что память * указана * встроенным ASMаргумент может быть использован? (этот вопрос является почти дубликатом этого). Он показывает пример массива ввода с использованием произвольной длины *(const char (*)[])
input. На практике [N]
, кажется, игнорируется (рассматривается как неограниченный), если это не константа времени компиляции, подразумевая, что весь объект может быть доступен. например, gcc не оптимизирует и не переупорядочивает хранилище до arr[N+1]
вокруг оператора asm, используя (int (*)[N])
, если только N не является константой времени компиляции.
Также обратите внимание, что если ваш ввод действительно C массив , а не просто указатель, вам не нужно никакого приведения. int arr[1024]
как "m"(arr)
вход означает означает весь массив и не затухает до указателя в памяти.
(Компилятор назначает регистрывводить и выводить параметры только в том случае, если эти параметры действительно используются в строке кода asm?
Нет, распределение регистров для операндов не зависит от того, заполнены ли они в шаблоне или нет.
GCC не нужно различать вход "a"
, который можно использовать как %%rax
(вместо %0
), против входа "r"
, где шаблон должен использовать %0
или%[name]
потому что он не знает, что может выбрать компилятор.
В собственной документации gcc упоминается синтаксис для выходного массива, но, похоже, ничего не говорится о вводемассивы, так что я просто делаю дикое предположение здесь.
Это идентично, и да, это необходимо.
Без надлежащих фиктивных входов для покрытия ваших массивов (или "memory"
clobber), устранение или изменение порядка храненияруды с вашим asm утверждением возможно. (Например, foo[2] = 1; asm(); foo[2] = 3;
может переместить первый магазин позже, или 2-й магазин раньше, и сделать только один.