|
|
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
Пытаюсь освоить заполнение параметров стека при вызове функции, логика не ясна Нашёл информацию, что стек должен быть выравнен на 16 байт, но этого мало Вот простой пример: Код: pascal 1. 2. 3. 4. Код: sql 1. 2. 3. Не понимаю, почему смещение $28, а не 8 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 12:33:25 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 12:46:07 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
s62, Это понятно Я поэтому и написал rcx, rdx, r8, r9 И про выравнивание на 16 байт понятно Ты мне покажи, где про [rsp+$28] написано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 13:24:09 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, А покажи код (дизасм) перед вызовом функции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 14:25:26 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Ну и вот ещё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 14:27:40 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUТы мне покажи, где про [rsp+$28] написано https://docs.microsoft.com/ru-ru/cpp/build/stack-allocation ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 14:39:42 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
alekcvp https://docs.microsoft.com/ru-ru/cpp/build/stack-allocation Надо же, как забавно - текст статьи на английском, а текст на картинке на русском. авторНе понимаю, почему смещение $28, а не 8 потому что в начале пролога функции есть инструкция Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 14:54:47 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
schi, Я так понял что там под первые 4 параметра резервируется место зачем-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 15:12:54 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 15:19:09 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
schi, Т.е. перед вызовом функции там сохраняются значения этих регистров, потому что дальше они затираются параметрами? А после выхода, соответственно, восстаанавливаются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 15:28:34 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
alekcvp, Всё, допёр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 15:32:53 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 15:45:14 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 16:06:24 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
alekcvpschi, Я так понял, что параметры передаются в RCX, RDX, R8, R9, но для них сразу выделяется место на стеке, типа удобно что если тебе нужен, например, 6й параметр функции, то он всегда будет 6м на стеке. Возможно. В 32-х битном коде найти параметр не всегда просто, особенно в Delphi, где они задом наперед передаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 16:25:35 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 16:59:29 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
Кар-Кар Код: pascal 1. 2. 3. 4. 5. 6. 7. mov [rsp+$10],7 <-- тут же уже не нолик будет, не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:08:29 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
alekcvpКар-Кар Код: pascal 1. 2. 3. 4. 5. 6. 7. mov [rsp+$10],7 <-- тут же уже не нолик будет, не? Нолик на конце rsp делается самой первой инструкцией sub rsp,$08. sub rsp,$100 не меняет этого. sub rsp,$101 $102 $103 $104 и.т.п - меняет. А mov [rsp+$10],7 это уже запись в память. Главное, что само значение RSP с ноликом в конце. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:17:41 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
Кар-КарНолик на конце 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 - восьмёрка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:35:39 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
alekcvpт.е. перед sub rsp,$20 у нас на конце rsp - восьмёркаКАК? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:46:18 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
Нет. rsp на тех строках не меняется. Под дебаггером уже даже проверил) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:48:13 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
white_niggeralekcvpт.е. перед sub rsp,$20 у нас на конце rsp - восьмёркаКАК? Туплю. Почему-то mov [rsp..] как push прочитал :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 17:51:47 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
В общем вызывающая функция выделяет стек под параметры, минимум 32 байта Всем спасибо ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 18:11:21 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUПытаюсь освоить заполнение параметров стека при вызове функции, логика не ясна Нашёл информацию, что стек должен быть выравнен на 16 байт, но этого мало Вот простой пример: Код: pascal 1. 2. 3. 4. Код: sql 1. 2. 3. Не понимаю, почему смещение $28, а не 8 переменные ложатся в обратном порядке: 28h размер под переменные, 8h на адрес возврата (не забываем что первые 4 ложатся в регистры), выходит 30h весь блок (кратно 10h как и положено). Address в самом верху, соответственно получается [rsp+$28] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 19:18:40 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, не совсем правда помню только размер блока переменных или с местом под адрес должно быть кратно 16. Более вероятно что без места под адрес, т.к. адрес возврата и сохранение rsp как раз дадут тоже 16 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 19:32:38 |
|
||
|
Немного о параметрах в стеке на x64
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, не совсем правда помню только размер блока переменных или с местом под адрес должно быть кратно 16. Более вероятно что без места под адрес, т.к. адрес возврата и сохранение rsp rbp как раз дадут тоже 16 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2017, 19:35:05 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=135&tid=2041934]: |
0ms |
get settings: |
5ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
277ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 582ms |

| 0 / 0 |
