汇编语言程序设计(十一)标志寄存器

2022/5/27 1:22:30

本文主要是介绍汇编语言程序设计(十一)标志寄存器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 引言
  • flag寄存器标志位介绍
    • ZF标志,零标志位
    • PF标志,奇偶标志位
    • SF标志,符号标志位
    • CF标志位,进位标志位
    • OF标志,溢出标志位
  • adc指令
  • sbb指令
  • cmp指令
    • 无符号数比较
  • 有符号数比较
  • 检测比较结果的条件转移指令
    • 根据无符号数比较结果进行转移的条件转移指令
    • 根据有符号数比较结果进行转移的条件转移指令
  • DF标志和串传送指令movsb

引言

  • 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



这篇关于汇编语言程序设计(十一)标志寄存器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程