Ошибки при вставке регистров xmm в стек

Я пытаюсь вставить регистр xmm в стек в коде x86_64 C, используя встроенную сборку в стиле GCC. Я посмотрел на ответ на этот вопрос и использую этот код

int main(void) {
    asm volatile("subq 16, %rsp");
    asm volatile("movdqu xmm0, xmmword ptr (%rsp)");
}

и когда я компилирую его на OS X 10.10.2 с clang 6.0, я получаю ошибку error: unexpected token in argument listи зеленая стрелка, указывающая на ptr во второй строке asm.

Я изменяю код на

int main(void) {
    asm volatile("subq 16, %rsp");
    asm volatile("movdqu xmm0, xmmword (%rsp)");
}

и это дает мне error: invalid operand for instruction, Я пытался изменить xmmword в dqword, безрезультатно, и я не уверен, что я делаю неправильно.

Заранее спасибо.

1 ответ

Решение

Существует (по крайней мере) два диалекта ассемблера для формата x86: Intel и AT & T. Похоже, вы пытаетесь написать код в формате Intel, но компилируете с помощью at & t.

Ваш код будет компилироваться с:

int main(void) {
    asm volatile("subq 16, %rsp");
    asm volatile("movdqu %xmm0, (%rsp)");
}

Если вы используете параметр -masm = intel compile, вы также можете использовать это (что может показаться вам более знакомым):

int main(void) {
    asm volatile("sub rsp, 16");
    asm volatile("movdqu xmmword ptr [rsp], xmm0");
}

Тем не менее, написание блока asm с использованием нескольких операторов asm, как это, является плохой идеей. В документах gcc четко указано:

Не ожидайте, что последовательность операторов asm останется идеально последовательной после компиляции.Если определенные инструкции должны оставаться последовательными в выходных данных, поместите их в один оператор asm из нескольких инструкций.

Так что, возможно, что-то более похожее на:

int main(void) {
    asm volatile("subq 16, %rsp\n"
                 "movdqu %xmm0, (%rsp)");
}

Кроме того, если вы собираетесь читать или обновлять переменные, вы не должны использовать базовый asm, а вместо этого использовать Extended. Документы там очень подробные и есть несколько образцов.

Другие вопросы по тегам