Использование инструкций ASM в процессоре ARM

Я впервые борюсь с процессорами ARM (ARMv6), и мне нужна небольшая помощь, пока я пытаюсь «перевести» блок кода ASM, написанного в исходном коде C ++.

Оригинальный код показывает:

#ifdef _WIN32
__asm
{
mov eax, var1
xor edx, edx
div var2
mov var1, eax
mov var3, edx
}
#else
__asm__ __volatile__ ( “mov %2, %%eax;”
“xor %%edx, %%edx;”
“divl %3;”
“mov %%eax, %0;”
“mov %%edx, %1;”
: “=m” (var1), “=m” (var3)
: “m” (var1), “m”(var2)
: “%eax”, “%edx”
);
#endif

Итак, я могу предположить, что мне нужно добавить новую строку, чтобы «позволить компилятору» идентифицировать «ARM», делая что-то вроде:

#if defined _WIN32
__asm
#elif defined __ARM_ARCH_6__
//here my new code
#else
__asm__ __volatile__
#endif

Но, как я уже сказал, я впервые использую процессор ARM, поэтому у меня есть несколько вопросов …
По найденной здесь ссылке (stackoverflow) я нашел руководство по ARM ASM, в котором говорится, что имеется 16 регистраторов (r0 — r15), в которых (я полагаю) r4 — r8 доступны для «свободного использования». Это правильно?

Если это правильно, я могу «перевести» [eax = r4, edx = r5] или что-то подобное. Но я действительно понятия не имею, как я должен объявить блок; Я имею в виду, является ли «__asm__ __volatile__» правильной «подписью» в этом случае? Является ли еще один правильный?

Как я должен поставить блок? Между скобками ({})? Как я могу ссылаться на «var1», «var2» и «var3»?

Любая ссылка будет в порядке, Я не хочу «перевод», потому что я хочу знать об этой теме …

Заранее большое спасибо

__

Изменить: я смотрел глубже (я должен признаться, что вначале я смотрю только на #ifdef и #else, что очень плохо) исходный код, и я нашел это:

unsigned int var1 = (unsigned int)var0;
for (; i >= 0; i--){
#ifdef __powerpc__
var4[i] = var5[var1 % m_var2];
var1 /= m_var2;
#else
unsigned int var2 = m_var2;
unsigned int var3;
#ifdef _WIN32
__asm
{
mov eax, var1
xor edx, edx
div var2
mov var1, eax
mov var3, edx
}
#else
__asm__ __volatile__ (  "mov %2, %%eax;""xor %%edx, %%edx;""divl %3;""mov %%eax, %0;""mov %%edx, %1;": "=m"(var1), "=m"(var3)
: "m"(var1), "m"(var2)
: "%eax", "%edx");
#endif
var4[i] = var5[var3];
#endif
}

Итак, как я вижу, «#ifdef PowerPC Блок будет хорошо работать в ARM, так как он не использует никаких инструкций ASM, верно? Принимая это правда, я могу переписать

#if defined(__powerpc__) || defined(__ARM_ARC_6__)
//stuff here...

Это будет работать?

Снова так


Отредактируйте снова: лучше проверить, прежде чем спрашивать … Это работает! Но теперь у меня появились новые проблемы с компоновщиком … 🙁

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector