Это мой текущий код:ARM встроенный ассемблер - входной операнд ограничение содержит «=»
void int32hex(u32 val, char *out) {
asm("rev %[dst], %[src]" :: [dst]"=r"(val), [src]"r"(val));
binhex((u8*)&val, 4, out);
}
Моя идея заключается в том, чтобы принять аргумент val
, перевернуть его (порядка байтов), используя rev
инструкцию, а затем передать его на.
Из того, что я прочитал, приведенный выше код кажется правильным, регистр назначения имеет флаг =r
, что означает, что регистр может быть записан в. Однако при запуске, хотя GCC, я получаю ошибку: входное ограничение операнда содержит '='
Если я сменил флаг на r
, тогда он скомпилирует штраф, но значение val
не изменится.
'ASM ("числа оборотов% [подкачки],% [своп]": [подкачки] "= г"(значение): "0"(Val)), 'может быть лучше. Вы можете использовать спецификатор «0», чтобы сказать, что вход такой же, как и заданный вывод; это иногда генерирует лучший код, так как регистр будет таким же. Кроме того, * src/dst * сбивает с толку, как вы заметили. –
@artlessnoise: использование ограничения '0' заставит его использовать один и тот же регистр для src и dst, что может потребовать дополнительного перемещения, чтобы получить их в одном месте. Использование отдельных ограничений ввода и вывода позволяет компилятору использовать один и тот же регистр или разные регистры, в зависимости от того, что лучше. В этом конкретном случае это не имеет значения, но никогда не будет лучше использовать '0'. –
@artlessnoise: 'dst' - это просто имя идентификатора для регистра операндов, поэтому его невозможно вычислить. '0' потребует дополнительного перемещения, если' val' уже находится в определенном регистре (возможно, в регистре аргументов) и в следующий раз необходим в другом регистре (например, в регистре возвращаемого значения) –