Size: a a a

Ассемблер

2021 August 22

E

Entusiast in Ассемблер
Ну-ка не ври!
источник

E

Entusiast in Ассемблер
А вот O3:
источник

s

s54816 in Ассемблер
Окей,  мы оба правы 😄 11 делает пуши. А вот 8 делал мовы даже на -O0.

Ммм, и шланг 12 тоже мовы делает при -O0. Видимо, поэтому я и запомнил.
источник

ВВ

Вячеслав Васютин... in Ассемблер
Почему не наоборот?
push rbp
mov rbp, rsp
источник

E

Entusiast in Ассемблер
Чтобы при этом ещё сохранить rbp
источник

ВВ

Вячеслав Васютин... in Ассемблер
Так в rbp ничего нет
источник

ВВ

Вячеслав Васютин... in Ассемблер
Ничего не указано
источник

E

Entusiast in Ассемблер
Будет rsp
К примеру, перед вызовом функции ты положил в EBP какое-то значение, вызвал функцию, а после вызова твоего значения там уже нет, вместо него там какой-то указатель на стэк.
Вот в данном случае и сделано push rbp, чтобы потом ещё сохранить исходный RBP
источник

E

Entusiast in Ассемблер
Но при этом если у тебя много регистров используется в функции, а сохранять их всех, и держать постоянно смещение на +32 (а то и ещё больше) - неудобно.
Затем ты можешь сделать так:

push eax
call func

func:
push ebp
mov ebp, esp
push ebx
push ecx
push edx

И теперь ты можешь получить аргумент, относительно EBP+8.
Если бы ты сделал без EBP, было бы так:

push ebx
push ecx
push edx

mov eax, dword[esp+12]

А если регистров ещё больше - r0-r15, тогда смещение возрастает, становится неудобно.
источник

ВВ

Вячеслав Васютин... in Ассемблер
extern, как в nasm, есть? Импортировать printf смогу?
источник

E

Entusiast in Ассемблер
Можно и без extern, с самописной импорт-таблицей на либц

Но если не хочешь хардкода - есть format ELF
Когда прописываешь этот формат - тебе будет доступны extern
Но тогда на выходе будет обьектный файл, и его нужно будет скормить линковщику. В общем, как с NASM
источник

ВВ

Вячеслав Васютин... in Ассемблер
Аа, т.е. с extern можно обойтись, и вызвать printf так:

push rbp
mov rbp, rsp

 xor rsi, rsi
 xor rax, rax

 lea rdi, [msg]
 mov esi, 1
 call printf
источник

ВВ

Вячеслав Васютин... in Ассемблер
Ну это не я писал...
источник

ВВ

Вячеслав Васютин... in Ассемблер
Я вообще ничего пока понять не могу, сколько не обьясняй..
источник

E

Entusiast in Ассемблер
Нет, ты не понял
Можно самому прописать импорт-таблицу
Как я сделал тут:

А можно прописать format ELF, и использовать extern:
источник

E

Entusiast in Ассемблер
Но с format ELF у тебя будет на выходе не исполняемый красивый файл, который ты получаешь сейчас, а обьектный файл, как с NASM. Этот обьектник нужно будет передавать в линковщик
источник

ВВ

Вячеслав Васютин... in Ассемблер
Ох, ну такое ☝️ для меня, как эверест покорить.
источник

s

s54816 in Ассемблер
А ты не думал это доупаковать в макросы до чего-то подобного import в инклудах для винды?
источник

E

Entusiast in Ассемблер
Так уже есть, в той теме на форуме, что я скинул

Мне просто удобнее чтоб всё в одном файле, вот я и вырезал нужные макросы
источник

s

s54816 in Ассемблер
А, окей.
источник