Встроенный ассемблер ICC не любит push/pop

Я пытаюсь запустить встроенный ассемблер с помощью icc в msasm:

int main (void)
{
  __asm{
    mov eax, 5h;  //works
    push eax;     // after shell command /opt/intel/bin/icc -use_msasm asm.c:
                  // asm.c(7): (col. 5) error: Unsupported instruction form in asm                          
                  // instruction push.

   //pop ebp;    // the same 
        };

printf("success!\n");
return 1;
}

Кто-нибудь знает, почему icc не принимает push и pop?

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


person snoere    schedule 12.01.2012    source источник
comment
В 64-битном режиме push <32bit-reg> не определено (push и pop всегда работают со всем регистром, т.е. является ли операция PUSH AX, PUSH EAX или PUSH RAX зависит только от текущего размера операнда по умолчанию - для ЦП инструкция/код операции одинакова).   -  person FrankH.    schedule 25.06.2012
comment
@ФрэнкХ. 16-битная отправка доступна всегда (во всех режимах), но 64-разрядный режим не может использовать 32-разрядную передачу. то есть префикс размера операнда 66h работает, но REX.W=0 не переопределяет значение по умолчанию с 64 до 32. Сколько байтов занимает инструкция push помещается в стек, когда я не указываю размер операнда?   -  person Peter Cordes    schedule 19.07.2018


Ответы (1)


Вместо этого вы должны использовать версию регистров x64. Итак, правильная версия должна выглядеть так:

__asm{
    mov rax, 5h;
    push rax;
};

Кроме того, обратите внимание на различия в архитектуре при работе с указателями, 0x8******* и т. д. Вы никогда не должны использовать пакетный поиск и замену, не прочитав сначала встроенный код.

person Ayatsuki Yakumo    schedule 19.07.2018