flag
- flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。
- 而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
ZF标志
- 在8086CPU的指令集中,有的指令的执行是影响标志寄存器的,比如:add、sub、mul、div、inc、or、and等,它们大都是运算指令(进行逻辑或算术运算);
mov、push、pop等,它们都是传送指令,不会对标志寄存器有影响。
PF标志
flag的第二位是PF,奇偶标志位。它记录指令执行后,结果所有二进制位中1的个数:
flag的第7位是SF,符号标志位。
flag的第0位是CF,进位标志位
- 一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的错位值。
对于位数位N的无符号数来说,其对应的二进制信息的最高位,即第N-1位的最高有效位,而假想存在的第N位,就是相对于最高有效位的更高位。
OF标志
如果结果超过了机器所能表示的范围成为溢出。
- 如果在进行有符号数运算时发生一处,那么运算结果将不正确。
CF与OF的区别:
adc是带进位加法指令,他利用类CF位上记录的进位值。
计算1EF000H+201000H,结果放在ax(高16位)和bx(低16位)中
mov ax,001eh
mov bx,0f00h
add bx,1000h
adc ax,0020h
sbb指令
-
cmp指令
cmp是比较指令,功能相当于减法指令,只是不保存结果。
- cmp指令执行后,对标志寄存器产生影响。
- 比如:cmp ax,ax
- 结果为0,但并不在ax中保存,仅影响flag的相关位
条件转移指令
- 无符号
- je 等于则转移 ZF=1
- jne 不等于则转移 ZF=0
- jb 低于则转移 CF=1
- jnb 不低于则转移 CF=0
- ja 高于则转移 CF=0,ZF=0
- jna 不高于则转移 CF=1或ZF=1
如果(ah)=(bh)则(ah)=(ah)+(ah),否则(ah)=(ah)+(bh)
cmp ah,bh
je s
add ah,bh
jmp short ok
s: add ah,ah
ok: ret
DF标志和串传送指令
flag的第10位是DF,方向标志位。
- 在串处理指令中,控制每次操作后si,di的增减
- DF=0:每次操作后si,di递增
- DF=1:每次操作后si,di递减
- movsb
- ((es)16+(di))=((ds)16+(si))
- DF=0:(si)=(si)+1 (di)=(di)+1
- DF=1:(si)=(si)-1 (di)=(di)-1
- ((es)16+(di))=((ds)16+(si))
- movsb和movsw一般配合rep使用
- rep movsb:rep的作用是根据cx的值,重复执行后面的串传送指令。
- 8086CPU提供了两条指令对DF位进行设置:
- cld:将标志寄存器的DF位置0
- std:将标志寄存器的DF位置1
将data段中的第一个字符串复制到他后面的空间中
data segment
db 'Welcome to tong!'
db 16 dup (0)
data ends
code segment
start:
mov ax,data
mov ds,ax
mov es,ax
xor si,si
mov di,16d
xor bx,bx
mov cx,16d
cld
rep movsb
mov ax,4c00H
int 21H
code ends
end start
pushf和popf
pushf:将标志寄存器的值压入栈
- popf:将标志寄存器的值弹出,送入标志寄存器中。
- pushf和popf,为直接访问标志寄存器提供了一种方法