標志寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的信息。
如一個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位。