Работа с массивом в встроенном ассемблере gcc (ARM) - PullRequest
1 голос
/ 16 марта 2012

У меня проблема с некоторым встроенным ассемблерным кодом.Я пытаюсь загрузить элементы из локального статического массива в регистры на платформе ARM.К сожалению, я не знаю, как сказать GCC, что он должен передать указатель на массив для регистрации.Этот регистр будет использоваться для косвенного доступа к массиву.

// should return argv[1]
int test() {
    int argv[4] = {4, 3, 2, 1};
    int out;

    __asm__ volatile (
        "ldr r0, %[ARGV]" "\n\t"
        "mov r1, #4" "\n\t"
        "ldr r2, [r0, r1]" "\n\t"
        "mov %[OUT], r2"
        : [OUT] "=r" (out)
        : [ARGV] "m" (argv)   //  <==== i don't know which constraint put here :/
        : "r0", "r1", "r2"
    );

    return out;
}

Теперь ошибка выброса GCC и я не знаю, как ее исправить:

Assembler messages:
Error: invalid offset, value too big (0xFFFFFFFC)

Thx

РЕДАКТИРОВАТЬ: Я скомпилировал его с Android NDK (arm-linux-androideabi-g ++)

Ответы [ 2 ]

2 голосов
/ 18 марта 2012

Вам не нужно перемещать ARGV или OUT в / из регистров, это то, что обрабатывают ограничения регистров для вас.

"mov r1, #4\n\t"
"ldr %[OUT], [%[ARGV], r1]\n\t"
: [OUT] "=r" (out)
: [ARGV] "r" (argv)
: "r1"

примечание: у этого кода есть проблемы при компиляции со слишком высокой оптимизациейнастройки.(я не знаю, как это решить, кроме: используйте -O0)

1 голос
/ 16 марта 2012

Я думаю, что это должно работать так:

[ARGV] "r" (argv)

Там написано "загрузить адрес массива в регистр".

...