Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Немного о параметрах в стеке на x64 / 25 сообщений из 25, страница 1 из 1
16.08.2017, 12:33:25
    #39506247
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
Пытаюсь освоить заполнение параметров стека при вызове функции, логика не ясна
Нашёл информацию, что стек должен быть выравнен на 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
16.08.2017, 12:46:07
    #39506266
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
SOFT FOR YOU,

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

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

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

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

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


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

Код: pascal
1.
sub    rsp,000000020h
...
Рейтинг: 0 / 0
16.08.2017, 15:12:54
    #39506390
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
schi,
Я так понял что там под первые 4 параметра резервируется место зачем-то.
...
Рейтинг: 0 / 0
16.08.2017, 15:19:09
    #39506395
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
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
16.08.2017, 15:28:34
    #39506399
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
schi,
Т.е. перед вызовом функции там сохраняются значения этих регистров, потому что дальше они затираются параметрами? А после выхода, соответственно, восстаанавливаются?
...
Рейтинг: 0 / 0
16.08.2017, 15:32:53
    #39506402
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
alekcvp,
Всё, допёр.
...
Рейтинг: 0 / 0
16.08.2017, 15:45:14
    #39506413
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
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
16.08.2017, 16:06:24
    #39506419
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
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
16.08.2017, 16:25:35
    #39506434
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
alekcvpschi,
Я так понял, что параметры передаются в RCX, RDX, R8, R9, но для них сразу выделяется место на стеке, типа удобно что если тебе нужен, например, 6й параметр функции, то он всегда будет 6м на стеке.

Возможно. В 32-х битном коде найти параметр не всегда просто, особенно в Delphi, где они задом наперед передаются.
...
Рейтинг: 0 / 0
16.08.2017, 16:59:29
    #39506456
Кар-Кар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
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
16.08.2017, 17:08:29
    #39506461
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
Кар-Кар
Код: 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
16.08.2017, 17:17:41
    #39506467
Кар-Кар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
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
16.08.2017, 17:35:39
    #39506477
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
Кар-КарНолик на конце 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
16.08.2017, 17:46:18
    #39506491
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
alekcvpт.е. перед sub rsp,$20 у нас на конце rsp - восьмёркаКАК?
...
Рейтинг: 0 / 0
16.08.2017, 17:48:13
    #39506497
Кар-Кар
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
Нет. rsp на тех строках не меняется. Под дебаггером уже даже проверил)
...
Рейтинг: 0 / 0
16.08.2017, 17:51:47
    #39506500
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
white_niggeralekcvpт.е. перед sub rsp,$20 у нас на конце rsp - восьмёркаКАК?
Туплю. Почему-то mov [rsp..] как push прочитал :)
...
Рейтинг: 0 / 0
16.08.2017, 18:11:21
    #39506518
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
В общем вызывающая функция выделяет стек под параметры, минимум 32 байта
Всем спасибо )
...
Рейтинг: 0 / 0
16.08.2017, 19:18:40
    #39506548
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
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
16.08.2017, 19:32:38
    #39506556
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Немного о параметрах в стеке на x64
SOFT FOR YOU,

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

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


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