powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Немного о параметрах в стеке на x64
25 сообщений из 25, страница 1 из 1
Немного о параметрах в стеке на x64
    #39506247
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь освоить заполнение параметров стека при вызове функции, логика не ясна
Нашёл информацию, что стек должен быть выравнен на 16 байт, но этого мало

Вот простой пример:
Код: pascal
1.
2.
3.
4.
procedure Test(rcx, rdx, r8, r9: Integer; Address: Pointer);
begin
  PInteger(Address)^ := rcx;
end;



Код: sql
1.
2.
3.
mov rax, [rsp+$28]
mov [rax], ecx
ret



Не понимаю, почему смещение $28, а не 8
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506266
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

вот из первых рук: https://msdn.microsoft.com/en-us/library/ms235286.aspx
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506305
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62,

Это понятно
Я поэтому и написал rcx, rdx, r8, r9
И про выравнивание на 16 байт понятно
Ты мне покажи, где про [rsp+$28] написано
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506347
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

А покажи код (дизасм) перед вызовом функции?
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506350
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506369
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТы мне покажи, где про [rsp+$28] написано
https://docs.microsoft.com/ru-ru/cpp/build/stack-allocation
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506377
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp https://docs.microsoft.com/ru-ru/cpp/build/stack-allocation

Надо же, как забавно - текст статьи на английском, а текст на картинке на русском.

авторНе понимаю, почему смещение $28, а не 8


потому что в начале пролога функции есть инструкция

Код: pascal
1.
sub    rsp,000000020h
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506390
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,
Я так понял что там под первые 4 параметра резервируется место зачем-то.
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506395
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpschi,
Я так понял что там под первые 4 параметра резервируется место зачем-то.

место там резервируется под volatile registers, чтобы их можно было спокойно туда помещать.

"In the Microsoft x64 calling convention, it is the caller's responsibility to allocate 32 bytes of "shadow space" on the stack right before calling the function (regardless of the actual number of parameters used), and to pop the stack after the call. The shadow space is used to spill RCX, RDX, R8, and R9, but must be made available to all functions, even those with fewer than four parameters."
https://en.wikipedia.org/wiki/X86_calling_conventions#Microsoft_x64_calling_convention
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506399
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,
Т.е. перед вызовом функции там сохраняются значения этих регистров, потому что дальше они затираются параметрами? А после выхода, соответственно, восстаанавливаются?
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506402
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,
Всё, допёр.
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506413
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpalekcvp,
Всё, допёр.

Что-то они странное пишут о цели такого выделения памяти:

"The caller is responsible for allocating space for parameters to the callee, and must always allocate sufficient space for the 4 register parameters, even if the callee doesn’t have that many parameters. This aids in the simplicity of supporting C unprototyped functions, and vararg C/C++ functions"
https://msdn.microsoft.com/ru-ru/library/windows/apps/xaml/ms235286(v=vs.80).aspx

В Delphi X64, кстати, эту память на стеке выделяет не caller, а callee.
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506419
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi,
Я так понял, что параметры передаются в RCX, RDX, R8, R9, но для них сразу выделяется место на стеке, типа удобно что если тебе нужен, например, 6й параметр функции, то он всегда будет 6м на стеке. Ну и как написано, функция имеет право использовать эти 32 байта на своё усмотрение.
https://msdn.microsoft.com/en-us/library/ew5tede7(v=VS.90).aspx The parameter area is always at the bottom of the stack (even if alloca is used), so that it will always be adjacent to the return address during any function call. It contains at least four entries, but always enough space to hold all the parameters needed by any function that may be called. Note that space is always allocated for the register parameters, even if the parameters themselves are never homed to the stack ; a callee is guaranteed that space has been allocated for all its parameters. Home addresses are required for the register arguments so a contiguous area is available in case the called function needs to take the address of the argument list (va_list) or an individual argument.
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506434
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpschi,
Я так понял, что параметры передаются в RCX, RDX, R8, R9, но для них сразу выделяется место на стеке, типа удобно что если тебе нужен, например, 6й параметр функции, то он всегда будет 6м на стеке.

Возможно. В 32-х битном коде найти параметр не всегда просто, особенно в Delphi, где они задом наперед передаются.
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506456
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcx(xmm0) rdx(xmm1) r8(xmm2) r9(xmm3).

Давайти как для детей.
1. На конце RSP перед вызовом инструкций call должно быть 0. Например, $00000000012AB 0 .
2. Вызывающий обязан создать $20 "на всякий пожарный" в стеке для вызываемой ленивой жопы (привет AMD64). Делаем sub rsp,$20.
3. mov rax,[rsp+$28] = адресс возврата($08) + ленивая жопа($20) = доступ к первому параметру, которые через стек уже были посланы.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure MyProc;
asm
//нас вызвали, но мы тоже вызовем кого-то поэтому нужно выравнить. (Нолик на конце!)
sub  rsp,$8  
//первые четыре параметра
mov rdx, 1
mov rdx, 2
mov r8,3
mov r9,4
//нужно ещё три, уже через стек, выравнивание обязательно (Нолик на конце!)
sub rsp,$100 //<- да сколько угодно можно
mov [rsp+$00],5
mov [rsp+$08],6
mov [rsp+$10],7
//обязанность вызывающего
sub rsp,$20
//вызов
call  Foo
add rsp,$20
add rsp,$100
add rsp,$8
end;
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506461
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кар-Кар
Код: pascal
1.
2.
3.
4.
5.
6.
7.
....
//нужно ещё три, уже через стек, выравнивание обязательно (Нолик на конце!)
sub rsp,$100 //<- да сколько угодно можно
mov [rsp+$00],5
mov [rsp+$08],6
mov [rsp+$10],7
....



mov [rsp+$10],7 <-- тут же уже не нолик будет, не?
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506467
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpКар-Кар
Код: pascal
1.
2.
3.
4.
5.
6.
7.
....
//нужно ещё три, уже через стек, выравнивание обязательно (Нолик на конце!)
sub rsp,$100 //<- да сколько угодно можно
mov [rsp+$00],5
mov [rsp+$08],6
mov [rsp+$10],7
....



mov [rsp+$10],7 <-- тут же уже не нолик будет, не?
Нолик на конце rsp делается самой первой инструкцией sub rsp,$08.
sub rsp,$100 не меняет этого. sub rsp,$101 $102 $103 $104 и.т.п - меняет.

А mov [rsp+$10],7 это уже запись в память. Главное, что само значение RSP с ноликом в конце.
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506477
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кар-КарНолик на конце rsp делается самой первой инструкцией sub rsp,$08.
sub rsp,$100 не меняет этого. sub rsp,$101 $102 $103 $104 и.т.п - меняет.

А mov [rsp+$10],7 это уже запись в память. Главное, что само значение RSP с ноликом в конце.

sub rsp,$08 -> нолик
sub rsp,$100 -> нолик
mov [rsp+$00],5 -> восьмёрка
mov [rsp+$08],6 -> нолик
mov [rsp+$10],7 -> восьмёрка

т.е. перед sub rsp,$20 у нас на конце rsp - восьмёрка.
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506491
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpт.е. перед sub rsp,$20 у нас на конце rsp - восьмёркаКАК?
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506497
Кар-Кар
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. rsp на тех строках не меняется. Под дебаггером уже даже проверил)
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506500
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggeralekcvpт.е. перед sub rsp,$20 у нас на конце rsp - восьмёркаКАК?
Туплю. Почему-то mov [rsp..] как push прочитал :)
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506518
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем вызывающая функция выделяет стек под параметры, минимум 32 байта
Всем спасибо )
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506548
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUПытаюсь освоить заполнение параметров стека при вызове функции, логика не ясна
Нашёл информацию, что стек должен быть выравнен на 16 байт, но этого мало

Вот простой пример:
Код: pascal
1.
2.
3.
4.
procedure Test(rcx, rdx, r8, r9: Integer; Address: Pointer);
begin
  PInteger(Address)^ := rcx;
end;



Код: sql
1.
2.
3.
mov rax, [rsp+$28]
mov [rax], ecx
ret



Не понимаю, почему смещение $28, а не 8
переменные ложатся в обратном порядке: 28h размер под переменные, 8h на адрес возврата (не забываем что первые 4 ложатся в регистры), выходит 30h весь блок (кратно 10h как и положено). Address в самом верху, соответственно получается [rsp+$28]
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506556
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

не совсем правда помню только размер блока переменных или с местом под адрес должно быть кратно 16. Более вероятно что без места под адрес, т.к. адрес возврата и сохранение rsp как раз дадут тоже 16
...
Рейтинг: 0 / 0
Немного о параметрах в стеке на x64
    #39506560
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

не совсем правда помню только размер блока переменных или с местом под адрес должно быть кратно 16. Более вероятно что без места под адрес, т.к. адрес возврата и сохранение rsp rbp как раз дадут тоже 16
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Немного о параметрах в стеке на x64
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]