本文共 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/