С массивами в GCC встроенной сборки? - PullRequest
2 голосов
/ 15 августа 2011

Я пытаюсь написать функцию во встроенной сборке C / x86_64, но мне не очень везет.

Мы можем свести все это к следующему:

void f(const unsigned char *a, unsigned char *b, const unsigned char *c) {
    asm __volatile__ ("movdqa %0, %%xmm0" : : "m"(a) : "%xmm0");
}

(Кстати, функция вызывается правильно; я пытаюсь заменить код C, и когда я использую закомментированный код C, он работает просто отлично.)

Вылетает:

Тип исключения: EXC_BAD_ACCESS (SIGSEGV)
Коды исключения: 0x000000000000000d, 0x0000000000000000
Сбой потока: 0 Очередь отправки: com.apple.main-thread

Я пробовал довольно много комбинаций ограничений, но (как я уже сказал) мне не очень повезло.

Цель состоит в том, чтобы иметь доступ ко всем трем параметрам функции в сборке; a только для чтения, b для чтения и записи и c только для чтения.
Как видите, все три являются массивами символов в C; тем не менее, a и b имеют длину 16 байтов и могут быть сохранены в каждом регистре XMM (что является одной из моих целей).
c - это массив таких переменных, поэтому каждую из них можно также сохранить в регистре XMM.

Кроме того, я должен отметить, что я бы предпочел, чтобы GCC не загружал данные в регистры (как это происходит с ограничением "x"), а оставил это мне.

Я был бы очень признателен, если бы кто-то мог написать для меня ограничения (и, если вам так хочется, добавьте краткое объяснение.)

1 Ответ

5 голосов
/ 17 августа 2011

Решение (как указано в комментариях к вопросу) состояло в том, чтобы просто разыменовать указатель перед передачей в блок asm. В результате все заработало как надо.

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

...