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

- 就是一块内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用。
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.

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

思考:
1.POP 次数大于PUSH 次数会有什么结果?
2.POP dword ptr ds:[dsp] 会有什么结果?
网友评论