摘要:進位標誌寄存器CF(Carry Flag) (針對無符號數) :。進位標誌CF用於反映無符號數加減運算中最高位是否有進位。

前言:

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

https://www.cnblogs.com/tibbors/category/1729804.html

學習內容:堆棧

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

堆棧的操作分解:

前提操作:
	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)

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

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

    • 有:1

    • 無:0

    e.g.

    MOV AL,0xEF

    ADD AL,2

    MOV AL,0xFE

    ADD AL,2

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

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

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

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

在有符號的運算中,有如下的規律:

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

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

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

    可根據右圖理解無符號數和有符號數不同情況:

    也可根據此圖找出以下四種情況:

    無符號、有符號都不溢出 無符號溢出、有符號不溢出
    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

    ADD EAX,2

    SUB EAX,2

    ADD AL,2

    SUB AL,2

    可以發現: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

    MOV AX,5EFE

    ADD AX,2

    MOV AL,4E

    ADD AL,2

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

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

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

    e.g.

    MOV EAX,AEF

    ADD EAX,2

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

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

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

    • 爲0:1
    • 不爲0
    e.g.

    XOR EAX,EAX //功能爲清零

    注意:

    MOV EAX,0和XOR EAX,EAX雖然結果一樣,但是意義不一樣,因爲MOV不是運算符,而XOR是,因此若用MOV,EFLAGS寄存器就不會有變化

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

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

    • 爲0:加
    • 爲1:減
相關文章