esp寄存器 linux,ebp, esp, eip相关寄存器简介

对于以下的反汇编代码

点击(此处)折叠或打开

1000:0 b8 00 00 mov ax,0 ax=0 ip指向1000:3

1000:3 e8 01 00 call s pop ip ip指向1000:7

1000:6 40 inc ax

1000:7 58 s:pop ax ax=6

在网络上已经有相关的回答来解释 ip寄存器。如下

首先,你要明确有关CS:IP 的一些问题:

1. CS:IP存储的是代码的地址,这个地址指向即将执行的代码。

2. 那么CS:IP在什么时候指向即将执行的代码呢?举例如下:mov ax,78H mov bx ,24H 当 mov ax,78H 指令被读取之前,

CS:IP 是指向它本省的,读取之后,IP 的值自动增加,增加多少呢?答曰:是指令mov ax,78H的长度,所以IP值自动增加后CS:IP

指向下一条指令即:mov bx,24H。IP值自动增加之后,才执行本条指令(mov ax,78H)。

3. 以你所说的例子进行分析:mov ax,0 call s inc ax s:pop ax 一共四条指令。执行完 mov ax,0

CS:IP=1000:3 读取指令 call s 后,CS:IP=1000:6也就是 指向 inc ax 指令的。

接下来,具体说说call s 指令的执行过程:上面说过,读取call s 指令后 CS:IP已经指向了 inc ax,可是我们现在不执行它,

我们要跳转去执行用“s”标记的 pop ax 指令!!!于是call命令就先把当前执行的状态,也就是CS:IP值先存起来,放进栈中,到用的

时候,再取出来(这里"取出来"可以理解为,恢复CS:IP的值,接着没有执行的往下继续执行!)。

那这存起来的CS:IP 是多少呢?答曰:1000:6(指向 inc ax )所以这里的call s 指令相当于 push ip jmp near ptr s

即:把IP的值入栈,再跳转去执行s标记的pop ax 指令。

最后 是pop ax 指令的执行,我们根据上面可以知道在此指令之前IP入栈,所以出栈的是IP,并且把这个IP保存在ax 中,IP=6,

所以ax=6。

补充:1.到底什么是子程序的偏移量?

偏移量=call 指令即将跳转至的子程序地址(子程序的第一个字节)减去 call 指令读取后 CS:IP指向的指令,在这里相当

于s子程序的地址减去指令 inc ax 的地址。

2.call 命令还有一种形式:call far ptr 标号

它相当于:push cs

push ip

jmp far ptr 标号

对于以上的说明,想赘述以下,因为 call和 jmp有 远跳和近跳的区分,对于 call的近跳,只需要push ip,然后jmp;对于 call的远跳,会首先 push cs, 然后 push ip,最后才是 jmp。所以上述解释中捆绑说明 cs,ip的压栈和出栈严格来说是会造成误解的,但是不影响其对于 ip的相关解释

对于ebp和 esp

push和pop命令,会自动来更改 esp寄存器。

push时候, esp自动减小;pop时候,esp自动增加。具体增减的数量,需要看后面的字节数

通常,在调用函数时候。在子程序中,

1. 首先会 将 ebp压栈。pushl %ebp

2. 然后将esp赋值给 ebp,也就是让 ebp指向 esp指向的内存位置。如此该内存位置就是这个子程序的 ebp。 movl %esp %ebp

3. 接着,会将 esp减少一定量。具体的数目也会根据该子程序会用到的栈大小来确定

如此以后,对于这个子程序,所使用的栈大小应该就是 %ebp - %esp的大小

--------------------------------------------参考资料-------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值