汇编语言中的溢出问题 书上说:执行一下指令:mov al,0f0H add al,78h 后标志寄存器CF=1,OF=0 ...求解释 汇编语言中ADD加法指令的问题

作者&投稿:经皆 (若有异议请与网页底部的电邮联系)
78H即:-136补码。
--就8位数而言,78H是120的补码,并非是-136的补码。
0f0H与78H相加得:168H。
--是的,CF=1,AL=68H。确实没有溢出,也并不是怪怪的。。。
==================
无符号数,用全部的8位数代表数值,运算后,会有9位数。这第9位数,就是CF。
所以我们只看CF即可。
----
有符号数,仅仅后面7位数代表数值,运算后,会有8位数。这第8位数,混进了符号位,符号位的运算又会产生CF。
这样说来,有符号数运算后,出现的进位,要影响两个位:符号位和CF。
CPU的设计者,为此又设计了一个OF,来代表有符号数运算的特征,称为溢出标志位。
我们有了OF,就不用再看CF了。

首先,要明白机器不知道你现在是无符号数运算还是有符号数运算,谁知道,你自己知道(编程的人)
其次,因为机器不知道你是对什么数运算的,它只是按照二进制进行运算,然后相应的进位和溢出,进位和溢出这两个含义,我想进位很好理解就是低位向高位的进位,溢出呢可以看做是数据出错,比如正数和正数相加出现了负数或者负数和负数相加出现正数这都是溢出,这里机器判断溢出的原则就是基于上述原因,也就是说,如果最低位向上有进位,那么CF=1,如果这两个16进制数的符号位出现正(0)加正(0)结果为负(1)或者出现负(1)加负(1)得正(+)时,则认为溢出,此时OF=1
最后,我们讨论为什么CF针对无符号数,OF针对有符号数;这其实也比较好理解,比如对于无符号数来说,既然是无符号数,因此就没有符号这一说,有溢出的含义可以得出对无符号运算溢出不溢出是没关系的,由题目,如果运算是针对无符号数的,则为240(F0H)+120(78H)=360(136H), 进位位CF=1,al=36H,合起来就是136H啦。而如果是有符号数,你也说了是-16(F0)+[-136(78H)]=-152, 这里是负数加负数,符号位为1,没有得到正数,就是没有溢出了,同样正数加正数如果出现符号位为0就没溢出,为1就溢出了,如果是正数(符号位0)加负数(符号位1)就不会出现溢出。
总结,机器只是按二进制加减,最后需要判断进位位还是溢出位就看编程人员心中这个数是有符号数还是无符号是,有符号数判断OF有无溢出(其实就是数据计算有没有出错),如果心中定义的这个数是无符号数,则判断CF是否为1。
说了这些,希望你明白了,呵呵!

提示楼主一下,cpu处理时是不会分有符号和无符号数的,只会在SF,OF,CF中做记录(很久没看汇编了,记得不太清楚是不是只与这三个标志位有关,楼主自己好好看看书哦,看还有没有其他的标志位于此有关),将数据看做是有符号还是无符号数是有写程序的人决定的,如果在做了相关的运算后,你使用SF,OF中的值来处理,那么这个数就被你当做了有符号数在使用,如果你使用的CF中的值来处理,那么这个数就被你当做了无符号数使用。78h为120的补码,-136大于-128,其补码不是8位能表示的
再看你的题目:无符号时:0f0h为240,,78h为120,相加,结果大于255,溢出,所以CF为1
有符号时:0f0h为-16,78h为120,相加,结果为104,没溢出,OF=0,SF=0
把这个弄清楚了楼主就可以去深入的思考下以前学C语言时有符号和无符号数运算结果的那些问题了,为什么会溢出之类的,从汇编的角度很容易就能想清楚C语言中一些比较复杂的问题

因为寄存器的缘故,你要知道 mov al,0f0H add al,78h 中的 al是8位寄存器,是ax中的低8位.... ...
如果是8位,我们知道计算机只能认识0,1,这样计算的话,就是2的8次方(2^8),那就是 0-255 范围!~!
这个0-255的范围是对于无符号来说,如果是有符号位的话.8位中的第7位就充当符号位.那就是 0-127 和 0- 负的127.不过我们来说说无符号位的.因为你的代码就是这样的·!
我先要说明白,因为一个16进制用4个二进制代表的. 比如: 78h = 0111 1000 b
0f0h = 1111 0000 ,你把他们做运算,是不是超出了第7位( 0-7).所以就CF=1,代表进位.OF是代表溢出.
http://wenku.baidu.com/view/dc1d12fb770bf78a6529543c.html 如果还不理解,可以去看看这个.
不过我看你的基础不太好,对于这些符号和无符号的问题,你不懂,我建议你先去看看计算机组成原理前面那一些基础..
不要太浮躁,要把基础打好了,才能慢慢的先前走的·!
基础打牢了,后面比较容易进步~!

对于加法来说:
OF的设置,如果两数符号相同,结果却相反,则OF=1;否则OF=0;(如果两数符号相反,是不会溢出的)。
CF的设置,最高有效位(bit7)向高位进位则为1,否则为0。
所以实际上OF是表示有符号数的溢出,CF是表示无符号数的溢出。
对于非符号数来说,不存在溢出的问题,它的进位就相当于符号数中的溢出。
而对于符号数来说,不存在进位的问题,两个正数相加(或一个正数减一个负数)得到负数,或是两个负数相加得到正数,就是溢出了,一个正数和一个负数相加不可能溢出。
对单字节数来说,0f0H既可以表示无符号数240,也可以表示符号数-16,对add al,78h这样的指令,计算机都是按照无符号数来计算的,只不过会设置CF,OF标志位, 这主要看你后续对计算结果的定义和解释了。
你可以看看这个:http://rabbitzv0116.blog.163.com/blog/static/43363510200991062747308/

1. 设AL=87H,BL=90H,执行指令ADD AL,BL后,AL=(17H),BL=(90H),标志寄存器FLAGS中6个状态标志的值~

这里两个数都是16进制,所以可以直接相加的

ADD AL, BL 的意思是把 AL 和BL的内容相加 ,再把内容给AL,所以首先 BL 的内容不变是( 90H)

90H
+87H

8+9=17=11H
0+7=7H
所以按理说结果AL= 117H
但是16位代码只有 MOV DPTR #XXXX
其他只有8位的.所以取后面两位,就是17


至于标志寄存器请参考
http://wenku.baidu.com/view/39ace96d25c52cc58bd6bed3.html

不是的,虽然算数运算指令主要用来对8位无符号数据进行算术操作,但也同样用于带符号数的。
在加法运算中,若位7有进位,则进位位CY置1,否则清0;若位3有进位,则半进位位AC置1,否则清0。若看作2个带符号数相加,还需判断溢出位OV;若OV为1,表示和数溢出。
例如:A=AEH,R1=81H,执行指令“ADD A,R1”,则操作如下所示。
1 0 1 0 1 1 1 0
+ )1 0 0 0 0 0 0 1
——————————
1 0 0 1 0 1 1 1 1
结果:A=2FH,CY=1,OV=1,AC=0,P=1。
此例中,若把AEH、81H看作无符号数相加,则结果为12FH(在看作无符号数时,不考虑OV位);若将上述2值看作有符号数,则有“2个负数相加得到正数”的错误结论,此时,OV=1,表示有溢出,指出了这一错误。

希望能帮到你。