第11章(標志寄存器):
標志寄存器都是16位? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
flag:按位起作用(其他寄存器是整個起作用)
1,3,5,12,13,14,15為保留位,不具有意義? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? debug中的對應
零位標志位ZF:(6)上一次指令執行后結果為0則為1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (0)NZ (1) ZR
奇偶標志位PF:(2)二進制1的個數為偶數為1,為奇數為0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PO? ? PE
符號標志位SF:(7)結果為負為1,為正為0(對于有符號數)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? PL? ? ? NG
進位標志位CF:(0)無符號運算時記錄進位和借位(都為1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NC? ? ? CY
溢出標志位OF(11)有符號數運算時的進位和錯位(只要最高位改變)? ? ? ? ? ? ? ? NV?
方向標志位DF(10)控制每次操作后si,di的遞增遞減
CF的運用:置0方法:sub ax,ax
? ? ? inc,loop不影響CF? ? ? ? ? ? ? ? add會影響,所以使用inc改變數值而不是add
adc:adc ax,bx==>(ax)=(ax)+(bx)+CF(先算低位后高位)
帶進位的加法指令:利用CF位,把上一次的進位加到本次,adc也會影響CF,可以達到任意位相加
sbb:sbb ax,bx==>(ax)-(bx)-CF(先算高位后低位)
cmp:功能相當于減法,但不保存值,只作為判斷依據(操作寄存器不變化,只影響flag寄存器中標志)
? ? ? ? ? ? ? 考慮結果正負需要考慮SF和OF
? ? ? ? ? ? ? 檢測比較結果的條件轉移
? ? ? ? ? 1.無符號考慮ZF,CF? ? 有符號考慮SF,OF,ZF
(以下指令都是無符號,且都是根據flag寄存器判斷,也就是不配合cmp也可以用)
je:等于則轉移? ? ? ? ZF
jne:不等于則轉移?
jb:低于則轉移? ? CF
jnb:不低于則轉移
ja:高于則轉移? ? ? ? CF和ZF
jna:不高于則轉移
DF的運用:
串傳宗指令:movsb(以字節為單位傳送)movsw(以字為單位)
將ds:si中的字節送入es:di中并對1si,di遞增(DF=0)或遞減(DF=1)
配合rep(根據cx值執行多次串傳送指令)使用
DF設置指令:cld(設為0),std(設為1)
pushf:將標志寄存器結果入棧
popf:將出棧結果傳入標志寄存器
另:1.mov,push,pop等傳送指令不改變標志位
問題總結:1.10H這種代表十進制,對應1的個數為16
實際操作的問題:
? ? ? ? 1.call調用子程序用結束程序隔開,je等跳轉用jmp隔開
? ? ? 2.cmp也要注意操作對象位數相同
? ? ? 3.注意混合使用跳轉命令提高效率