王爽 汇编语言第三版 第11章 标志寄存器
?
?
?
條件碼:
- ① OF(Overflow Flag)溢出標志,溢出時為1,否則置0.標明一個溢出了的計算,如:結構和目標不匹配.
- ② SF(Sign Flag)符號標志,結果為負時置1,否則置0.
- ③ ZF(Zero Flag)零標志,運算結果為0時置1,否則置0.
- ④ CF(Carry Flag)進位標志,進位時置1,否則置0.注意:Carry標志中存放計算后最右的位.
- ⑤ AF(Auxiliary carry Flag)輔助進位標志,記錄運算時第3位(半個字節)產生的進位置。有進位時1,否則置0.
- ⑥ PF(Parity Flag)奇偶標志.結果操作數中1的個數為偶數時置1,否則置0.
控制標志位:
- ⑦ DF(Direction Flag)方向標志,在串處理指令中控制信息的方向。
- ⑧ IF(Interrupt Flag)中斷標志。
- ⑨ TF(Trap Flag)陷井標志。
?
?
11.1 ZF?標志( 0?標志位?)
?
11.2?PF?標志(?奇偶 標志位 )
?
11.3 SF?標志 (?結果正負標志。0?表示 正,1?表示?負?)
?
https://blog.csdn.net/zhangjiuding/article/details/79133961
寫出下面每條指令執行后,ZF、PF、SF等標志位的值。?
ZF標志:是否為0?
PF標志:結果中是否有偶數個為 1 的 bit位。?
SF標志:結果是否為負,僅有符號運算有用。
提示:傳送指令不影響標志位。至于為什么是這樣,我估計是因為更改標志位會費時間,CPU的資源很寶貴,而且轉移指令的標志位并沒有什么實際意義
?
?
11.4 CF?標志 (?進位?標志位?)
?
?
11.5 OF?標志 (?溢出?標志位?)
?
11. 6?adc?指令
?
11.7?sbb?指令
?
11.8?cmp?指令
?
?
?
11.9?檢測比較結果的條件轉移指令
?
?
?
?
11.10?DF?標志?和?串傳送指令
?
?
11.11?pushf?和?popf
題目:下面的程序執行后,ax的值是多少?
assume cs:codesg datasg segmentdb 16 dup(0) datasg ends codesg segmentstart:mov ax,0push axpopfmov ax,0fff0hadd ax,0010hpushfpop axand al,11000101band ah,00001000bmov ax,4c00hint 21hcodesg endsend start這題是對第十一章標志寄存器的更好理解。
先上個圖:
本題關鍵在于 OF? 標志的判斷。另一個關鍵點是 and 0000 0100 1100 0101 起到了屏蔽未學習位的作用!
一步一步來分析:
mov ax,0 將ax置0 push ax ax 入棧 popf 將棧中的數據彈出到psw(標志寄存器)中 此時 psw 中數據為:0000 0000 0000 0000bmov ax, 0fff0h
add ax, 0010h
這兩句的作用是(ax) = fff0h + 0010h,顯然,psw中的數據會發生改變,問題是:如何改變呢?
CF: 假設這里是無符號運算,則1111 1111 1111 0000b(fff0h) + 0000 0000 0001 0000b(0010h) = 1 0000 0000 0000 0000b,已經發生了進位,所以CF = 1
PF: 結果保存在ax中,ax=0000h,’1’的個數是0,是偶數,所以PF標志=1
AF: AF沒學,先不管,假設它是個不確定值,AF = ?
ZF: 結果是0,顯然ZF = 1
SF: 結果是0,不是負數,所以SF = 1
TF: TF沒學,先不管,假設它是個不確定值,AF = ?
IF: IF沒學,先不管,假設它是個不確定值,AF = ?
DF: DF為方向標志位,add指令不會影響DF,前面已經將psw置0,所以DF = 0
OF: OF(溢出標志位)對初學者來說是最難的了,OF記錄了有符號數運算結果是否溢出。那么,如何判斷是否溢出呢?
?
假設是有符合運算,fff0h(1111 1111 1111 0000b)對應的原碼是1000 0000 0001 000b(即十進制-16),這是如何算出來的?很簡單:先看符號位1,說明是個負數,然后所有位取反再加1(即0000 0000
0001 0000b)得絕對值,前面確定是負數,所以符號位應該是1,則原碼為1000 0000 0001 000b,同樣,0010h的源碼(正數的補碼和原碼相同)是0000 0000 0001 0000b(即十進制的16),
顯然,結果是0,一個正數一個負數相加,結果肯定不會溢出!!!下面給出一個tip,用來快速判斷運算是否溢出:
tip: 正加正得負,負加負得正,肯定溢出
一正一負相加肯定不會溢出
(進行正加正,負加負運算時,可以全部轉為十進制來看,如果得到正加正得正,負加負得負,則需看他們結果是否在可表示范圍內)
通過說明的tip,立刻可以判斷出未溢出,所以OF = 0;
所以:運行完上面兩條語句后,psw值為: 0000 00?? 010? 0101b
pushf 將psw的值入棧
pop ax 此時ax即: 0000 00?? 010? 0101b
and al,11000101b
and ah,00001000b
and 的是按位與,運算法則是:有0則0,我們寫對齊來看
0000 00?? 010? 0101b
0000 1000 1100 0101b
顯然 and 以后 ax = 0000 0000 0100 0101b = 45h
?
?
11.12?標志寄存器在?debug?中的表示
?
?
實驗 11: 編寫子程序
?
示例代碼:
assume cs:codesgdatasg segmentdb "Beginner's All-purpose Symbolic Instruction Code.",0 datasg endscodesg segment begin:mov ax,datasgmov ds,axmov si,0call lettercmov ax,4c00hint 21hletterc: ;子程序部分[開始]push si s0: mov al,[si]cmp al,0je exitsubcmp al,61h ; 61h為'a'的ASCII碼jb nextcmp al,7ah ; 7ah為'z'的ASCII碼ja nextand al,11011111B ;或使用sub al,20hmov [si],al next: inc sijmp short s0 exitsub:pop siret ;子程序部分[結束] codesg ends end begin; 提示: ; 1.相當于將字符串中的每個字符在閉區間['a','z']內進行比較; ; 2.欲顯示相關字符串,可調用實驗10中的"顯示子程序"(屬第十章內容),在調用時注意相關參數的傳遞。?
?
?
總結
以上是生活随笔為你收集整理的王爽 汇编语言第三版 第11章 标志寄存器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windowsx64位安装pymssql
- 下一篇: 小甲鱼 OllyDbg 教程系列 (五)