匯編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-----溺心與沉浮----博客園


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM