汇编push,pop

版权声明:本文为博主原创文章,转载请附上原文出处连接和本声明。2019-08-24,00:40:12
做者By-----溺心与沉浮----博客园spa

一、BASE,TOP是2个32位的通用寄存器,里面存储的是内存单元编号(内存地址).3d

二、BASE里面存储了一个地址,记录的起始地址.blog

三、TOP里面也存储了一个地址,记录的是结束的地址.内存

四、存入数据的时候,TOP的值减4(为方便演示,每次存取都是4个字节)博客

五、释放数据的时候,TOP的值加4(为方便演示,每次存取都是4个字节)方法

六、若是要读取中间的某个数据的时候能够经过TOP 或者 BASE 加上偏移的方式去读取im

七、这种内存的读写方式有个学名:堆栈d3

堆栈的优势:临时存储大量的数据,便于查找.数据

 

 

 在OD中红框位置,随机选取一个内存地址做为咱们的栈底与栈顶,我已0x18FFD0为例,用EDX,EBX仿ESP,EBPimg

  MOV EDX,0x18FFD0  TOP

  MOV EBX,0x18FFD0  BASE

一、压入数据

  压入数据的方法不少

方式1、

  MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA

     SUB EDX,4

 

 

版权声明:本文为博主原创文章,转载请附上原文出处连接和本声明。2019-08-24,00:40:12
做者By-----溺心与沉浮----博客园 

 

 代码执行后:

 

 后面的就不上图了

 方式二、

  SUB EDX,4

     MOV DWORD PTR DS:[EDX],0xBBBBBBBB

 方式三、

  LEA EDX,DWORD PTR DS:[EDX-4]

  MOV DWORD PTR DS:[EDX],0xCCCCCCCC

方式四、

  MOV DWORD PTR DS:[EDX-4],0xDDDDDDDD

  LEA EDX,DWORD PTR DS:[EDX-4]

 

步骤二、读取第N个数

 方式一、经过BASE加偏移的形式来读取,读出来的值放到ESI中

读第一个压入的数据

  MOV ESI,DWORD PTR DS:[EBX-4]

读第四个压入的数据

  MOV ESI,DWORD PTR DS:[EBX-10]  

 方式二、经过TOP加偏移的形式来读取,读出来的值放到ESI中

读第一个压入的数据

  MOV ESI,DWORD PTR DS:[EDX+10]

读第四个压入的数据

  MOV ESI,DWORD PTR DS:[EDX+4]

 

 步骤三、弹出数据

方法一、

   MOV ECX,DWORD PTR DS:[EDX]

  ADD EDX,0x4

方法二、

  LED EDX,DWORD PTR DS:[EDX+0x4]

  MOV ECX,DWORD PTR DS:[EDX-0x4]

方法三、

  MOV ECX,DWORD PTR DS:[EDX]

  LEA EDX,DWORD PTR DS:[EDX+0x4]

 

 push指令:

     一、PUSH r32

  二、PUSH r16

  三、PUSH m16

  四、PUSH m32

  五、PUSH imm8/imm16/imm32

pop指令:

  一、POP r32

  二、POP r16

  三、POP m16

  四、POP m32

 一、使用2种方式实现:push ecx

1、

  MOV DWORD PTR DS:[ESP-0x4],0x1

  LEA ESP,DWORD PTR DS:[ESP-0x4]

2、

  LEA ESP,DWORD PTR DS:[ESP-0x4]

  MOV DWORD PTR DS:[ESP],0x1

3、

  MOV DWORD PTR DS:[ESP-0x4],0x1

  SUB ESP,0x4

4、

  SUB ESP,0x4

  MOV DWORD PTR DS:[ESP],0x1

 二、使用2种方式实现:pop ecx

1、

  ADD ESP,0x4

  MOV EAX,DWORD PTR DS:[ESP-0x4]

2、

  MOV EAX,DWORD PTR DS:[ESP]

  ADD ESP,0x4

3、

  MOV EAX,DWORD PTR DS:[ESP]

  LEA ESP,DWORD PTR DS:[ESP+0x4]

4、

  LEA ESP,DWORD PTR DS:[ESP+0x4]

  MOV EAX,DWORD PTR DS:[ESP-0x4]

 三、使用2种方式实现:push esp

1、

  MOV EAX,ESP

  MOV DWORD PTR DS:[ESP-4],EAX

  SUB ESP,4

2、

  MOV DWORD PTR DS:[ESP-4],ESP

  SUB ESP,4

 四、使用2种方式实现:pop esp

1、

   MOV EAX,DWORD PTR DS:[ESP]

   MOV ESP,EAX

2、

  MOV ESP,DWORD PTR DS:[ESP]

3、

  ADD ESP,4

  MOV ESP,DWORD PTR DS:[ESP-4]

 

 push必定是减去4个字节吗?

答:不是,push能够对一个字的寄存器或者内存进行push,此时是2字节,对双字的寄存器或者内存进行push的时候,是4字节,

注意:push不能push一个字节的寄存器或者内存,pop同push