王爽 汇编语言第三版 第11章 标志寄存器
?
?
?
條件碼:
- ① OF(Overflow Flag)溢出標(biāo)志,溢出時為1,否則置0.標(biāo)明一個溢出了的計算,如:結(jié)構(gòu)和目標(biāo)不匹配.
- ② SF(Sign Flag)符號標(biāo)志,結(jié)果為負(fù)時置1,否則置0.
- ③ ZF(Zero Flag)零標(biāo)志,運算結(jié)果為0時置1,否則置0.
- ④ CF(Carry Flag)進(jìn)位標(biāo)志,進(jìn)位時置1,否則置0.注意:Carry標(biāo)志中存放計算后最右的位.
- ⑤ AF(Auxiliary carry Flag)輔助進(jìn)位標(biāo)志,記錄運算時第3位(半個字節(jié))產(chǎn)生的進(jìn)位置。有進(jìn)位時1,否則置0.
- ⑥ PF(Parity Flag)奇偶標(biāo)志.結(jié)果操作數(shù)中1的個數(shù)為偶數(shù)時置1,否則置0.
控制標(biāo)志位:
- ⑦ DF(Direction Flag)方向標(biāo)志,在串處理指令中控制信息的方向。
- ⑧ IF(Interrupt Flag)中斷標(biāo)志。
- ⑨ TF(Trap Flag)陷井標(biāo)志。
?
?
11.1 ZF?標(biāo)志( 0?標(biāo)志位?)
?
11.2?PF?標(biāo)志(?奇偶 標(biāo)志位 )
?
11.3 SF?標(biāo)志 (?結(jié)果正負(fù)標(biāo)志。0?表示 正,1?表示?負(fù)?)
?
https://blog.csdn.net/zhangjiuding/article/details/79133961
寫出下面每條指令執(zhí)行后,ZF、PF、SF等標(biāo)志位的值。?
ZF標(biāo)志:是否為0?
PF標(biāo)志:結(jié)果中是否有偶數(shù)個為 1 的 bit位。?
SF標(biāo)志:結(jié)果是否為負(fù),僅有符號運算有用。
提示:傳送指令不影響標(biāo)志位。至于為什么是這樣,我估計是因為更改標(biāo)志位會費時間,CPU的資源很寶貴,而且轉(zhuǎn)移指令的標(biāo)志位并沒有什么實際意義
?
?
11.4 CF?標(biāo)志 (?進(jìn)位?標(biāo)志位?)
?
?
11.5 OF?標(biāo)志 (?溢出?標(biāo)志位?)
?
11. 6?adc?指令
?
11.7?sbb?指令
?
11.8?cmp?指令
?
?
?
11.9?檢測比較結(jié)果的條件轉(zhuǎn)移指令
?
?
?
?
11.10?DF?標(biāo)志?和?串傳送指令
?
?
11.11?pushf?和?popf
題目:下面的程序執(zhí)行后,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這題是對第十一章標(biāo)志寄存器的更好理解。
先上個圖:
本題關(guān)鍵在于 OF? 標(biāo)志的判斷。另一個關(guān)鍵點是 and 0000 0100 1100 0101 起到了屏蔽未學(xué)習(xí)位的作用!
一步一步來分析:
mov ax,0 將ax置0 push ax ax 入棧 popf 將棧中的數(shù)據(jù)彈出到psw(標(biāo)志寄存器)中 此時 psw 中數(shù)據(jù)為:0000 0000 0000 0000bmov ax, 0fff0h
add ax, 0010h
這兩句的作用是(ax) = fff0h + 0010h,顯然,psw中的數(shù)據(jù)會發(fā)生改變,問題是:如何改變呢?
CF: 假設(shè)這里是無符號運算,則1111 1111 1111 0000b(fff0h) + 0000 0000 0001 0000b(0010h) = 1 0000 0000 0000 0000b,已經(jīng)發(fā)生了進(jìn)位,所以CF = 1
PF: 結(jié)果保存在ax中,ax=0000h,’1’的個數(shù)是0,是偶數(shù),所以PF標(biāo)志=1
AF: AF沒學(xué),先不管,假設(shè)它是個不確定值,AF = ?
ZF: 結(jié)果是0,顯然ZF = 1
SF: 結(jié)果是0,不是負(fù)數(shù),所以SF = 1
TF: TF沒學(xué),先不管,假設(shè)它是個不確定值,AF = ?
IF: IF沒學(xué),先不管,假設(shè)它是個不確定值,AF = ?
DF: DF為方向標(biāo)志位,add指令不會影響DF,前面已經(jīng)將psw置0,所以DF = 0
OF: OF(溢出標(biāo)志位)對初學(xué)者來說是最難的了,OF記錄了有符號數(shù)運算結(jié)果是否溢出。那么,如何判斷是否溢出呢?
?
假設(shè)是有符合運算,fff0h(1111 1111 1111 0000b)對應(yīng)的原碼是1000 0000 0001 000b(即十進(jìn)制-16),這是如何算出來的?很簡單:先看符號位1,說明是個負(fù)數(shù),然后所有位取反再加1(即0000 0000
0001 0000b)得絕對值,前面確定是負(fù)數(shù),所以符號位應(yīng)該是1,則原碼為1000 0000 0001 000b,同樣,0010h的源碼(正數(shù)的補碼和原碼相同)是0000 0000 0001 0000b(即十進(jìn)制的16),
顯然,結(jié)果是0,一個正數(shù)一個負(fù)數(shù)相加,結(jié)果肯定不會溢出!!!下面給出一個tip,用來快速判斷運算是否溢出:
tip: 正加正得負(fù),負(fù)加負(fù)得正,肯定溢出
一正一負(fù)相加肯定不會溢出
(進(jìn)行正加正,負(fù)加負(fù)運算時,可以全部轉(zhuǎn)為十進(jìn)制來看,如果得到正加正得正,負(fù)加負(fù)得負(fù),則需看他們結(jié)果是否在可表示范圍內(nèi))
通過說明的tip,立刻可以判斷出未溢出,所以O(shè)F = 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?標(biāo)志寄存器在?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 ;子程序部分[結(jié)束] codesg ends end begin; 提示: ; 1.相當(dāng)于將字符串中的每個字符在閉區(qū)間['a','z']內(nèi)進(jìn)行比較; ; 2.欲顯示相關(guān)字符串,可調(diào)用實驗10中的"顯示子程序"(屬第十章內(nèi)容),在調(diào)用時注意相關(guān)參數(shù)的傳遞。?
?
?
總結(jié)
以上是生活随笔為你收集整理的王爽 汇编语言第三版 第11章 标志寄存器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windowsx64位安装pymssql
- 下一篇: 小甲鱼 OllyDbg 教程系列 (五)