标志寄存器
标志寄存器概述
标志寄存器标志位的作用:
存储相关指令的某些执行结果
为CPU执行相关指令提供行为依据
控制CPU的相关工作方式
位数 | e | d | c | b | a | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
用途 | ----- | ----- | ----- | OF溢出 | DF方向 | IF中断 | TF | SF符号 | ZF零 | ----- | AF辅助进位 | ----- | PF奇偶 | ----- | CF进位 |
判断 | ----- | ----- | ----- | 是/否 | 减量/增量 | 允许/关闭 | ----- | 负/正 | 是/否 | ----- | 是/否 | ----- | 偶/奇 | ----- | 是/否 |
true | ----- | ----- | ----- | OV | DN | EI | ----- | NG | ZR | ----- | AC | ----- | PE | ----- | CY |
false | ----- | ----- | ----- | NV | UP | DI | ----- | PL | NZ | ----- | NA | ----- | PO | ----- | NC |
对应控制面板的该位置
负数存储过程(划到最后面看)
相关指令
ADC 指令
作用:在计算加法的时候,一同带上CF标志位的进位值进行计算。
SBB指令
assume cs:code,ds:data,ss:stack data segment DW 256 DUP(0H) data ends stack segment DW 256 DUP(0H) stack ends code segment start: mov ax,0037h mov bx,0000h mov cx,0030h mov dx,0001h sub bx,dx sbb ax,cx mov ax,4c00H int 21H code ends end start
CMP比较指令
计算减法功能,但不保存结果,根据计算结果影响标志寄存器的位
如:CMP AX,BX
这一操作会进行AX-BX,但是不保存结果,而是用结果去影响标志寄存器的位
CMP指令比较对照(CMP A,B)
影响结果 | 对比内容 | 备注 |
---|---|---|
ZF=1 | A=B(等于) | A-B=0 |
ZF=0 | A!=B(不等于) | |
CF=1 | A<B(小于) | A-B<0 |
CF=0 | A>=B(大于或等于) | |
CF=0 并且 ZF=0 | A>=B(大于) | |
CF=1 或者 ZF=1 | A<=B(小于或等于) |
条件转移指令
判断内容 | 判断条件 | 条件转移指令 |
---|---|---|
ZF=1 | A=B(等于) | JE |
ZF=0 | A!=B(不等于) | JNE |
CF=1 | A<B(小于) | JB |
CF=0 | A>=B(大于或等于) | JNB |
CF=0 并且 ZF=0 | A>=B(大于) | JA |
CF=1 或者 ZF=1 | A<=B(小于或等于) | JNA |
CLD指令
将标志寄存器的DF位置0(将DF的值改变为0)
STD指令
将标志寄存器的DF位置1
串传送指令
MOVSB指令
将DS:SI指向的内存单中的字节传送入ES:DI指向的内存单,然后根据DF标志位的值,将SI、DI递增或递减
MOVSW指令
将DS:SI指向的内存单中的字传送入ES:DI指向的内存单,然后根据DF标志位的值,将SI、DI递增2或递减2
REP指令
assume cs:code,ds:data,ss:stack data segment db 'miss you' db 8 DUP(0H) data ends stack segment DW 256 DUP(0H) stack ends code segment start: mov ax,data mov ds,ax mov si,0h mov es,ax mov di,08h cld mov cx,4H rep movsw mov ax,4c00H int 21H code ends end start
标志寄存器的栈指令
assume cs:code,ds:data,ss:stack data segment DW 256 DUP(0H) data ends stack segment DW 256 DUP(0H) stack ends code segment start: mov ax,stack mov ss,ax cmp sp,60h mov ax,1234h push ax pushf mov ax,4c00H int 21H code ends end start
ZF标志寄存器
处于FLAGS寄存器的第6位上,是零标志位,负责记录相关指令执行后,其结果是否为0,如果true,则ZF的值为1,显示为ZR,如果false,则ZF的值为0,显示NZ。
位数 | e | d | c | b | a | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
存储 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
显示 | ----- | ----- | ----- | NV | UP | DI | ----- | PL | ZR | ----- | NA | ----- | PO | ----- | NC |
注意:在以算计指令中,有的指令执行影响标志寄存器,有的不影响
如:ADD、SUB、INC 、DEC 、MUL 、DIV等指令
的执行都会影响标志寄存器
而:MOV等指令执行则不会影响标志寄存器
PF标志寄存器
SF标志寄存器
- 学习此寄存器前,请先了解负数存储过程及其相关反码、补码概念
- 处于FLAGS寄存器的第7位上,是符号标志位,负责记录相关指令执行后,其结果为负,SF值为1,显示NG;结果为非负,SF值为0,显示PL;
对于同一个二进制数
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
---|
当其表示为无符号数字类型时:对应的十进制数为:129
当其表示为有符号数字类型时:对应的十进制数为:-127
无符号数字类型不能存储负数,但是相对存储的非负数的范围更广;
有符号数字类型可以存储负数,但是相对存储的非负数的范围更小。
SF标志寄存器对有符号数字类型和无符号数字类型都起作用,但是对无符号数字类型无意义。
CF标志寄存器
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
---|
和
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
---|
相加时,最高位相加会向更高一位进位,得到一个16位的二进制数
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
---|
此时即是进位,CF位存储的值为1,显示CY
当两个8位的二进制数
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
---|
减去
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
---|
此时会向更高位借位,得到一个8位的二进制数
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
此时即是借位,CF位存储的值为1,显示CY
0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
---|
和
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
---|
相加时,最高位相加会向更高一位进位,得到一个8位的二进制数
1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
---|
则CF位存储的值为0,显示NC
OF标志寄存器
处于FLAGS寄存器的第11位上,是溢出标志位,负责记录有符号数运算的结果是否发生了溢出,如果发生了溢出,OF存储的值为1,显示OV;如果没有发生溢出,OF存储的值为0,显示NV.
对于无符号数而言,运算结果超出了原寄存器的存储范围,称为进位,
对于有符号数而言,运算结果超出了原寄存器的存储范围,称为溢出。
DF寄存器
处于FLAGS寄存器的第10位上,是方向标志位,在串处理指令中,它控制每次操作后SI、DI的增减变化。
当DF = 0 时,每次操作后SI、DI递增。
当DF = 1 时,每次操作后SI、DI递减。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/99835.html