Size: a a a

Ассемблер

2021 August 20

E

Entusiast in Ассемблер
Ну если нет, тогда тебе 0 не нужен
источник

ST

Saenro T in Ассемблер
Если RDX=length, то я бы убрал нули как лишний балласт.
источник

E

Entusiast in Ассемблер
Два балласта
Там же dword 0
Нет, там один балласт))
источник

ВВ

Вячеслав Васютин... in Ассемблер
Вроде показыны примеры инструкций, но не примеры программ, использующие инструкции. Такое ощущение будто книгу по ассемблеру хотели просто сделать бестселлером, но не научить чему-нибудь.
источник

E

Entusiast in Ассемблер
Так и должно быть
источник

ВВ

Вячеслав Васютин... in Ассемблер
Так... Push нужен, чтобы ложить адресса на верхушку стэка, а и процессор извлекает из этих адрессов инструкции... А pop что делает? Ну вытянул он из стэка адресс, и куда он его девает? Зачем адресс инногда нужно убрать из стэка?
источник

E

Entusiast in Ассемблер
В регистр, который ты указал
источник

E

Entusiast in Ассемблер
И процессор ничего не  извлекает. Как раз извлекаются с помощью pop
Да и извлекаешь это ты
источник

E

Entusiast in Ассемблер
EAX = 0
push 1
pop eax
EAX = 1
источник

ВВ

Вячеслав Васютин... in Ассемблер
Зачем тогда в стэк что-нибудь ложить, если процессору нет до него дела, как я понял по твоим словам?
источник

ВВ

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

E

Entusiast in Ассемблер
Так это для тебя сделано, что хочешь, то и ложи туда.
В основном, используется для передачи аргументов в функцию
источник

E

Entusiast in Ассемблер
push 1
push 2
push 3
call func


func:
pop eax
pop ebx
pop ecx

EAX = 3
EBX = 2
ECX = 1

Но чаще всего делают так:
mov eax, dword[esp+4]
EAX = 3

Потому что push кладёт значение в стэк, а потом отнимает от ESP, 4. Тем самым, если прибавим к ESP+4, то получим значение, которое положилось в стэк. ESP+8 даст второе значение, ESP+12, и т.д

Для x86_64 используется +8
источник

ВВ

Вячеслав Васютин... in Ассемблер
Т.е.
printf("Hi %s.", &name);
printf сама функция, а аргументы Hi %s.", &name кидаются в стэк?
источник

E

Entusiast in Ассемблер
Для x86 - да
Для x86_64 - кладутся в регистры
Соглашение о вызове
источник

ВВ

Вячеслав Васютин... in Ассемблер
А в стэке ничего? Хм.. Как все подзапуталось. То ложатся аргументы в стэк, то не ложатся🤷
источник

E

Entusiast in Ассемблер
Если аргументы не помещаются в регистры, то в стэк остальное
источник

ВВ

Вячеслав Васютин... in Ассемблер
Теперь понятно. Пойду читать дальше. Всем спасибо.
источник

ВВ

Вячеслав Васютин... in Ассемблер
Попробовал что-то с push написать:

push $-Text ; for while rdx = 0
push Text; for while rsi = 0
push 1 ; for while rdi = 0
push 1 ; for while rax = 0
syscall


Что у меня может быть не так?
источник

E

Entusiast in Ассемблер
Для сисколлов в регистры нужно класть...
источник