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

  • 相关阅读:
    ORA-02020 : 过多的数据库链接在使用中-Windows环境解决步骤
    <转载>c++中new一个二维数组
    C C++输出格式 <转载>仅用于个人
    *p 和p[i] 区别
    Const *ptr ptr
    C 格式化的输入输出(printf scanf)
    PP 各种快捷键
    【Java并发工具类】原子类
    【Java并发工具类】Java并发容器
    【Java并发工具类】CountDownLatch和CyclicBarrier
  • 原文地址:https://www.cnblogs.com/Reverse-xiaoyu/p/11403324.html
Copyright © 2020-2023  润新知