- 标志寄存器中存储的信息通常被称为程序状态字(PSW)
- 影响flag的指令:add sub mul div inc or and等运算指令
补码&有符号数
- 第一位符号位
正数的补码就是其本身 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
- 第一位符号位
flag按位起作用
- 0:CF
- 进位标志位,无符号运算
- 记录进位或借位
- 计算前清空
- 2:PF
- 奇偶标识位
- 记录指令执行后结果的所有二进制位中1的个数,为偶数PF=1
- 4:AF
- 6:ZF
- 运算指令执行结果为0,ZF=1
- 7:SF
- 符号标志位,只对有符号数运算有作用,无符号运算忽略,看人的选择
- 结果为负,SF=1
- 8:TF
- 9:IF
- 10:DF
- 方向标志位
- 串传送指令,在串处理指令中,控制每次操作后si di的增减
- DF=0,每次操作后si di递增
- DF=1,每次操作后si di递减
- 11:OF
- overflow
- 有符号运算时,结果超出机器表示范围(侵犯了符号位,符号位改变),OF=1
- 0:CF
- adc命令
- 带进位加法指令,利用cf位上记录的进位值
- adc 操作对象1,操作对象2
- 和add配合
- (ax)=(ax)+(bx)+CF
- inc\loop不会影响cf的值(用来替代地址改变时add操作)
```cpp ;计算1EF000H+201000H,结果放在ax(高16位)和bx(低16位),从低位到高位相加mov al,98Hadd al,aladc al,3;(ax)+3+CF
mov ax,001EH mov bx,0F00H add bx,1000H adc ax,0020H
- sbb- 带借位减法指令,利用CF上记录的借位值- sbb ax,bx- (ax)=(ax)-(bx)-CF```cpp;计算003E1000H~00202000H,结果放在ax,bx中mov bx,1000Hmov ax,003EHsub bx 2000Hsbb ax,0020H
- cmp指令
- cmp A,B
- 计算A-B,但不保存结果,只根据结果对标志寄存器进行设置
- 比较无符号数:

比较有符号数:
- (ah)<(bh) -> SF=1
- SF=1不一定(ah)<(bh) ,可能产生溢出,要同时考虑OF寄存器
- SF:得知实际结果的正负
- OF:得知有没有溢出
- SF=1,OF=0: (ah)<(bh)
- SF=1,OF=1: (ah)>(bh)
- SF=0,OF=1:(ah)<(bh)
- SF=0,OF=0: (ah)>(bh)
- 条件跳转
```cpp
assume cs:code
data segment db 8,11,8,1,8,5,63,38 data ends
code segment
start:mov ax,data mov ds,ax mov bx,0 mov ax,0 mov cx,0
s:cmp byte ptr [bx],8jne nextinc ax
next:inc bx loop s ;执行65535(效率低,演示用)
mov ax,4c00hint 21h
code ends end start
- movsb(串传送指令)- 以字节为单位传送,将**ds:si****指向的内存单元中的字节送入****es:di**,根据标志寄存器DF的值决定si和di是递增还是递减。- ((es)*16+(di))=((ds)*16+(si))- 如果DF=0 : (si)=(si)+1,(di)=(di)+1- 如果DF=1 : (si)=(si)-1,(di)=(di)-1- movsw(串传送指令)- 以字为单位传送- rep movsb/movsw- rep的作用:根据cx的值,重复执行后面的串传送指令- cld指令- DF位置0- std指令- DF位置1```cpp;用串传送指令,将data段中的第一个字符串复制到它后面的空间中;传送的source target 传送的长度 方向(DF)assume cs:code, ds:datadata segmentdb 'Welcome to maxm!'db 16 dup(0)data endscode segmentmov ax,datamov ds,axmov si,0mov es,axmov di,16mov cx,16cldrep movsbmov ax,4c00hint 21hcode endsend start
;用串传送指令将F000H段中的最后16个字符复制到data段中data segmentdb 16 dup(0)data endscode segmentmov ax,datamov es,axmov di,15 ;倒序mov ax,0F000Hmov ds,axmov si,0FFFFHmov cx,16stdrep movsbmov ax,4c00hint 21hcode endsend start
- pushf
- 将标志寄存器的值压入栈
- popf
- 栈中弹出数据放到标志寄存器中
