- 标志寄存器中存储的信息通常被称为程序状态字(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,98H
add al,al
adc 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,1000H
mov ax,003EH
sub bx 2000H
sbb 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],8
jne next
inc ax
next:inc bx loop s ;执行65535(效率低,演示用)
mov ax,4c00h
int 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:data
data segment
db 'Welcome to maxm!'
db 16 dup(0)
data ends
code segment
mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
mov cx,16
cld
rep movsb
mov ax,4c00h
int 21h
code ends
end start
;用串传送指令将F000H段中的最后16个字符复制到data段中
data segment
db 16 dup(0)
data ends
code segment
mov ax,data
mov es,ax
mov di,15 ;倒序
mov ax,0F000H
mov ds,ax
mov si,0FFFFH
mov cx,16
std
rep movsb
mov ax,4c00h
int 21h
code ends
end start
- pushf
- 将标志寄存器的值压入栈
- popf
- 栈中弹出数据放到标志寄存器中