Ошибки при вставке регистров 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. Документы там очень подробные и есть несколько образцов.