标志寄存器
8086的标志寄存器是16位寄存器,它是按位起作用的,也就是说,它的每一位都有专门的含义,记录特定的信息。
8086CPU中没有使用flag的1、3、5、12、13、14、15位,这些位不具有任何含义
标志寄存器的作用
1) 用来存储相关指令的某些执行结果
2) 用来为CPU执行相关指令提供行为依据
3) 用来控制CPU的相关工作方式
1. ZF-零标志
ZF标记相关指令的计算结果是否为0
ZF=1(ZR),表示“结果是0 ”,1表示“逻辑真”
ZF=0 ( NZ ),表示“结果不是0”,0表示“逻辑假”
2. PF-奇偶标志
PF记录指令执行后,结果的所有二进制位中1的个数:
PF = 1 (PE ),表示1的个数为偶数
PF = 0 (PO),表示1的个数为奇数
3. SF-符号标志
SF记录指令执行后,将结果视为有符号数
SF = 1 (NG), 表示结果为负
SF = 0(PL),表示结果为非负
SF 标志是CPU对有符号数运算结果的一种记录 。
将数据当作有符号数来运算的时候,通过SF可知结果的正负;将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。
4. CF-进位标志
在进行无符号数运算的时候,CF记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值
CF=1(CY), 表示有进位或借位
CF=0(NC), 表示无进位或借位
5. OF-溢出标志
在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出
OF = 1(OV), 表示有溢出
OF = 0(NV), 表示无溢出
eg:
mov al,0F0H
add al,88H
执行结果:CF=1, OF=1
即当无符号数运算有进位,当有符号数运算有溢出
带进(借)位的加减法
adc-带进位加法指令
格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF
sbb-带借位减法指令
格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1–操作对象2–CF
cmp与条件转移指令
cmp指令
格式:cmp 操作对象1,操作对象2
功能:比较两个操作对象
原理:相当于减法指令, 只是不保存结果,cmp 指令执行后, 将对标志寄存器产生影响,其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
jxxx系列指令和cmp指令配合,构造条件转移指令
根据无符号数比较结果进行转移的指令:
根据有符号数比较结果进行转移的指令:
根据单个标志位转移的指令:
j-Jump e-Equal n-Not b-Below a-Above L-less g-Greater
s-Sign C-carry p-Parity o-Overflow z-Zero
DF标志和串传送指令
DF-方向标志位(Direction Flag)
功能:
在串处理指令中,控制每次操作后si,di的增减。
DF = 0:每次操作后si,di递增;
DF = 1:每次操作后si,di递减。
对DF位进行设置的指令:
cld指令:将标志寄存器的DF位设为0(clear)
std指令:将标志寄存器的DF位设为1(setup)
串传送指令
1. movsb
功能:以字节为单位传送
(1) ((es)×16 + (di)) = ((ds) ×16 + (si))
(2) 如果DF = 0则:
(si) = (si) + 1
(di) = (di) + 1
如果DF = 1则:
(si) = (si) - 1
(di) = (di) - 1
2. movsw
功能:以字为单位传送
(1) ((es)×16 + (di)) = ((ds) ×16 + (si))
(2) 如果DF = 0则:
(si) = (si) + 2
(di) = (di) + 2
如果DF = 1则:
(si) = (si) - 2
(di) = (di) - 2
rep指令
rep指令常和串传送指令搭配使用
功能:根据cx的值,重复执行后面的指令
(1)rep movsb
相当于
s : movsb
loop s
(2)rep movsw
相当于
s : movsw
loop s
eg:
将data段中的第一个字符串复制到它后面的空间中。
data segment
db ‘Welcome to masm!’
db 16 dup (0)
data ends
assume cs:codesg,ds:datasg
datasg segment
db 'Welcome to masm!'
db 16 dup (0)
datasg ends
codesg segment
start: mov ax,data
mov ds,ax
mov si,0
mov es,ax
mov di,16
cld ;DF设为0
mov cx,8
rep movsw ;串传送
mov ax,4c00h
int 21h
codesg ends
end start