學習筆記分享之彙編---3. 堆棧&標誌寄存器
摘要:進位標誌寄存器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)
-
進位標誌寄存器CF(Carry Flag) (針對無符號數) :
進位標誌CF用於反映無符號數加減運算中最高位是否有進位。
-
有:1
-
無:0
e.g.
MOV AL,0xEF
ADD AL,2
MOV AL,0xFE
ADD AL,2
-
-
溢出標誌寄存器OF(Overflow Flag) (針對有符號數) :
溢出標誌OF用於反映有符號數加減運算所得結果是否溢出。
(如果運算結果超過當前運算位數所能表示的範圍,則稱爲溢出)
- 溢出:1
- 未溢出:0
O位計算過程: 符號位有進位:1;無進位:0 最高有效數值位向符號位有進位:1;無進位:0 對 符號位有無進位 和 最高有效位有無進位 進行異或:所得值即爲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
-
符號標誌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
-
輔助進位標誌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
-
奇偶標誌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位(十六進制的後兩位))(不管是多少位寄存器)
-
零標誌ZF(Zero Flag):
零標誌ZF用來反映運算結果是否爲0。
- 爲0:1
- 不爲0
e.g.XOR EAX,EAX //功能爲清零
注意:
MOV EAX,0和XOR EAX,EAX雖然結果一樣,但是意義不一樣,因爲MOV不是運算符,而XOR是,因此若用MOV,EFLAGS寄存器就不會有變化
-
方向標誌DF(Direction Flag):
方向標誌DF用來決定 ① 執行MOVS指令時[ESI]和[EDI]中存儲的地址 ② 執行STOS指令時的 加/減
- 爲0:加
- 爲1:減