堆栈相关指令

指令 注释 使用
PUSH <1>向堆栈入压入数据
<2>修改栈顶指针ESP寄存器的值
PUSH r16/32
PUSH m16/32
PUSH imm8/16/32
POP <1>将栈顶数据存储到寄存器/内存
<2>修改栈顶指针寄存器的值
POP r16/32
POP m16/32

什么是堆栈?

操作系统在程序启动时所分配的内存
  1. 就是一块内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用。

2.和数据结构的堆栈无关。

3.查看堆栈。


查看堆栈
  • 查看堆栈操作步骤:

1、随便打开一个EXE程序到DTDebug工具中
2、找到FS位的内存地址 0x7ffdd000
3、dd 7ffdd000
4、即可看到0x0012D000~0x00130000内存地址,即堆栈内存
5、在内存框即可看到全部内存。

注:程序使用内存是从大地址到小地址顺序使用的。
注:内存溢出就会出错。比如:递归死循环等

PUSH 自定义实现思路:

向堆栈存入数据
修改ESP 指针

mov dword ptr ds:[0x0012ffb8],1
mov dword ptr ds:[0x0012ffb4],2
sub esp,8 //移动栈顶指针到目标位置
add esp,8 //恢复栈顶指针的位置

//1.堆栈存入数据 2.栈顶指针 - 4
push 3 
push eax
push dword ptr ds:[0x0012ffc4]
思考:

C语言程序中为什么局部变量需要赋初始值?
如果不赋初始值会出现什么情况?
局部变量初始化分配内存是 堆栈中随机分配的内存,如果是之前的局部变量数据,这样初始化的值就不一定是0.

PUSH

POP 自定义实现思路:

读出栈顶指针指向数据
修改ESP指针

//ecx 循环计数,临时需要执行一个循环体又不丢失ecx原有的值应该如何实现
push 1
push 2
push 3
push ecx
mov ecx,A
rep movsd
mov ecx,dword ptr ds:[dsp]
sub dsp,16
push ecx
mov ecx,A
rep movsd
pop ecx
POP
思考:

1.POP 次数大于PUSH 次数会有什么结果?
2.POP dword ptr ds:[dsp] 会有什么结果?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 5.汇编-堆栈相关指令 什么是堆栈 程序启动的时候操作系统会给每个程序一块虚拟的4G内存当程序需要使用的时候必须要...
    Asura_Luo阅读 3,720评论 0 1
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 9,406评论 0 5
  • 黑客常用命令大全 net user heibai lovechina /add 加一个heibai的用户密码...
    倒带默写阅读 17,246评论 0 24
  • 图文/刘 潮 我们其实并非赤条条的来到这个世界上,我们一出生就穿了一套非常先进的,和父母一样的太空服而来到这个地球...
    不在你以外阅读 1,697评论 0 1
  • 他有无力抵抗的慌张 在她面前 他低下头,遮住勃颈的刀伤 月光贩白 以白贩白 在这时光花甲的年代 他无法 遮住体内...
    阿垦先生阅读 1,576评论 0 1

友情链接更多精彩内容