flag 标志寄存器 (16位)
每一位有专门的意义
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
ZF 零标志位 结果为0 则ZF=1
结果为1 则ZF=0
PF 奇偶标志位 记录了再结果中的所有bit中
如果1的个数为偶数 PF=1
如果1的个数为奇数 PF=0
SF 符号标志位 结果为负数 SF=1
结果非负 SF=0
CF 进位标志位 在进行N位无符号数的运算时
最高位N-1位对第N位有借位和进位时 CF=1 木有则CF=0
OF 溢出标志位 记录了有符号运算的结果是否发生了溢出
何为溢出 判断如下
1 两个正数相加(或一个正数减一个负数)得到负数,就是溢出了.
2 两个负数相加得到正数,就是溢出了.
3 一个正数和一个负数相加不可能溢出
DF 方向标志位 在串处理指令(movsb movsw)中 控制每次操作后 si di的增减
DF=0 每次操作后 si di递增
DF=1 每次操作后 si di递减
串操作指令
movsb movsw
movsb 功能
是将ds:si指向的内存单元中的字节送入es:di中
然后根据寄存器df位的值 将si和di递增和递减
用汇编语法描述movsb功能如下
mov es:[di], byte ptr ds:[si] ;8086不支持此指令
如果 df=0 方向标志位 df=0 则si di递增 反之递减
inc si
inc di
如果 df=1
dec si
dec di
movsw 字单元与movsb原理一样
用汇编语法描述movsb功能如下
mov es:[di], word ptr ds:[si] ;8086不支持此指令
如果 df=0 方向标志位 df=0 则si di递增 反之递减
add si,2
add di,2
如果 df=1
sub si,2
sub di,2
一般串操作指令与rep配合使用
rep movsb
汇编解释 其功能
s: movsb
loop s
可见rep的作用是根据cx的值 重复执行后面的串操作指令(方向看df)
故 rep movsb 就可以循环实现(cx)个字符的传送 (rep movsw一样的)
而传送的方向是根据df来的 所以cpu提供了可以改变df值的指令
cld 置df为0 递增
std 置df为1 递减
使用串操作指令将 F000H段中的最后16字符复制到data段中
data segment
db 16 dup(0)
data ends
程序分析
原始地址 F000H:FFFF;
目的地址 data :000F
传送的长度 16
传送的方向 :因为逆向传送比较方便 所以设置df=1
程序如下:
mov ax,0f000h
mov ds,ax
mov si,0ffffh
mov ax,data
mov es,ax
mov di,15
mov cx,16
std
rep movsb