汇编语言 标志位
加法和進位標志位
兩個無符號整數相加時,進位標志位是目的操作數最高有效位進位的副本。如果和數超過了目的操作數的存儲大小,就可以認為CF=1。
mov al, 0FFH add al , 1 ; AL = 00 , CF = 1在上面的加法運算中,AL最高有效位的進位復制到進位標志位。
如果AX的值為00FFH,則對其進位加1操作后,和數不會超過16位,那么進位標志位清0.
mov ax, 00FFH add ax, 1 ; AX = 0100H, CF = 0但是,如果AX的值為FFFFH,則對其進行加1操作后,AX的高位就會產生進位
mov ax, 0FFFFH add ax, 1 ; AX = 0000, CF = 1減法和進位標志位
從較小的無符號整數中減去較大的無符號整數時,減法操作就會將進位標志位置1.
mov al, 1 sub al, 2 ; AL = FFH , CF = 1
注:
- INC和DEC指令不會影響進位標志位。在非零操作數上應用NEG指令總是會將進位標志位置1。
- 移動指令 mov、push、pop這些指令不會影響標志位。
零標志位
當算術運算結果等于0時,零標志位置1。
例1:
例2:
mov ax, 100 and ax, 0mov ax, 4C00H int 21
注:mul 和 div 運算不影響零標志位。
奇偶標志位
目的操作數最低有效字節中1的個數為偶數時,奇偶(PF)標志位置1。
mov al, 10001100B add al, 00000010B ; AL = 10001110, PF = 1 sub al, 10000000B ; AL = 00001110, PF = 0執行了ADD指令后,AL的值為1000 1110(4個0, 4個1),PF = 1。執行了SUB指令后,AL的值包含了奇數個1,因此奇偶標志位等于0。
符號標志位
有符號數算術操作結果為負數,則符號標志位置1。
mov ax, 4 sub ax, 5 ; EAX = -1 , SF =1從機器的角度來看,符號標志位是目的操作數高位的副本。
mov bl ,1 ; BL = 01H sub bl ,2 ; BL = FFH(-1), SF = 1注:SF把計算的結果看作是正數或負數。
例如:
下面每條指令執行后,ZF PF SF標志位的值
溢出標志位
有符號數算術操作結果與目的操作數相比,如果發生上溢或下溢,則溢出標志位置1.
mov al, +127 add al, 1 ; 0F = 1同樣,最小的負數為-128,再減1就發生下溢。如果目的操作數不能容納一個有效算術運算結果,那么溢出標志位置1。
mov al, -128 sub al, 1 ; OF = 1 assume cs:code, ds:data, ss:stackdata segmentdb 256 dup(0) data endsstack segment stackdb 128 dup(0) stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128mov al, 80H ; - 128 - 1 = -129sub al, 1mov ax, 4C00Hint 21Hcode endsend start assume cs:code, ds:data, ss:stackdata segmentdb 256 dup(0) data endsstack segment stackdb 128 dup(0) stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128mov al, 99add al, 98mov ax, 4C00Hint 21Hcode endsend start注:
- AL字節型數據表示的范圍:-128~127
- AX字型數據表示的范圍:-32768~32767
- 超過以上范圍就會溢出,溢出標志位置1。
方向標志位
它用于控制字符串操作指令中地址指針變換的方向。若DF=0,串操作從低地址向高地址方向進行,每次操作后使地址指針SI、DI自動遞增;若DF =1,則串操作從高地址向低地址方向進行,SI、DI自動遞減。執行CLD指令可使DF清0,STD指令使DF置1。
以下代碼實現的是對指令的復制,復制到段地址:偏移地址 0000H:7E00H
assume cs:code, ds:data, ss:stackdata segmentdb 128 dup(0) data endsstack segment stackdb 128 dup(0) stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128call cpy_Bootmov ax, 4C00Hint 21H;========================================== Boot: mov ax, 1000Hmov ax, 1000Hmov ax, 1000Hmov ax, 1000HBoot_end: nop ; =========================================== cpy_Boot:mov bx, csmov ds, bxmov si, OFFSET Boot ; ds:[si] 從 Boot 開始復制mov bx, 0mov es, bxmov di, 7E00H ; es:[di] 復制到 段地址:偏移地址 0000H:7E00Hmov cx, OFFSET Boot_end - Boot ; 復制次數cld ; DF = 0rep movsb ; 復制屏幕上的東西 ; rep重復 movsb 復制字節 ;每執行一次都會自動執行 inc si inc di,無需自己調用; dec si dec diretCODE ENDS ; 結束 END START- rep movsb 復制字節
- b相當于byte
- rep movsw 復制字
- w相當于word
- w相當于word
| OF | OV | NV | . OV = Overflow | NV = not overflow |
| SF | NG | PL | NG = negative | PL = Positive |
| ZF | ZR | NZ | ZR = Zero | NZ = not Zero |
| PF | PE | PO | PE = EVEN | PO = ODD |
| CF | CY | NC | CY = Carry Yes | Nc = not Carry |
| DF | DN | UP | Dn = Down | UP |
中斷標志
IF = 1時,允許CPU響應可屏蔽中斷,IF = 0時,禁止響應可屏蔽中斷。執行STI指令可使IF置1,CLI指令使IF清0.
陷阱標志
TF也稱為單步標志,它是為調試程序提供方便而設置的。若TF置1,則使CPU處于單步工作方式,每執行完一條指令,自動產生一次單步中斷,將寄存器、存儲器等內容顯示在屏幕上,用戶可查看本條指令執行后的結果,以便逐條檢查指令執行結果。若TF = 0,則程序正常運行。
總結
- 上一篇: 汇编语言 内部中断
- 下一篇: 汇编语言 ADC指令和SBB指令