匯編之標志寄存器(flag)——EFL


標志寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的信息。

如一個flag寄存器為:

   0000 0206    (16進制)

拆成(2進制):

  0000 0000 0000 0000 0000 0010 0000 0110

(1)CF位(第0位——Carry flag)

作用:若(無符號數)算數操作產生的結果在最高有效位發生進位或借位則將其置1,反之清零。

  這個標志通常用來指示無符號整型運算的溢出狀態。

運算相關的指令都會影響到標志寄存器。

例:在AL中執行加法,且超出FF。

執行前:

  

 

 

執行結束:

  

 

 

 

(2)PF位/奇偶校驗位(第二位)

    如果結果的最低有效字節包含偶數個1位則該位置1,否則清零

  例: 0000 0001 0001 1000   :最低有效字節(即最后一個字節,最后8個二進制數)有2個1,是偶數個,此時PF位就是1

 

 

 PF位的作用:

  

 

 

 

 

 

(3)AF位:

  主要在BCD運算中

(4)ZF位(Zero flag)——使用較多

  若結果為0則將其置1,反之置零。

  經常與CMP或者TEST等指令一起用

例:

  (1)判斷兩個值是否相等:  

      使用SUB EAX,ECX用於判斷EAX和ECX的值是否相等,但是使用SUB的話,EAX的值會被改成相減的結果

      可以使用CMP指令:CMP指令相當於SUB,但是相減的結果並不會保存到第一個操作數中

  (2)判斷某個值是否為0

      如使用 AND EAX,EAX 0——>ZF=1

      又或者使用TEST指令(TEST指令比較的結果並不會保存到第一個操作數中)

(5)SF位(Sign flag)

  設置有符號整型的最高有效位——0表示為正,1表示為負

  作用:看一個運算結束的SF位即可判斷結果是正的還是負的

(6)OF位(Overflow flag)

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

可以理解為:

  無符號數運算,是否溢出看CF位

  有符號數運算,是否溢出看OF位

(7)DF位/方向位(第十位):

第10位從下標開始算:

  0000 0000 0000 0000 0000 0010 0000 0110

DF位如果是0的時候,每次執行完MOVS指令后,ESI和EDI的地址都會發生變化。

  • 當DF位是0的時候,ESI和EDI的值都會  +1或者+2或者+4(加幾取決於移動了1、2、4個字節)
  • 當DF位是1的時候,ESI和EDI的值都會  -1或者-2或者-4(加幾取決於移動了-1、-2、-4個字節)

 Debug工具中雙擊D即可修改:

 

 

例:MOVS指令復制內容:MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]

正常執行結束,ESI和EDI的值應該變成98和78

ESI和EDI存的地址:,且DF位設置為1。正

ESI&EDI存的地址的值:

 

F8執行完結果:可見94位置的數據兩個字的數據已經被全數復制到了74位置。

 

這時再看ESI和EDI的變化:,原本的94和74已經變成了90和70。兩個的值都向后退了4位。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM