本文共 4687 字,大约阅读时间需要 15 分钟。
两个无符号整数相加时,进位标志位是目的操作数最高有效位进位的副本。如果和数超过了目的操作数的存储大小,就可以认为CF=1。
mov al, 0FFHadd al , 1 ; AL = 00 , CF = 1
在上面的加法运算中,AL最高有效位的进位复制到进位标志位。
如果AX的值为00FFH,则对其进位加1操作后,和数不会超过16位,那么进位标志位清0.
mov ax, 00FFHadd ax, 1 ; AX = 0100H, CF = 0
但是,如果AX的值为FFFFH,则对其进行加1操作后,AX的高位就会产生进位
mov ax, 0FFFFHadd ax, 1 ; AX = 0000, CF = 1
从较小的无符号整数中减去较大的无符号整数时,减法操作就会将进位标志位置1.
mov al, 1sub al, 2 ; AL = FFH , CF = 1注:
当算术运算结果等于0时,零标志位置1。
例1:mov cx, 1sub cx, 1 ; ECX = 0, ZF = 1mov ax, 0FFFFFFFFHinc ax ; ECX = 0, ZF = 1inc ax ; ECX = 1, ZF = 0dec ax ; ECX = 0, ZF = 1
例2:
mov ax, 100and ax, 0mov ax, 4C00Hint 21注:mul 和 div 运算不影响零标志位。
目的操作数最低有效字节中1的个数为偶数时,奇偶(PF)标志位置1。
mov al, 10001100Badd al, 00000010B ; AL = 10001110, PF = 1sub al, 10000000B ; AL = 00001110, PF = 0
执行了ADD指令后,AL的值为1000 1110(4个0, 4个1),PF = 1。执行了SUB指令后,AL的值包含了奇数个1,因此奇偶标志位等于0。
有符号数算术操作结果为负数,则符号标志位置1。
mov ax, 4sub ax, 5 ; EAX = -1 , SF =1
从机器的角度来看,符号标志位是目的操作数高位的副本。
mov bl ,1 ; BL = 01Hsub bl ,2 ; BL = FFH(-1), SF = 1
注:SF把计算的结果看作是正数或负数。
例如:
下面每条指令执行后,ZF PF SF标志位的值assume cs:codecode segmentstart: ; ZF PF SF mov ax, 0 sub al, al ;1 1 0 al = 0000 0000B mov al, 1 ;1 1 0 al = 0000 0001B push ax ;1 1 0 pop bx ;1 1 0 bl = 0000 0001B add al, bl ;0 0 0 al = 0000 0010B add al, 10 ;0 1 0 al = 0000 1100B mul al ;0 1 0 AX = 0000 0000 1001 0000B ; mul 不影响 SF 标志位 mov ax, 4C00H int 21 code endsend start
有符号数算术操作结果与目的操作数相比,如果发生上溢或下溢,则溢出标志位置1.
mov al, +127add al, 1 ; 0F = 1
同样,最小的负数为-128,再减1就发生下溢。如果目的操作数不能容纳一个有效算术运算结果,那么溢出标志位置1。
mov al, -128sub al, 1 ; OF = 1
assume cs:code, ds:data, ss:stackdata segment db 256 dup(0)data endsstack segment stack db 128 dup(0)stack endscode segment start: mov ax, stack mov ss, ax mov sp, 128 mov al, 80H ; - 128 - 1 = -129 sub al, 1 mov ax, 4C00H int 21H code endsend start
assume cs:code, ds:data, ss:stackdata segment db 256 dup(0)data endsstack segment stack db 128 dup(0)stack endscode segment start: mov ax, stack mov ss, ax mov sp, 128 mov al, 99 add al, 98 mov ax, 4C00H int 21H code endsend start
注:
它用于控制字符串操作指令中地址指针变换的方向。若DF=0,串操作从低地址向高地址方向进行,每次操作后使地址指针SI、DI自动递增;若DF =1,则串操作从高地址向低地址方向进行,SI、DI自动递减。执行CLD指令可使DF清0,STD指令使DF置1。
以下代码实现的是对指令的复制,复制到段地址:偏移地址 0000H:7E00H
assume cs:code, ds:data, ss:stackdata segment db 128 dup(0)data endsstack segment stack db 128 dup(0)stack endscode segment start: mov ax, stack mov ss, ax mov sp, 128 call cpy_Boot mov ax, 4C00H int 21H;==========================================Boot: mov ax, 1000H mov ax, 1000H mov ax, 1000H mov ax, 1000HBoot_end: nop; ===========================================cpy_Boot: mov bx, cs mov ds, bx mov si, OFFSET Boot ; ds:[si] 从 Boot 开始复制 mov bx, 0 mov es, bx mov di, 7E00H ; es:[di] 复制到 段地址:偏移地址 0000H:7E00H mov cx, OFFSET Boot_end - Boot ; 复制次数 cld ; DF = 0 rep movsb ; 复制屏幕上的东西 ; rep重复 movsb 复制字节 ;每执行一次都会自动执行 inc si inc di,无需自己调用 ; dec si dec di retCODE ENDS ; 结束END START
assume cs:code, ds:data, ss:stackdata segment db 128 dup(0)data endsstack segment stack db 128 dup(0)stack endscode segment start: mov ax, stack mov ss, ax mov sp, 128 call init_reg call cpy_screen mov ax, 4C00H int 21H; ===========================================================cpy_screen: mov cx, 24 mov si, 160 mov di, 0 cpyScreenRow: push cx push si push di mov cx, 80 cld rep movsw pop di pop si pop cx add si, 160 add di, 160 loop cpyScreenRow;============================================================init_reg: mov bx, 0B800H mov ds, bx mov es, bx retCODE ENDS ; 结束END START
标志 | 真值为1 | 假值为0 | ||
---|---|---|---|---|
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,则程序正常运行。
转载地址:http://pbqzi.baihongyu.com/