汇编指令002-PUSH和POP

PUSH指令,将数据存入栈中,POP指令,出栈,将数据取出

在OD中,ESP寄存器表示当前栈顶位置地址

有三种方式

PUSH

1.PUSH 16进制数据

将一个16进制数据存入栈中,如图

push 0x1。OD中不需要输入0,直接输入1会自动添加上0x1

执行后如图

2.PUSH 寄存器

push eax
如图,将eax数据入栈

执行结果如图

3.PUSH 内存单元

push [地址]

首先,选择一个数据右键,选择在数据窗口中跟随

在008F312F这个地址,对应的文件数据为下图红色的文字

 

如果我们输入push [008F312F]
OD会自动填写命令为

执行后数据如图

可以看到,HEX数据窗口的数据为FF 35 2F 31

栈数据为:31 2F 35 FF

是HEX的数据倒着写的,这是因为CPU存储方式的不同。

POP

同样的,PUSH对应的POP,是将栈顶的内容拿出来到寄存器,或者内存地址

1. POP 寄存器

pop eax

栈窗口执行前

执行后

可以看到栈顶的变化

栈顶的数据已经被放到了EAX寄存器。

OD不改变汇编代码执行PUSH和POP

在栈窗口右键选择即可

PUSHAD和POPOD

这两个相当于是备份和还原,使用PUSHAD,会把所有寄存器的数据给入栈,POPAD会把栈内数据依次还原到EIP->EAX

可以这样理解:

PUSHAD=push eax,push ecx,push ….eip

下图是执行PUSHAD之前的寄存器数据

下图为执行PUSHAD之后的栈窗口数据

可以看到,栈顶的数据也就是EIP的数据,和八个寄存器相对应。

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注