Я пытаюсь написать функцию во встроенной сборке 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"), а оставил это мне.
Я был бы очень признателен, если бы кто-то мог написать для меня ограничения (и, если вам так хочется, добавьте краткое объяснение.)