有符号和无符号的运算 您所在的位置:网站首页 数的加法运算定义 有符号和无符号的运算

有符号和无符号的运算

2024-06-04 07:17| 来源: 网络整理| 查看: 265

《汇编原理》---王爽

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--王爽



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有