栈-关于汇编中Ret指令执行后ESP的指向问题

问题描述

关于汇编中Ret指令执行后ESP的指向问题

附上源码
.386
.model flat,stdcall
.code
main proc USES ecx edx
push ebp
mov ebp,esp
mov eax,[ebp + 8]
pop ebp
ret 4

main endp
end main
以下是执行后的堆栈记录:
EBP ESP 指令 Remark
0018FA60 0018F814 程序执行前
0018FA60 0018F810 PUSH ECX

0018FA60 0018F80C PUSH EDX

0018FA60 0018F808 PUSH EBX

0018F808 0018F808 MOV
0018F808 0018F808 MOV
0018FA60 0018F80C POP EBP
0018FA60 0018F810 POP EDX
0018FA60 0018F814 POP ECX
0018FA60 0018F81C Ret 4

这里有个疑问Ret4执行后也就是ESP+4,地址应该是0018F818,为什么这里ESP指向了0018F81C,这不是ESP+8了么???
请帮忙理解下,感谢!

解决方案

代码不全,很难看出来

时间: 2024-12-02 19:46:17

栈-关于汇编中Ret指令执行后ESP的指向问题的相关文章

【汇编语言/底层开发】10、CALL和RET指令

CALL和RET指令常常用来实现子程序的设计.这两个指令同jmp.loop.jcxz等指令同属于转移指令. 1.ret和retf 转移指令的主要功能就是修改CS和IP或者只修改IP的内容.其中ret利用栈中的数据修改IP的内容,从而实现近转移:而retf则通过使用栈中的数据同时修改CS和IP的值,实现远转移. ret指令的作用相当于: pop IP retf指令的作用相当于: pop IP pop CS ret和retf指令同程序的栈息息相关.通常情况下可以使用默认的栈空间,另外还可以自己定义一

汇编中的除法div的疑问

问题描述 汇编中的除法div的疑问 我打算求 用汇编 286A1h / 2 值 写了下面一个程序 assume cs:codesg codesg segment mov dx,2 mov ax,86a1h mov bx,2 div bx codesg ends end 但是为什么好像没有被运行似的 (我知道用286A1h / 2 的值肯定超过16位,它的值肯定不能用ax来存,但我想知道这种情况下的商就求不了了吗) 解决方案 汇编中的除法指令汇编中div指令使用

Java千百问_03基本语法(009)_java中如何循环执行

java中如何循环执行 首先,我们看看循环是什么 1.循环是什么 当我们需要多次执行同样的代码段,通常被称为一个循环.伴随循环经常出现的关键字:break与contine分别如何使用 Java有非常灵活的三种循环机制:while 循环do...while 循环for 循环 2.什么是while循环 while循环可以按照特定的次数重复执行任务. 语法: [java] view plain copy   while(Boolean flag)   {   //代码段   }   在执行时,如果fl

汇编中 sp=0是栈顶还是栈低

问题描述 汇编中 sp=0是栈顶还是栈低 今天看汇编, 一个栈段最大可以设为多少?为什么? 分析: 这个问题显而易见,提出来只是为了提示我们将相关的知识融会起来.首先从栈操作指令所完成的功能的角度上来看,push.pop等指令在执行的时候只修改SP,所以栈顶的变化范围是0~FFFFH,从**栈空时候的SP=0**,一直压栈,直到**栈满时SP=0**:如果再次压栈,**栈顶将环绕**,覆盖了原来栈中的内容.所以一个栈段的容量最大为64 KB. 根据王爽的话 栈空时候的SP=0 栈满时SP=0,怎

说清汇编中的栈操作地址问题

文章其实很简单,在这里只是想给大家一个提醒.让大家回顾一下曾经的知识而已,大学的知识,现在你还记得么? 另外,善意提醒下博客园团队,虽然我理解商业重要性,但是我个人还是希望把培训学校的广告撤下博客园首页的广告行列中,我相信博客园是一个纯洁的技术博客,大家对博客园都非常信任,我们不希望让太多的初学者受到这个影响,个人意见而已. 我刚才做一个小软件的破解,一直被堆栈的操作弄得昏昏沉沉,在这里写一下也算是加深一下自己的印象,做个总结,也希望能够提醒到大家. 步入正题,说说汇编中的栈操作. 首先,我们先

方法-jdbc执行后的结果如何映射到java对象中?

问题描述 jdbc执行后的结果如何映射到java对象中? 难道是通过对象的set方法和resultSet的getString方法吗,请求官方正确回答 解决方案 是,不过你可以自己写反射,就想json转成对象一样,根据字段名和属性名的对应,去赋值 解决方案二: 为什么不用hibernate框架或者别框架呢.他不是很好封装实现了数据与对象的反射么...

调用动态链接库 构造其中类,成员变量vector,构造函数执行后刚构造的对象中成员变量全是乱码

问题描述 调用动态链接库 构造其中类,成员变量vector,构造函数执行后刚构造的对象中成员变量全是乱码 如题 VS2010 c++调用动态链接库 调试发现 构造动态链接库中类的时候,其中的成员变量vector 没问题,一旦构造函数执行后返回主程序,则刚构造的对象中成员变量全是乱码? 解决方案 类的成员对象变量何时构造 解决方案二: 不会,是不是你程序自身的问题? 解决方案三: 额,程序以前都调通了.这种情况以前出现过一次,我忘记了是怎么弄的了. 解决方案四: 代码那个地方有问题吧,仔细检查下

hql语句执行后返回了list<object>集合,如何添加新的数据到list集合中呢

问题描述 hql语句执行后返回了list<object>集合,如何添加新的数据到list集合中呢 如题,我执行了一个hql语句, StringBuffer hql1 = new StringBuffer("select information from Information information where 1=1 "); 我将返回的list放入如下的inlist中 inlist=courseService.CourseExtractInformation(user.g

android-Android中为何获取系统时间的方法多次执行后时间仍不变

问题描述 Android中为何获取系统时间的方法多次执行后时间仍不变 我自定义了一个view,每次这个view一触碰,就执行方法calendar.get(calendar.second);来获取当前系统秒数,可是每一次触碰后,在MotionEvent.action_down下,系统秒数都是第一次执行后得到的结果,这是为什么?此方法重新执行,不理性得到最新的秒数吗, 解决方案 我觉得问题是因为,你只初始化了一次Calender calender =Calender.getInstance(),而以