push ebp: несоответствие типов операндов для `push ' - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь скомпилировать следующее, используя gcc -c main.s

.intel_syntax noprefix

.global main

main:
    push   ebp
    mov    ebp,esp
    sub    esp,0x10
    mov    DWORD PTR [ebp-0xc],0x0
    mov    eax,DWORD PTR [ebp+0xc]
    mov    eax,DWORD PTR [eax+0x4]
    mov    DWORD PTR [ebp-0x4],eax
    leave
    ret

И я получаю ошибку:

main.s: 6: Ошибка:несоответствие типов операндов для `push '

По какой причине это не работает?

1 Ответ

0 голосов
/ 07 октября 2018

Из Руководства разработчика программного обеспечения Intel® 64 и IA-32 для архитектур , 7.3.1.5 Инструкции по работе со стеком в 64-битном режиме :

В 64-битном режиме размер указателя стека составляет 64 бита и не может быть переопределен префиксом инструкции.В неявных ссылках на стек переопределения размера адреса игнорируются. В 64-битном режиме невозможно получить и вытолкнуть 32-битные значения из стека.

(выделение.)

push ebp попыткивыдвинуть 32-битный регистр, что недопустимо в 64-битном режиме.


Это 32-битный код (и может произойти сбой в 64-битном режиме, даже если push ebp был закодирован), поэтому вам нужно собрать его в 32-битный исполняемый файл.При использовании gcc или clang используйте

gcc -m32 -no-pie -fno-pie  main.s  -o my_prog

(параметры no-pie не обязательны, но вы, вероятно, хотите, чтобы они получили более простой зависимый от позиции исполняемый файл для 32-разрядного кода.)

...