конвертировать код x86 asm в код arm на iOS - PullRequest
2 голосов
/ 11 сентября 2011

Может ли кто-нибудь помочь мне преобразовать следующий встроенный код asm x86 в формат arm?

bool N_FLAG = 0;
bool C_FLAG = 0;
bool Z_FLAG = 0;
bool V_FLAG = 0;

asm  ("sub %1, %%ebx;"\
"setsb N_FLAG;"\
"setzb Z_FLAG;"\
"setncb C_FLAG;"\
"setob V_FLAG;"\
: "=b" (reg[dest].I)\
: "r" (reg[base].I), "b" (value));

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

Как насчет преобразования этого в C?

Похоже, код вычитает два числа (value - reg[base].I), сохраняет результат в reg[dest].I и затем проверяет различные флаги.

Итак, что-то (грубо говоря, не проверено), например:

reg[dest].I = value - reg[base].I;
Z_FLAG = (reg[dest].I == 0);
N_FLAG = (reg[dest].I < 0);
/* repeat for: carry, overflow */

А затем позволить компилятору творить чудеса?ARM-компилятор gcc неплох в отображении такого рода вещей в правильные инструкции ARM.

Если вы хотите выполнить сборку ARM, вы, вероятно, смотрите на использование инструкций условного перемещения, что-то вроде (написал быстро - не проверял):

__asm__ (
"subs %[out], %[in2], %[in1]\n\t"
"movmi %[N_FLAG], #1\n\t"
"moveq %[Z_FLAG], #1\n\t"
"movcs %[C_FLAG], #1\n\t"
"movvs %[V_FLAG], #1\n\t"
: [N_FLAG]"+r"(N_FLAG), [Z_FLAG]"+r"(Z_FLAG), [C_FLAG]"+r"(C_FLAG), [V_FLAG]"+r"(V_FLAG), [out]"=r" (reg[dest].I)
: [in1]"r" (reg[base].I), [in2]"r"(value))
: "cc"
);
1 голос
/ 11 сентября 2011

Этот код работает для меня, используя clang:

int sub(int a, int b)
{
  int c;
  asm ("sub %0, %2, %1" : "=r" (c) : "r" (b), "r" (a));
  return c;
}

Обратите внимание на запятые между аргументами регистра.

...