堆栈指针ESP是指向栈顶还是指向下一个可用的空位??

bigplume 2012-12-25 10:30:11
我用OD调试程序发现ESP指向的是栈顶,但是看一篇在PC上写操作系统的文章发现里面的函数参数入栈后,最后一个入栈的参数要调用也要用ESP+4感觉在那里面ESP指向的是下一个可用的空位,到底是怎样理解呢
...全文
931 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
TouchProjects 2013-08-27
  • 打赏
  • 举报
回复
        MOV		AX, 0xff
		PUSH	   AX
		MOV		AX, 0xf0
		PUSH	   AX
		MOV		SI, SP
		MOV		AX, 0xff
		SUB		AX, [SI+2]
		JZ	     error
		JMP        hello
楼主可以试一下这段代码,保护模式下写的,因此SI+2而不是SI+4。运行结果会JMP error,说明SP指向的是栈顶(下一个将要出栈的数据的地址)。猜测函数中的[ESP+4]是参数,而[ESP]是这个函数的返回地址,所以经常用到+4却不是ESP。因为是32位模式,ESP-4才是下一个可用的空位。 另外
PUSH EAX  =  SUB ESP, 4
             MOV [ESP], EAX

POP  EAX  =  MOV EAX, [ESP]
             ADD ESP, 4
chelp 2013-03-15
  • 打赏
  • 举报
回复
裁判1:esp一直都是指向栈顶的。存取栈中数据都是用ebp的。 裁判2:楼主要反思了,认真思考下,EAX=EDX 这无法验证你的说法
  • 打赏
  • 举报
回复
引用 7 楼 bigplume 的回复:
引用 6 楼 Silent_hi 的回复:引用 5 楼 Silent_hi 的回复:引用 2 楼 bigplume 的回复:引用 1 楼 Silent_hi 的回复:esp一直都是指向栈顶的。存取堆栈数据都是用 pop edx …… 引用 5 楼 Silent_hi 的回复:引用 2 楼 bigplume 的回复:引用 1 楼 Silent_hi 的回复:esp……
我无语了。我能说出你不适合学汇编这句话吗?
bigplume 2012-12-26
  • 打赏
  • 举报
回复
引用 6 楼 Silent_hi 的回复:
引用 5 楼 Silent_hi 的回复:引用 2 楼 bigplume 的回复:引用 1 楼 Silent_hi 的回复:esp一直都是指向栈顶的。存取堆栈数据都是用 pop edx …… 引用 5 楼 Silent_hi 的回复:引用 2 楼 bigplume 的回复:引用 1 楼 Silent_hi 的回复:esp一直都是指向栈顶的。存取堆栈数据都是用eb……
你根本没看懂这段代码 mov eax,esp 会把当前的ESP的值保存下来 这句你肯定没异议吧 push esp 这句把现在的esp入栈, 这涉及到一个操作 是先入栈再把ESP减4 还是先把ESP减4再入栈 如果先入栈再减4 说明现在ESP指的位置就是一个可以用的空位,入了站再减4 指向下一个可用的空位 先把ESP减4再入栈 那ESP指的就是栈顶 接着下来pop edx sub eax,edx EDX里面的值就是入栈时候的ESP的值,sub了以后是0 说明上面入栈的时候是先把ESP入栈再减4 说明ESP指向的就是下一个可用的空位 如果先把ESP减了4再把ESP的值入栈 那EDX的值肯定比eax里面存的原值要小4
  • 打赏
  • 举报
回复
引用 5 楼 Silent_hi 的回复:
引用 2 楼 bigplume 的回复:引用 1 楼 Silent_hi 的回复:esp一直都是指向栈顶的。存取堆栈数据都是用 pop edx ……
引用 5 楼 Silent_hi 的回复:
引用 2 楼 bigplume 的回复:引用 1 楼 Silent_hi 的回复:esp一直都是指向栈顶的。存取堆栈数据都是用ebp的。 不 我已经写代码证实了 push操作是先入栈 再将ESP-4,并且32位PC虚拟的8086模式也是这样的 只有真正的8086PC是先将SP-2再进行入栈操作 mov eax,esp push esp pop edx ……
上面是都会把栈顶的数据覆盖。
  • 打赏
  • 举报
回复
引用 2 楼 bigplume 的回复:
引用 1 楼 Silent_hi 的回复:esp一直都是指向栈顶的。存取堆栈数据都是用ebp的。 不 我已经写代码证实了 push操作是先入栈 再将ESP-4,并且32位PC虚拟的8086模式也是这样的 只有真正的8086PC是先将SP-2再进行入栈操作 mov eax,esp push esp pop edx sub eax,edx 这段代码在……
想想看,照你的理解,每次入栈都会被当前栈顶的数据都覆盖掉。
  • 打赏
  • 举报
回复
引用 2 楼 bigplume 的回复:
引用 1 楼 Silent_hi 的回复:esp一直都是指向栈顶的。存取堆栈数据都是用ebp的。 不 我已经写代码证实了 push操作是先入栈 再将ESP-4,并且32位PC虚拟的8086模式也是这样的 只有真正的8086PC是先将SP-2再进行入栈操作 mov eax,esp push esp pop edx sub eax,edx 这段代码在……
你问的问题又不是这个。而且不用看也知道你的理解是错的。再去看看堆栈是怎么回事吧。
bigplume 2012-12-26
  • 打赏
  • 举报
回复
说明ESP指向的是下一个可用的空位
bigplume 2012-12-26
  • 打赏
  • 举报
回复 1
引用 1 楼 Silent_hi 的回复:
esp一直都是指向栈顶的。存取堆栈数据都是用ebp的。
不 我已经写代码证实了 push操作是先入栈 再将ESP-4,并且32位PC虚拟的8086模式也是这样的 只有真正的8086PC是先将SP-2再进行入栈操作 mov eax,esp push esp pop edx sub eax,edx 这段代码在32位PC上执行结果eax是0 证明了以上观点
  • 打赏
  • 举报
回复
esp一直都是指向栈顶的。存取堆栈数据都是用ebp的。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧