8089彙編 標誌寄存器
在8086CPU的指令集中,有的指令的執行是影響標誌寄存器的,比如:add、sub、mul、div、inc、or、and等,它們大都是運算指令,進行邏輯或算術運算;
有的指令的執行對標誌寄存器沒有影響,比如:mov、push、pop等,它們大都是傳送指令。
使用一條指令的時候,要注意這條指令的全部功能,其中包括執行結果對標記寄存器的哪些標誌位造成影響。
標誌寄存器的結構
flag寄存器是按位起作用的,也就是說,它的每一位都有專門的含義,記錄特定的信息。
8086CPU中沒有使用flag的1、3、5、12、13、14、15位,這些位不具有任何含義。
標誌寄存器的作用
用來存儲相關指令的某些執行結果
用來爲CPU執行相關指令提供行爲依據
用來控制CPU的相關工作方式
觀察值
標誌位說明
一、標誌位解析
1、直接訪問標誌寄存器的方法
- pushf :將標誌寄存器的值壓棧;
- popf :從棧中彈出數據,送入標誌寄存器中。
2、內存中16位標誌位表示
3、標誌位說明
二、ZF-零標誌(Zero Flag)
ZF標記相關指令的計算結果是否爲0
- ZF=1,表示“結果是0 ”,1表示“邏輯真”
- ZF=0,表示“結果不是0”,0表示“邏輯假”
三、PF-奇偶標誌(Parity Flag)
PF記錄指令執行後,結果的所有二進制位中1的個數:
- 1的個數爲偶數,PF = 1;
- 1的個數爲奇數,PF = 0。
四、SF-符號標誌(Sign Flag)
SF 標誌是CPU對有符號數運算結果的一種記錄 。
將數據當作有符號數來運算的時候,通過SF可知結果的正負;將數據當作無符號數來運算,SF的值則沒有意義,雖然相關的指令影響了它的值。
SF記錄指令執行後,將結果視爲有符號數
- 結果爲負,SF = 1;
- 結果爲非負,SF = 0。
五、CF-進位標誌(Carry Flag)
在進行無符號數運算的時候,CF記錄了運算結果的最高有效位向更高位的進位值,或從更高位的借位值。
CF記錄指令執行後:
- 有進位或借位,CF = 1
- 無進位或借位,CF = 0
對於位數爲N的無符號數來說,其對應的二進制信息的最高位即第N-1位,是最高有效位
假想存在的第N位,就是相對最高有效位的更高位。
六、OF-溢出標誌(Overflow Flag)
在進行有符號數運算的時候,如結果超過了機器所能表示的範圍稱爲溢出。
OF記錄有符號數操作指令執行後
- 有溢出,OF = 1
- 無溢出,OF = 0
機器所能表達的範圍
以8位運算爲例,結果用 8 位寄存器或內存單元來存放,機器所能表示的範圍就是-128~127。
同理,對於16 位有符號數,機器所能表示的範圍是-32768~32767。
注意,此處溢出只是對有符號數運算而言。
CF和OF的區別
CF是對無符號數運算有意義的進/借位標誌位
OF是對有符號數運算有意義的溢出標誌位
應用
七、DF-方向標誌位(Direction Flag)
在串處理指令中,控制每次操作後si,di的增減:
- DF = 0:每次操作後si,di遞增;
- DF = 1:每次操作後si,di遞減。
對DF位進行設置的指令:
- cld指令:將標誌寄存器的DF位設爲0(clear)
- std指令:將標誌寄存器的DF位設爲1(setup)
八、其他標誌說明
TF-陷阱標誌(Trap flag):用於調試時的單步方式操作。當TF=1時,每條指令執行完後產生陷阱,由系統控制計算機;當TF=0時,CPU正常工作,不產生陷阱。
IF-中斷標誌(Interrupt flag):當IF=1時,允許CPU響應可屏蔽中斷請求;當IF=0時,關閉中斷。
CPU在執行完一條指令之後,如果檢測到標誌寄存器的TF位爲1,則產生單步中斷(中斷類型碼爲1),引發中斷過程,執行中斷處理程序。