Я пытаюсь преобразовать существующую встроенную сборку x86_64 в совместимую с AArch64 версию. Я встречая следующие ошибки при компиляции:Портирование x86_64 Сборка в AArch64
/tmp/ccSvqF1I.s:72547: Error: operand 1 should be an integer register -- `str [0x4,x1],#0x43e00000'
/tmp/ccSvqF1I.s:72548: Error: operand 1 should be an integer register -- `str [20,x1],2'
x86_64 код ниже, если исходный и код AARch64 моя попытка переносить его.
x86_64 Монтаж:
__asm__(
"incq (%0)\n\t"
"jno 0f\n\t"
"movl $0x0, (%0)\n\t"
"movl $0x43e00000, 0x4(%0)\n\t"
"movb %1, %c2(%0)\n"
"0:"
:
: "r"(&op1->value),
"n"(IS_DOUBLE),
"n"(ZVAL_OFFSETOF_TYPE)
: "cc");
AArch64 Ассамблея
__asm__(
"add %0, %0, #1\n\t"
"bvc 0f\n\t"
"mov %0, #0x0\n\t"
"str [0x4, %0], #0x43e00000\n\t"
"str [%c2, %0], %1\n\t"
"0:"
:
: "r"(&op1->value),
"n"(IS_DOUBLE),
"n"(ZVAL_OFFSETOF_TYPE)
: "cc");
Edit: обновление с новой попыткой и сообщения об ошибках
Не смысл звучать грубо, но вам, вероятно, следует попробовать использовать инструкции и синтаксис AArch64, в отличие от того, что это такое. – Notlikethat
@Notlikethat Я предполагаю, что моя реальная проблема не понимает часть '% c2 (% 0)' кода x86. Кажется, я не могу найти документацию, описывающую, что делает этот код. – Grice
Моя сборка x86 довольно ржавая, и я знаю, что это мой синтаксис Intel, а не глупый синтаксис AT & T GNU, но я думаю, что это просто базовый регистр + немедленная адресация смещения с ограничением, что 'ZVAL_OFFSETOF_TYPE' должно быть константой времени компиляции - см. [«Охотники-модификаторы x86» в документах] (https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#Extended-Asm). В любом случае любой операнд памяти не подходит для команды ARM 'mov'. – Notlikethat