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

前言:
  此文章收錄在本人的《學習筆記分享》分類中,此分類記錄本人的學習心得體會,現所有分享出來但願和你們共同交流學習成長。附上分類連接:
  https://www.cnblogs.com/tibbors/category/1729804.htmlhtml

學習內容:堆棧

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(出棧) = 操做三



學習內容:標誌寄存器(EFLAGS)

image-20200320085359270

  1. 進位標誌寄存器CF(Carry Flag)(針對無符號數):3d

    進位標誌CF用於反映無符號數加減運算中最高位是否有進位。code

    • 有:1htm

    • 無:0blog

    e.g.get

    MOV AL,0xEFit

    ADD AL,2io

    image-20200320104645403

    MOV AL,0xFE

    ADD AL,2

    image-20200320110440794

  2. 溢出標誌寄存器OF(Overflow Flag)(針對有符號數):

    溢出標誌OF用於反映有符號數加減運算所得結果是否溢出。

    (若是運算結果超過當前運算位數所能表示的範圍,則稱爲溢出)

    • 溢出:1
    • 未溢出:0
    O位計算過程:
    
    符號位有進位:1;無進位:0
    
    最高有效數值位向符號位有進位:1;無進位:0
    
    對 符號位有無進位 和 最高有效位有無進位 進行異或:所得值即爲OF位的值

補充(CF與OF):
在有符號的運算中,有以下的規律:

  • 正 + 正 = 正 若是結果是負數,則說明有溢出

  • 負 + 負 = 負 若是結果是正數,則說明有溢出

  • 正 + 負 永遠都不會有溢出

    可根據右圖理解無符號數和有符號數不一樣狀況: image-20200320113441839

    也可根據此圖找出如下四種狀況:

    無符號、有符號都不溢出 無符號溢出、有符號不溢出
    MOV AL,8 ADD AL,8 MOV AL,FF ADD AL,2
    無符號不溢出、有符號溢出 無符號、有符號都溢出
    MOV AL,7F ADD AL,2 MOV AL,FE ADD AL,80
  1. 符號標誌SF(Sign Flag):

    符號標誌SF用來反映運算結果的符號位,它與運算結果的最高位相同。

    e.g.

    細心觀察S位變化

    MOV EAX,0x0A7F

    image-20200320160438403

    ADD EAX,2

    3.2

    SUB EAX,2

    image-20200320160839680

    ADD AL,2

    image-20200320161022523

    SUB AL,2

    image-20200320161110448

    能夠發現:S位只看參與運算的寬度的符號位的值是1仍是0
    		一樣的結果,用EAX將32位所有參與運算時不論怎樣,S值都爲0,由於最高位爲0
    		而用AL只運算後八位時,S值被置爲1,由於此時參與運算部分的最高位爲1
  2. 輔助進位標誌AF(Auxiliary Carry Flag):

    在發生下列狀況時,輔助進位標誌AF的值被置爲1,不然被置爲0:

    (粗略理解:只要發生除最高位之外的進位或借位就會被置爲1)

    ①在字操做時,低字節向高字節進位或借位

    ②在字節操做時,低4位向高4位進位或借位

    e.g.

    MOV EAX,55EEFFFF

    ADD EAX,2

    image-20200320123424054

    MOV AX,5EFE

    ADD AX,2

    image-20200320123441392

    MOV AL,4E

    ADD AL,2

    image-20200320123453962

  3. 奇偶標誌PF(Parity Flag):

    奇偶標誌PF用於反映運算結果中「1」的個數的奇偶性。

    • 偶數個1:1
    • 奇數個1:0

    e.g.

    MOV EAX,AEF

    ADD EAX,2

    image-20200320154450541

    從上圖能夠看出,雖然0x0B00(即0000 1011 0000 0000)有奇數個1,P位應該爲0

    所以,對於P位寄存器,只看最低有效字節(低8位(十六進制的後兩位))(無論是多少位寄存器)
  4. 零標誌ZF(Zero Flag):

    零標誌ZF用來反映運算結果是否爲0。

    • 爲0:1
    • 不爲0

    e.g.
    XOR EAX,EAX     //功能爲清零
    xor
    注意:
     MOV EAX,0和XOR EAX,EAX雖然結果同樣,可是意義不同,由於MOV不是運算符,而XOR是,所以若用MOV,EFLAGS寄存器就不會有變化

  5. 方向標誌DF(Direction Flag):

    方向標誌DF用來決定 ① 執行MOVS指令時[ESI]和[EDI]中存儲的地址 ② 執行STOS指令時的 加/減

    • 爲0:加
    • 爲1:減
相關文章
相關標籤/搜索