汇编语言程序设计(十一)标志寄存器
作者:互联网
目录
引言
- 8086CPU的标志寄存器有16位,其中存储的信息被称为程序状态字,PSW
- 一般寄存器都是用于存放数据,寄存器中存放的数据有一个完整的意义,标志寄存器则是按位起作用的,即标志寄存器的每一位都有专门的含义,记录特定的信息。
flag寄存器标志位介绍
ZF标志,零标志位
- 是flag寄存器的第6位,它记录相关指令执行后的结果信息:
** 如果结果为0,则ZF=1
** 如果结果不为0,则ZF=0 - 8086CPU指令集中,像add,sub,mul,div,inc,or,and等运算指令,其执行结果是直接影响标志寄存器的
- 像mov,push,pop等传送指令,其操作对标志寄存器没有影响
PF标志,奇偶标志位
- flag寄存器的第2位,它记录指令执行后,结果的所有二进制位中1的个数:
** 如果1的个数是偶数,PF=1
** 如果1的个数的奇数,PF=0
SF标志,符号标志位
- flag寄存器的第7位,它记录指令执行结果的正负信息:
** 结果为负,SF=1
** 结果为正,SF=0 - 我们知道同一个二进制表示可以代表有符号数也可以代表无符号数,因此同一种表示看成无符号数可能是正的,看成有符号数则可能是负的,看成正的或负的不是由计算机决定的,而是由程序员决定的。但是SF标志位将所有的计算结果都当成有符号数运算,因此,如果程序员需要有符号数,那么通过SF标志位可以得知结果的正负,如果程序员需要无符号数运算,那么忽略SF标志位就行了,它已经没了卵用。
CF标志位,进位标志位
- flag寄存器的第0位,它记录了无符号数运算的时候,运算结果的最高有效位向更高位的进位值(加法),或从更高位的借位值(减法)。
OF标志,溢出标志位
- 上边CF标志位记录的是无符号运算的结果信息,这里OF则是有符号运算的结果信息,也就是说,只有有符号运算才有溢出的概念,当有符号数运算结果超出机器表示范围的时候就称为溢出。
- 溢出是对有符号数运算而言的,进位是对无符号数运算而言的,看待问题的角度不同。
- 计算机是分不清有符号还是无符号运算的,当我们将其看成无符号运算时,就看CF位是否产生进位,当我们将其看成有符号运算时,要看OF和SF两个位,来看是否溢出以及结果的符号。
adc指令
- 带进位加法指令,其进行加法运算的时候会加上上一次运算的进位值,即CF标志位的值。
- 格式 adc ax, bx
- 实现功能 (ax) = (ax) + (bx) + CF
- adc指令和add指令配合可以实现更大的的数据加法运算,而不必丢弃进位。
- inc和loop指令不影响CF位的值
sbb指令
- 带借位减法指令,利用了CF位上的借位值
- 格式 sbb ax, bx
- 实现功能 (ax) = (ax) - (bx) - CF
- 利用sbb指令可以对任意大的数据进行减法运算。
cmp指令
- cmp指令功能是做减法,但是不保存减法的结果,而是通过影响标志位来记录下表示的信息。即cmp指令通过做减法运算影响标志位寄存器,标志位寄存器的相关位记录了比较的结果。
- 格式 cmp 操作对象1,操作对象2
- 功能 计算 操作对象1 - 操作对象2,但是不保存结果,仅仅根据计算结果对标志寄存器进行设置。
无符号数比较
有符号数比较
检测比较结果的条件转移指令
- 根据cmp指令的比较结果,来进行跳转工作的指令,即条件转移指令。即条件转移指令通过检测那些被cmp指令影响的标志位来进行相关跳转工作。
根据无符号数比较结果进行转移的条件转移指令
- 这些指令检测ZF、CF的值
根据有符号数比较结果进行转移的条件转移指令
- 这些指令检测SF、OF、ZF的值
DF标志和串传送指令movsb
-
flag的第10位是DF,方向标志位,其作用是在串处理指令中,控制每次操作后si、di的增减。
-
DF=0,每次操作后si,di递增
-
DF=1,每次操作后si,di递减
-
格式:movsb,不需要操作数
-
功能如下:
-
movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器DF位的值,将si和di递增或递减
-
movsb是传送一个字节,如果需要传送一个字,只需要改成movsw
-
rep movsb可以传送任意个字节到任意内存地址处,这里的rep根据循环计数器cx中的值来重复执行后边的movsb指令,由于每次执行后si和di都会递增或递减,因此rep movsb就可以实现(cx)个字符的传送。
-
DF标志位的设置,cld指令设置为0,std指令设置为1
标签:标志,运算,符号,汇编语言,CF,指令,寄存器,程序设计 来源: https://www.cnblogs.com/chkplusplus/p/16313014.html