2013-11-02 6 views
2

Это мой текущий код: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 не изменится.

ответ

4

Ошибка говорит вам о том, что происходит не так - ограничение = применяется только к выходу, а не входам, а ваш шаблон asm имеет два входа (один смутно названный «dst») и без выходов. Вы, вероятно, имел в виду, чтобы иметь 'DST' будет выход:

asm("rev %[dst], %[src]" : [dst]"=r"(val) : [src]"r"(val)); 
+1

'ASM ("числа оборотов% [подкачки],% [своп]": [подкачки] "= г"(значение): "0"(Val)), 'может быть лучше. Вы можете использовать спецификатор «0», чтобы сказать, что вход такой же, как и заданный вывод; это иногда генерирует лучший код, так как регистр будет таким же. Кроме того, * src/dst * сбивает с толку, как вы заметили. –

+0

@artlessnoise: использование ограничения '0' заставит его использовать один и тот же регистр для src и dst, что может потребовать дополнительного перемещения, чтобы получить их в одном месте. Использование отдельных ограничений ввода и вывода позволяет компилятору использовать один и тот же регистр или разные регистры, в зависимости от того, что лучше. В этом конкретном случае это не имеет значения, но никогда не будет лучше использовать '0'. –

+0

@artlessnoise: 'dst' - это просто имя идентификатора для регистра операндов, поэтому его невозможно вычислить. '0' потребует дополнительного перемещения, если' val' уже находится в определенном регистре (возможно, в регистре аргументов) и в следующий раз необходим в другом регистре (например, в регистре возвращаемого значения) –

Смежные вопросы