EFLAGS寄存器(標誌寄存器)

這篇文章不是從0開始的,前面還有一些彙編基礎指令以及進制,我都沒寫,時間問題,仍是今天空閒,我纔想補一下博文,後面我陸續會把前面知識點漸漸補上。我不會重0基礎講起,中間會以、彙編、C、C++交叉的形式講解,實戰或者學習中才能更好的提高本身!編程

  EFLAGS寄存器                                                                                                                                                                                                                                                                                                          網絡

  

這些標記出來的標誌位十分重要,若是對於逆向開發,這些是須要課在腦子裏的,能夠不強背,實戰中運用熟悉就天然記來了,爲了方便描述,僅以8位來描述學習

演示以前,請讀者參照下方紅色字體,進行簡單設置一下,後面都參考該格式。字體

OD中展現一遍效果,AL是EAX中的低8位(後面有時間這塊我再發博文補充一遍,若是沒有,請讀者自行去學習一下吧,博主剛畢業,時間頗有限),爲了方便演示,咱們直接將鼠標移到EAX,右鍵Modify將其改成0,中間那個框就是標誌寄存器,爲了演示每次的效果,方便咱們觀看標誌位發生改變,咱們用鼠標雙擊,將其所有改成0;編碼

一、進位標誌CF(Carry Flag):若是運算結果的最高位產生了一個進位或借位,那麼,其值爲1,不然其值爲0。spa

  MOV AL,0XFFblog

  ADD AL,0X2開發

 

代碼添加紅框所示,按F8,代碼往下走,咱們一個一個的看!(這裏講解的是Carry flag)因此只看C位!!!it

 

有個疑問?0xFF加上0x2以後,EAX裏的值爲何是0x00000001呢?爲何不顯示0x00000101呢?1去哪了呢?基礎

這裏1並無不存在,而是存在了Carry flag裏,咱們以前將C爲置成了0,相加事後變爲了1,最高位發生了進位,C爲就變成了1。(讀者也能夠去試試借位的狀況,博主這裏趕時間製做,就不演示了,後面內容還挺多,我想趕在12點前寫完)

二、奇偶標誌PF(Parity Flag):奇偶標誌PF用於反映運算結果中「1」的個數的奇偶性。若是「1」的個數爲偶數,則PF的值爲1,不然其值爲0。

   MOV AL,0X5

  ADD AL,0XA

對應的二進制得熟悉啊,否則思考起來很費勁!!!建議熱愛的方向有與彙編相關的,必定要把十進制1 ~ 15對應的十六進制背下來啊

 0x5 加上0xA,很顯然爲0xF,對應的二進制位1111,1的個數爲4個,是偶數個,因此Parity flag爲1(你們能夠試試奇數個的狀況,其實我代碼裏已經有了奇數個的,不知道你們有沒有管擦到~~~)

 三、輔助進位標誌AF(Auxiliary Carry Flag):

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

 (1)、在字(word)操做時,發生低字節向高字節進位或借位時;

 (2)、在字節(byte)操做時,發生低4位向高4位進位或借位時。

 MOV EAX,0X555EFFFF    MOV AX,0X5EFF    MOV AL,0X5F

ADD EAX,0X2          MOV AX,0X2        MOV AL,0X2

 

 

 

 四、零標誌ZF(Zero Flag):零標誌ZF用來反映運算結果是否爲0。

若是運算結果爲0,則其值爲1,不然其值爲0。在判斷運算結果是否爲0時,可以使用此標誌位。

XOR EAX,EAX

 

MOV EAX,2

SUB EAX,2

 咱們先演示XOR(異或),這裏咱們須要先修改EAX裏的值爲AAA,固然了,既然是異或,那隨您意了,隨便什麼數都行

 

 

 五、符號標誌SF(Sign Flag):符號標誌SF用來反映運算結果的符號位,它與運算結果的最高位相同。

   這裏,請讀者拋棄掉之前課本上或者網絡上有關描述最高位爲1表明負數的觀念(後續我會單獨出博文,描述有符號數,無符號數),最高位爲1表明負數純屬扯淡(若是是這樣,計算機存的最大數豈不是要砍半,計算機發明的豈不是太low了),讀者先記住一個觀念有符號數,無符號數純屬編碼者決定,跟計算機不要緊!!!否則我後面講不下去。。。。。

Sign Flag僅僅用來反映運算結果最高位是1,仍是0,不表明有符號數,無符號數~~~

六、溢出標誌OF(Overflow Flag):溢出標誌OF用於反映有符號數加減運算所得結果是否溢出。

 若是運算結果超過當前運算位數所能表示的範圍,則稱爲溢出,OF的值被置爲1,不然,OF的值被清爲0。

 最高位進位與溢出的區別:

進位標誌表示無符號數運算結果是否超出範圍.

 溢出標誌表示有符號數運算結果是否超出範圍.

 溢出主要是給有符號運算使用的,在有符號的運算中,有以下的規律:

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

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

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

 

這個標誌位有點很差理解,須要對有符號,無符號數具備很明確的概念,其實理解了很簡單(就相似於不少人不懂本身多少歲同樣,過了18歲生日,還覺得本身是18歲,其實已是19歲了)

這一塊呢,能夠參考一下Carry Flag標誌位來理解,由於C爲僅僅表示最高位有沒有發生進位 

a、無符號、有符號都不溢出

MOV AL,0X8

ADD AL,0X8

 

b、無符號溢出、有符號不溢出

 

c、無符號不溢出、有符號溢出

 

d、無符號、有符號都溢出

 

爲何這個說有符號、無符號都會溢出呢?

  首先從無符號角度來看,0xFF,僅僅只表明8位能存的最大正數(255),0x80爲 128,既然0xFF已經表明8位能存的最大正數了,就算它加1,也必然溢出

  從有符號角度來看,0xFF,表明着 -128,8位中最小負數,0x80表明8位中最大負數 -1,既然0xFF已經表明了8位中能存的最小負數了,它再加 -1 (0x80)豈不是更小了,因此也必然溢出

 

本文只講述了9個標誌寄存器中的6個,由於這6個比較經常使用,也是博主目前知識儲備中須要用到的6個,後面三個往後接觸到,再來補充文章

若是看完本文,您以爲已經掌握了這6個標誌寄存器,建議您能夠作一作下面的題目,加深對標誌寄存器的理解(答案在筆者電腦裏,若是有須要,能夠留郵箱,筆者私發給你,不難,看完文章就能夠作出來)

一、寫彙編指令隻影響CF位的值(不能影響其餘標誌位)

二、寫彙編指令隻影響PF位的值(不能影響其餘標誌位)

三、寫彙編指令隻影響AF位的值(不能影響其餘標誌位)

四、寫彙編指令隻影響SF位的值(不能影響其餘標誌位)

五、寫彙編指令隻影響OF位的值(不能影響其餘標誌位)

 

 第一篇博文發的有點匆促,許多知識點也不曾講述明白,但本文意圖旨在講述EFLAGS寄存器 (標誌寄存器),不少附帶的知識點,筆者後面有時間會繼續發出來!

寫博文不容易,一方面是給本身留筆記,另外一方面,也但願留給但願學習相關知識的人更清晰的參考,筆者在學習過程當中,碰到過不少問題,曾也由於找不到很好解決問題的文章而苦惱過,編程從不是一個看懂聽懂就行的,必定是多加實踐、實踐、實踐、總結、總結、總結出來的,願牛人技術越牛,新人更上一層樓!祝本身祝你們都能成爲本身想成爲的IT技術大牛!

相關文章
相關標籤/搜索