有符号和无符号的运算 | 您所在的位置:网站首页 › 数的加法运算定义 › 有符号和无符号的运算 |
《汇编原理》---王爽 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 实验室设备网 版权所有 |