zoukankan      html  css  js  c++  java
  • 汇编push,pop

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

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

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

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

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

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

    6、如果要读取中间的某个数据的时候可以通过TOP 或者 BASE 加上偏移的方式去读取

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

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

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

      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-----溺心与沉浮----博客园 

     代码执行后:

     后面的就不上图了

     方式2、

      SUB EDX,4

         MOV DWORD PTR DS:[EDX],0xBBBBBBBB

     方式3、

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

      MOV DWORD PTR DS:[EDX],0xCCCCCCCC

    方式4、

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

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

    步骤2、读取第N个数

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

    读第一个压入的数据

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

    读第四个压入的数据

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

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

    读第一个压入的数据

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

    读第四个压入的数据

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

     

     步骤3、弹出数据

    方法1、

       MOV ECX,DWORD PTR DS:[EDX]

      ADD EDX,0x4

    方法2、

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

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

    方法3、

      MOV ECX,DWORD PTR DS:[EDX]

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

     

     push指令:

         1、PUSH r32

      2、PUSH r16

      3、PUSH m16

      4、PUSH m32

      5、PUSH imm8/imm16/imm32

    pop指令:

      1、POP r32

      2、POP r16

      3、POP m16

      4、POP m32

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

    一、

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

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

    二、

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

      MOV DWORD PTR DS:[ESP],0x1

    三、

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

      SUB ESP,0x4

    四、

      SUB ESP,0x4

      MOV DWORD PTR DS:[ESP],0x1

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

    一、

      ADD ESP,0x4

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

    二、

      MOV EAX,DWORD PTR DS:[ESP]

      ADD ESP,0x4

    三、

      MOV EAX,DWORD PTR DS:[ESP]

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

    四、

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

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

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

    一、

      MOV EAX,ESP

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

      SUB ESP,4

    二、

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

      SUB ESP,4

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

    一、

       MOV EAX,DWORD PTR DS:[ESP]

       MOV ESP,EAX

    二、

      MOV ESP,DWORD PTR DS:[ESP]

    三、

      ADD ESP,4

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

     

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

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

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

     

     

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

  • 相关阅读:
    HDU 1022 Train Problem I
    HDU 1702 ACboy needs your help again!
    HDU 1294 Rooted Trees Problem
    HDU 1027 Ignatius and the Princess II
    HDU 3398 String
    HDU 1709 The Balance
    HDU 2152 Fruit
    HDU 1398 Square Coins
    HDU 3571 N-dimensional Sphere
    HDU 2451 Simple Addition Expression
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11403324.html
Copyright © 2011-2022 走看看