gpt4 book ai didi

程序集调用堆栈 - 术语问题

转载 作者:行者123 更新时间:2023-12-02 09:12:10 25 4
gpt4 key购买 nike

我对 Assembly 完全陌生,希望确认以下陈述中哪些地方存在误解并需要纠正。

堆栈指针 (ESP) 指向堆栈顶部(最低内存地址)。

基指针(EBP)用于在构建堆栈帧时临时存储各种内存地址。它通常保存当前堆栈帧的最高内存地址。

指令指针(EIP)指的是内存的文本(代码)段中一行代码的内存地址

一旦某些内容被插入堆栈,就无法就地更改。 IE。如果我们PUSH EBP到堆栈,我们推送的是EBP的当前值,而不是某种指向它的引用或指针。我们无法就地更改该值。

传递到函数中的参数通常会移动到地址空间中,该地址空间是堆栈指针的偏移量。 IE。 [ESP-12]

当调用函数时(使用CALL),会发生以下情况:

  1. 返回地址被添加到堆栈中(紧跟当前EIP的内存地址,以便我们知道被调用函数完成后返回到哪里
  2. 保存的帧指针被添加到堆栈中,通常是调用函数的堆栈帧的堆栈指针
  3. 然后我们将进入被调用函数的序言

谢谢。我正在尝试解决这些问题。

最佳答案

Arguments being passed into a function are generally moved into an address space which is an offset of the stack pointer. ie. [ESP-12].

通常在调用之前将参数压入堆栈。

push paramA  ; ( some 32bit value, register, whatever )
push paramB
call myFunct

这会导致以下堆栈内容:

---------------
| paramA |
---------------
| paramB |
---------------
| return addr | <-- ESP
---------------

由于返回地址(由 call 推送)为 4 个字节,因此该函数的参数位于 [ESP+4][ESP+ 8].

如果你的函数添加了一个堆栈帧,通常你会这样做

myFunct:  push EBP
mov EBP, ESP

现在堆栈看起来像这样:

---------------
| paramA |
---------------
| paramB |
---------------
| return addr |
---------------
| saved EBP | <-- EBP, ESP
---------------

并且参数位于 [EBP+8][EBP+12],即使您推送更多值(或为局部变量添加一些位置),因为EBP 不再改变:

myFunct:  push EBP
mov EBP, ESP
sub ESP, 12 ; make room for 3 32bit local variables

mov eax, [EBP+8] ; access one of the parameters
mov [EBP-4], eax ; save it in local variable #1

rel | rel |
to | to |
ESP | EBP |
----|------|--------------
+24 | +12 | paramA |
| |--------------
+20 | +8 | paramB |
| |--------------
+16 | +4 | return addr |
| |--------------
+12 | | saved EBP | <-- EBP (is fixed here for now)
| |---------------
+8 | -4 | local#1 |
| |---------------
+4 | -8 | local#2 |
| | ---------------
0 | -12 | local#3 | <--- ESP (keeps growing, by pushing, calling etc)
---------------

局部变量位于[EBP-4][EBP-8][EBP-12]等。
返回地址位于[EBP+4]

注意:如您所见,这是可能的

  • 通过ESP访问(那么你不需要需要帧指针,但是你需要跟踪你推送了多少数据,以“查找”参数和变量)
  • 或者通过EBP(这会增加一些开销)。在许多函数中,根本不需要帧指针,编译器会对其进行优化。

关于程序集调用堆栈 - 术语问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47307950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com