Локальные переменные
asm гарантированно работают только с расширенными операторами asm в GNU C. Вы используете их с Basic asm, что может работать, но это не гарантируется. (https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html
И бессмысленно, когда вы можете просто использовать ограничения типа "a"(1UL)
, чтобы поместить 1
в RAX. Также не забудьте объявить клобберы на RCX и R11 из-за того, как работает syscall
, и что RAX также является выходом.
В любом случае, конечно, специфичные для x86 имена регистров не будут работать при компиляции в переносимую платформу-нейтральную / архитектурно-нейтральную web версию, а не напрямую в x86 asm.
В браузере, работающем на процессоре ARM, эти регистры не будут доступны, когда JITing webasm превращается в собственный код. Даже браузер, скомпилированный для 32-битного x86, не будет иметь этих регистров.
Кроме того, в браузере, работающем на x86-64 Windows, эти регистры будут доступны, но ABI системного вызова Linux не будут работать.
AFAIK, вы не можете обернуть специфический для цели встроенный asm и определенные регистры в web-asm, даже если ваша единственная предполагаемая цель - та, где они будут работать. Язык web-asm не предназначен поддержать его.
Когда вы запускаете gcc или clang, целью является WASM, не x86.