汇编减法指令产生借位时是如何实现让CF置1的? 10

已经知道计算机里只有加法器,没有减法器。减法是化作补码的加法运算来实现的。那么做减法运算时借位标志CF是否被置1,应该是根据操作数的补码的加法运算结果是否产生进位来决定的... 已经知道计算机里只有加法器,没有减法器。减法是化作补码的加法运算来实现的。那么做减法运算时借位标志CF是否被置1,应该是根据操作数的补码的加法运算结果是否产生进位来决定的。
然后我发现一个奇怪的问题,汇编指令如下:
CLC (清空CF,CF=0)
MOV DX,8234H
MOV AX,01EEH (AX=01EEH , CF=0)
SUB AX,4491H (AX=BD5DH , CF=1)
SBB DX,8000H (DX=1468H , CF=0)

然后我按照模拟计算机里的补码运算来操作了一便。
01EEH化成二进制为:0000 0001 1110 1110
4491H化成二进制为:0100 0100 1001 0001
上面两个都是真值,按照补码运算原理,X-Y = X + [-Y]补。
所以0000 0001 1110 1110的原码为 0000 0001 1110 1110,补码为 0000 0001 1110 1110
-0100 0100 1001 0001的原码为 1100 0100 1001 0001,补码为 1011 1011 0110 1111。
所以01EEH-4491H在计算机的运算是如下的补码运算:
0000 0001 1110 1110
+ 1011 1011 0110 1111
------------------------
1011 1101 0101 1101
结果确实是BD5DH,但问题也随之来了,这个运算结果的最高位并没有产生进位,也就是CF标志位并没有被置1。那上面汇编语句里的倒数第二句括号里的注释却是CF=1。当然理论上01EEH-4491H确实要借位(CF要被置1),但按上面运算过程来看,CF却没有被置1。那实际过程中CF里的哪个1到底是怎么弄上去的呢?小弟水平有限,麻烦哪位民间高手解我疑惑?(说明一下,上面的汇编语句没有问题)
展开
 我来答
做而论道
高能答主

2014-01-01 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:8317万
展开全部
当CPU计算的时候,并不是按照补码的。

只是按照一般的二进制数字进行计算。
--------
把机器数,看成补码,这只是人的想法。

把负数求补码的时候,按照其定义式,就是用《模》减去《负数的绝对值》。
这里面,就平白的多了一个模。
(你不要想着用求反加一来求补码。这种方法也对,但是掩盖真相。)

所以,用补码来计算,就会差了一个进位。
这个进位,就是求补码时加进去的模。
谭子腾4
2014-01-11 · TA获得超过499个赞
知道答主
回答量:113
采纳率:100%
帮助的人:38.3万
展开全部
已经知道计算机里只有加法器,没有减法器。减法是化作补码的加法运算来实现的。那么做减法运
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
锅巴配番茄
2014-01-11
知道答主
回答量:51
采纳率:33%
帮助的人:13.1万
展开全部
fbhguiuyhh idthisry
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式