Подтвердить что ты не робот

Xcode: работает ASM

У меня есть эта ASM, которую я пытался запустить в Xcode без успеха:

_asm
{
    push eax
    push ebx
    push ecx
    mov eax,[A]
    mov ebx,[B]
    xor eax,ebx
    mov ecx,eax
    xor ecx,ebx
    mov ebx,ecx
    xor eax,ebx
    mov [A],eax 
    mov [B],ebx 
    pop eax 
    pop ebx 
    pop ecx 
}

Я попытался изменить его на __asm__, но ошибка все еще сохраняется:

inline asm: 6: 2: Неизвестное использование мнемоники команд без суффикса размера

Я искал онлайн в течение нескольких часов, но никто, кажется, не ответил на мой вопрос.

Я запускаю Xcode 5.0.2.

Кто-нибудь знает, что мне может понадобиться для установки в Xcode, чтобы запустить это?

4b9b3361

Ответ 1

Эквивалентный оператор ASM в стиле GCC будет выглядеть следующим образом:

__asm__(
    "push %%eax\n\t"
    "push %%ebx\n\t"
    "push %%ecx\n\t"
    "mov %0,%%eax\n\t"
    "mov %1,%%ebx\n\t"
    "xor %%ebx,%%eax\n\t"
    "mov %%eax,%%ecx\n\t"
    "xor %%ebx,%%ecx\n\t"
    "mov %%ecx,%%ebx\n\t"
    "xor %%ebx,%%eax\n\t"
    "mov %%eax,%0\n\t"
    "mov %%ebx,%0\n\t"
    "pop %%ecx\n\t"
    "pop %%ebx\n\t"
    "pop %%eax"
    : "+m" (A), "+m" (B));

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

Я не уверен, какой смысл в этой инструкции сборки. Он прилагает много усилий, чтобы сделать что-то, что можно было бы сделать гораздо эффективнее в трех строках кода C/С++:

temp = A;
A = B;
B = temp;

Если бы я притворился, что он сделал что-то полезное, а не просто заменил две переменные, я бы предложил избавиться от явно несущественных инструкций PUSH/POP:

__asm__(
    "xor %1,%0\n\t"
    "mov %0,%2\n\t"
    "xor %1,%2\n\t"
    "mov %2,%1\n\t"
    "xor %1,%0"
    : "+r" (A), "+r" (B), "=r" (temp));