前言:
此文章收錄在本人的《學習筆記分享》分類中,此分類記錄本人的學習心得體會,現所有分享出來但願和你們共同交流學習成長。附上分類連接:
https://www.cnblogs.com/tibbors/category/1729804.htmlhtml
堆棧的操做分解:學習
前提操做: 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] //再彈出(下移前地址)數據(保存到其餘存儲空間)
堆棧的專用操做:操作系統
進位標誌寄存器CF(Carry Flag)(針對無符號數):3d
進位標誌CF用於反映無符號數加減運算中最高位是否有進位。code
有:1htm
無:0blog
e.g.get
MOV AL,0xEFit
ADD AL,2io
MOV AL,0xFE
ADD AL,2
溢出標誌寄存器OF(Overflow Flag)(針對有符號數):
溢出標誌OF用於反映有符號數加減運算所得結果是否溢出。
(若是運算結果超過當前運算位數所能表示的範圍,則稱爲溢出)
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 |
符號標誌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」的個數的奇偶性。
e.g.
MOV EAX,AEF
ADD EAX,2
從上圖能夠看出,雖然0x0B00(即0000 1011 0000 0000)有奇數個1,P位應該爲0
所以,對於P位寄存器,只看最低有效字節(低8位(十六進制的後兩位))(無論是多少位寄存器)
零標誌ZF(Zero Flag):
零標誌ZF用來反映運算結果是否爲0。
e.g.
XOR EAX,EAX //功能爲清零
注意:
MOV EAX,0和XOR EAX,EAX雖然結果同樣,可是意義不同,由於MOV不是運算符,而XOR是,所以若用MOV,EFLAGS寄存器就不會有變化
方向標誌DF(Direction Flag):
方向標誌DF用來決定 ① 執行MOVS指令時[ESI]和[EDI]中存儲的地址 ② 執行STOS指令時的 加/減