标志寄存器
flag寄存器(16位)
flag的1.3.5.12.13.14.15在8086CPU中没有使用,不具有任何意义
CF(flag的第0位)进位标志位
有进位/借位 CF = 1
没有进位/借位 CF = 0
PF(flag的第2位)奇偶标志位
如果结果为偶数,PF = 1
如果结果为奇数,PF = 0
ZF(flag的第6位)零标志位
如果结果为0,ZF = 1
如果结果不为0,ZF = 0
如:mov ax,1 --> sub ax,1 --> 结果为0,所以ZF = 1
mov ax,2 --> sub ax,1 --> 结果不为0,所以ZF = 0
SF(flag的第7位)符号标志位 --> 记录数据的正负
如果结果为负,SF = 1
如果结果为正,SF = 0
(计算为0的时候,SF = 0)
OF标志()溢出标志位
如果出现溢出 OF = 1
如果没有出现溢出 OF = 0
标志 值为1的标记 值为0的标记
DF标志(flag的第10位)方向标志位
在串处理指令中控制si,di的增减
DF = 0:每次操作后si,di递增;
DF = 1:每次操作后si,di递减;
DF的值由:cld指令和std指令决定
cld指令(将DF设置为0)
std指令(将DF设置为1)
格式:movsb
功能:(以字节位单位进行传送)
(1)es:di = ds:si
(2)如果DF = 0:si,di递增1;如果DF = 1:si,di递减1;
将ds:si中的值送入es:di指向的内存中,然后根据DF的值进行增减
格式:movsw
功能:(以字单位进行传送)
(1)es:di = ds:si
(2)如果DF = 0:si,di递增2;如果DF = 1:si,di递减2;
将ds:si中的值送入es:di指向的内存中,然后根据DF的值进行增减
一般来说是跟rep一起使用
rep指令(根据cx的值,重复执行后面的传送指令)
格式:rep movsb/movsw
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
怎么看呢?打开dosbox --> debug --> -r 右下角就是它了
adc 指令(带进位的加法指令),利用CF位上记录的进位值
格式:adc 操作对象1,操作对象2
作用:操作对象1 = 操作对象1 + 操作对象2 + CF
sbb 指令(带进位的减法指令),利用CF位上记录的进位值
格式:adc 操作对象1,操作对象2
作用:操作对象1 = 操作对象1 - 操作对象2 - CF
cmp 指令(比较指令)
格式:cmp 操作对象1,操作对象2
计算操作对象1 - 操作对象2,但不保存结果,仅仅根据计算结果对标志寄存器进行设置
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通