學習筆記分享之彙編—3. 堆棧&標誌寄存器

前言:
  此文章收錄在本人的《學習筆記分享》分類中,此分類記錄本人的學習心得體會,現全部分享出來希望和大家共同交流學習成長。附上分類鏈接:
  //www.cnblogs.com/tibbors/category/1729804.html

學習內容:堆棧

image-20200321212731984

  • 堆棧的優點:臨時存儲大量數據,便於查找
  • 堆棧中越往頂部地址編號越小
  • 壓棧出棧變的都是棧頂

堆棧的操作分解:

前提操作:
	MOV EBX,13FFDC	//BASE
	MOV EDX,13FFDC	//TOP


操作一:壓入數據
	法一:
	MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA		//先壓入數據
	SUB EDX,4								//再上移地址(寄存器)

	法二:
	SUB EDX,4								//先上移地址(寄存器)
	MOV DWORD PTR DS:[EDX],0xBBBBBBBB		//再壓入數據
	
	法三:
	MOV DWORD PTR DS:[EDX-4],0xDDDDDDDD		//先壓入數據
	LEA EDX,DWORD PTR DS:[EDX-4]			//再通過LEA指令上移地址(寄存器)
	
	法四:
	LEA EDX,DWORD PTR DS:[EDX-4]			//先通過LEA指令上移地址(寄存器)
	MOV DWORD PTR DS:[EDX],0xEEEEEEEE		//再壓入數據


操作二:讀取某個數據
	法一:
	//通過[BASE+偏移量]讀取
	MOV ESI,DWORD PTR DS:[EBX-4]

	法二:
	//通過[TOP+偏移量]讀取
	MOV EDI,DWORD PTR DS:[EDX+4]


操作三:彈出數據
	法一:
	MOV ECX,DWORD PTR DS:[EDX]				//先彈出數據(保存到其他存儲空間)
	LEA EDX,DWORD PTR DS:[EDX+4]			//再下移地址(寄存器)

	法二:
	MOV ESI,DWORD PTR DS:[EDX]				//先彈出數據(保存到其他存儲空間)
	ADD EDX,4								//再下移地址(寄存器)
	
	法三:
	LEA EDX,DWORD PTR DS:[EDX+4]			//先下移地址(寄存器)
	MOV EDI,DWORD PTR DS:[EDX-4]			//再彈出(下移前地址)數據(保存到其他存儲空間)

堆棧的專用操作:

  • 操作系統默認把ESP當棧底,EBP當棧頂
  • PUSH(壓棧) = 操作一
  • POP(出棧) = 操作三