ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-05-26 12:33:59  阅读:269  来源: 互联网

标签:标志 运算 符号 汇编语言 CF 指令 寄存器 程序设计


目录

引言

  • 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有