【问题标题】:Stack Pointer in Assembly. ESP points always empty space or not?汇编中的堆栈指针。 ESP点总是空的空间与否?
【发布时间】:2019-05-31 09:48:31
【问题描述】:

最初,ESP指的是内存的空白空间。

当我push 1之类的东西时,它会引用1的内存位置,还是下一个空白空间?

这里是例子

push    ebp
mov ebp, esp
/*
---------
(empty space)    <- esp, ebp
---------
ebp     (initially stack pointer was here)
---------
*/

还有一个问题,当我做空栈空间时,ESP会指向哪个点?

示例如下:(每个内存位置为 4 个字节)

/*
  --------
1        <- initial esp
  --------
*/
sub esp, 12
; now esp points to this one 
/*
  --------
4          <- esp
  --------
3
  --------
2  
  --------
1        
  --------
*/
; or this one
/*
  --------
3           <- esp
  --------
2  
  --------
1        
  --------
*/

假设数字是内存位置地址

【问题讨论】:

    标签: assembly x86 stack-memory stack-pointer


    【解决方案1】:

    手册中的操作部分 (https://www.felixcloutier.com/x86/push) 显示 push 修改了 ESP 之前 存储到 [ESP]

                ESP ← ESP – 4;
                Memory[SS:ESP] ← SRC;
                    (* push dword *)
    

    pop 则相反:从[ESP] 加载,然后修改 ESP。

    与许多其他 ISA(例如 ARM)一样,x86 使用“完整”堆栈,其中堆栈指针通常指向最后推送的内容,而不是指向其下方的空白空间。


    有趣的事实:pop esp 覆盖 ESP之后递增,所以它就像 mov esp, [esp]
    push esp 读取要存储的值之前递减 ESP .英特尔的手动条目记录了这一点,但它们的伪代码不匹配。请参阅 What is an assembly-level representation of pushl/popl %esp? 了解适用于所有情况的正确推送/弹出伪代码,甚至是 push esppop esp


    re: part2: add esp, 12 将 ESP 移动 12 个字节,或 12B/4B = 3 个“堆栈槽”。 1+3 = 4。

    【讨论】:

    • 最后一个问题呢?子 esp, 12
    猜你喜欢
    • 1970-01-01
    • 2011-02-13
    • 2017-08-01
    • 2014-12-10
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 2014-04-15
    • 2011-07-18
    相关资源
    最近更新 更多