ESP和EIP寄存器有什么区别?

7
以下是ESP和EIP寄存器的区别以及相关示例。请解释代码的作用。
ESP(堆栈指针)寄存器包含当前堆栈帧的地址,而EIP(扩展指令指针)寄存器包含将要执行的下一条指令的地址。
以下示例代码演示了如何使用这些寄存器:
``` push eax ; 将eax寄存器的值压入堆栈 mov eax, ebx ; 将ebx寄存器的值移动到eax寄存器中 pop ebx ; 从堆栈中弹出eax寄存器的值并将其存储在ebx寄存器中 ret ; 返回到调用函数的位置 ```
在这个例子中,push指令将eax寄存器的值压入堆栈中,然后mov指令将ebx寄存器的值移动到eax寄存器中。接下来,pop指令从堆栈中弹出eax寄存器的值并将其存储在ebx寄存器中。最后,ret指令返回到调用函数的位置。
通过使用ESP和EIP寄存器,程序可以正确地跟踪堆栈帧和下一条要执行的指令的地址。
main PROC 
    0000 0020 call MySub 
    0000 0025 mov eax, ebx 
        .
        .
    main ENDP

MySub PROC 
    0000 0040 mov eax, edx 
        .
        .
    ret 
MySub ENDP 

0000 0025是CALL指令后面的指令偏移量。

0000 0040是MySub内第一条指令的偏移量。

CALL指令将0000 0025推送到堆栈中,并将0000 0040加载到EIP寄存器中。

|-------------|              |----------|
| 0000 0025   |<--ESP        | 0000 0040| EIP
|-------------|              |----------|
|             |
|-------------|
|             |
|-------------|

RET指令将0000 0025从堆栈中弹出并存入EIP寄存器(RET执行前的堆栈展示)。
|-------------|              |----------|
| 0000 0025   |<--ESP        | 0000 0025| EIP
|-------------|              |----------|
|             |
|-------------|
|             |
|-------------|

我投票关闭此问题,因为SO不是提交作业的地方。 - Seki
9
我认为这个问题不适合在SO平台上发布,因为它和作业有关。有很多人会为了他们的作业甚至工作提交问题。您没有权利评判这件事。这样的行为会让SO成为一个糟糕的平台。 - Alexandre V.
2
@AlexandreVerri:如果你在做作业时遇到了什么问题,询问具体问题是没问题的。但是把整个作业复制/粘贴到SO问题里并直接寻求答案是不可取的(尤其是对于模糊的问题,“解释代码在做什么”)。我们不在同一个班级,所以我们不知道需要多少细节,或者已经可以假定什么。而没有展示任何工作也意味着我们不知道发帖者已经掌握了哪些知识。因此这个问题太宽泛了,无论是否为作业都可能会被关闭。 - Peter Cordes
1
@AlexandreVerri:你说得对,作业并不自动意味着它是一个糟糕的问题,但作业并不是一个免费通行证,可以问那些不符合SO质量标准和其他要求的问题。请参阅如何提出和回答作业问题? - Peter Cordes
1个回答

33

EIP是指令指针。它指向(保存)下一条将要执行的指令的第一个字节的地址。

ESP是栈指针。它指向(保存)栈上最近被推入的值的地址。

这些都是常见的架构寄存器。此代码只是演示函数调用/返回序列的工作方式。


1
你能解释一下指令指针是什么吗?我对那个寄存器非常困惑。谢谢。 - jackson blackson
10
代码和数据都存储在内存中。为了追踪当前正在执行的代码,CPU有一个寄存器来存储即将被执行的指令的内存地址,也就是EIP。 - Seva Alekseyev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接