博客
关于我
有符号和无符号的运算--标志寄存器(8086)
阅读量:517 次
发布时间:2019-03-07

本文共 2329 字,大约阅读时间需要 7 分钟。

《汇编原理》---王爽

CPU内部有一个16位标志寄存器,但只有个别位有意义:

1)用来存储相关指令的某些执行结果;

2)用来为CPU执行相关指令提供依据;

3)用来控制CPU的相关工作方式;

 

1.ZF标志位------0标志位

记录相关指令执行之后,其结果是否为0。为0,则ZF=1;不为0,则ZF=0。

 

2.PF标志位-----奇偶标志位

如果有奇数个1,则PF=0;如果有偶数个1,则PF=1;

 

3.SF标志位----符号标志位。

这个标志位对我理解有无符号起了至关重要的作用。如果结果为负,则SF=1;如果结果为正,则SF=0。

计算机中通常用补码表示有符号数据。计算机中的一个数据既可以看做有符号数,也可以看做无符号数。

比如00000001B,可以看做无符号数1,也可以看做有符号数+1;

10000001B,可以看做无符号数129,也可以看做有符号数-127;

计算机在执行加减运算的时候,不区分有符号数和无符号数,但是会在标志位上有所体现。CPU在执行add等指令的时候就已经包含了两层含义:1)你看做是无符号数,我就是无符号加法;2)你看做是有符号数,我就是有符号加法。至于你想要哪种运算结果,还需要关注    进位标志位CF  和  溢出标志位。会在后面进行介绍

1)如果进行的是无符号运算,SF标志位无意义;

2)有符号运算。如果SF=1,表示结果为负;如果SF=0,表示结果为正。

 

4.CF标志位-----进位,仅针对无符号运算,记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。

本来是没有办法保存最高位的进位值的,但是他可以把最高位的进位值保存在这里。对于N位数据来讲,最高位是第N-1位,但是现在标志位相当于假想的第N位。

例如:8位数据,98h+98h,产生进位,CF=1。这个进位值在8位数据中无法保存,但CPU并不会丢弃,可以在标志位保存。在后面相关计算时会用到这个标志位。

当两个数据做减法时,有可能向更高位借位。

比如:8位数据,97h-98h,产生借位,相当于计算197H-98h,而CF会标记这个借位值。

 

5.OF标志位-------溢出,仅针对有符号数的运算。

例如对于8位有符号数据,他的数据范围是-128~127。如果计算98+99应该是197,但是因为数据溢出,导致98+99=-59。(本来如果作为无符号数,它是可以放得下的;但是作为有符号数,它是放不下的。)

因此CPU需要对指令执行之后是否溢出进行记录。如果发生溢出,则OF=1;如果没有发生溢出,则OF=0。

至此为止,有/无符号的运算就直接涉及到3个寄存器了SF(符号位)、CF(进位)、OF(溢出)。

前面讲到add指令在执行的时候有两层含义。然后用各标志位区分。

1)有符号运算。SF记录正负,OF关心溢出,CF无意义。

2)无符号运算。SF无意义,OF无意义,关心CF的溢出。

例如:mov  al,0F0H        ;-16的补码

          add   al,88H          ;-120的补码

指令结束以后al=120,CF=1,OF=1,SF=0  对于无符号数运算,关心CF有进位;对于有符号数运算,关心OF有溢出。现有的结果为120是错误的。

CF和OF所表示的进位和溢出,是分别对无符号数和有符号数运算而言的,他们两个没有任何关系。

--------------------------------------------------------------------------------------------------------------------------------------------------------

相关指令     adc---借位加法;sbb---借位减法;cmp---比较;je....---条件转移指令;DF标志和串传送指令

--------------------------------------------------------------------------------------------------------------------------------------------------------

1.adc指令

格式: adc   操作对象1,操作对象2

功能:操作对象1=操作对象1+操作对象2+CF;

【例如】:adc   ax,bx  实现的功能是:(ax)=(ax)+(bx)+CF;

在执行adc指令的时候加上的CF值含义,是由adc前面的指令决定的。即,如果CF的值是被sub指令设置的,那么他就是借位值;如果是被add指令设置的,那么它的含义就是进位值。

adc指令和add指令相配合就可以对更大的数据进行计算。

【例如】1EF000H+201000H。结果放在ax(高16位)和bx(低16位)中。

因为数据大于16位,无法用add计算;因此我们可以分两步走,首先将低16位相加,然后将高16位和进位值相加。

程序如下:

                mov    ax,001EH

                mov    bx,F000H

                add    bx,1000H

                adc    ax,0020H

这样就可以对任意大的的数据进行加法运算。

2.sbb指令

sbb是带借位减法指令,它利用了CF位上的借位值

格式: sbb    操作对象1,操作对象2

功能:操作对象1=操作对象1-操作对象2-CF;

3.cmp指令

cmp是比较指令,指令结束后对标志寄存器产生影响。

cmp:cmp    操作对象1,操作对象2

功能:计算操作对象1-操作对象2但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。

后面的详见《汇编原理》P223--王爽

转载地址:http://apwnz.baihongyu.com/

你可能感兴趣的文章
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>
MySql中 delimiter 详解
查看>>
MYSQL中 find_in_set() 函数用法详解
查看>>
MySQL中auto_increment有什么作用?(IT枫斗者)
查看>>
MySQL中B+Tree索引原理
查看>>
mysql中cast() 和convert()的用法讲解
查看>>
mysql中datetime与timestamp类型有什么区别
查看>>
MySQL中DQL语言的执行顺序
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>