鱼C论坛

 找回密码
 立即注册
查看: 2434|回复: 14

大家看看,为什么相同的程序,执行结果不同?

[复制链接]
发表于 2013-7-22 21:25:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
同一个程序,两次的不同之处只是交换了AH  BH中的值,但是相加后结果却不同,这是为什么?


(1)
ASSUME        CS:CODESG

CODESG        SEGMENT
START:        MOV        AX,1000H
                MOV        DS,AX
                MOV        AH,DS:[0]
                MOV        BH,DS:[3]
               
                CMP        AH,BH
                JE        OK
                JNE        OK1
               
        OK:        ADC        AH,AH
        OK1:ADC        AH,BH
               
                MOV        AX,4C00H
                INT        21H
CODESG        ENDS
END         START

2.jpg


(2)
ASSUME        CS:CODESG

CODESG        SEGMENT
START:        MOV        AX,1000H
                MOV        DS,AX
                MOV        AH,DS:[3]
                MOV        BH,DS:[0]
               
                CMP        AH,BH
                JE        OK
                JNE        OK1
               
        OK:        ADC        AH,AH
        OK1:ADC        AH,BH
               
                MOV        AX,4C00H
                INT        21H
CODESG        ENDS
END         START


1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-22 21:27:08 | 显示全部楼层
两次  ADC AH,BH后  AH中存放的值为什么不同?一次是AX=0200,一次是AX=0300
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-22 21:35:59 | 显示全部楼层
CMP        AH,BH  ;这个不是交换ah和bh的值,而是比较两都的值,两都的值不会因cmp而改变,但会影响到标志寄存器的值。
ADC 带进位的加法,还会把标志位CF的值也加进去。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-22 21:42:41 | 显示全部楼层

这个我知道。但是问题是这样的,第一次程序给AH=5600,给BH=AC00,然后进行了 ADC AH,BH
这时候 得出AH=0300  存在一个进位。  但是第二次程序给AH=AC00,给BH=5600,然后进行了 ADC AH,BH
这时候 得出AH=0200,同样存在一个进位。难道说   ACh+56h不等于56h+ACh?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-22 21:56:08 | 显示全部楼层
进来学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-22 22:08:27 | 显示全部楼层
数据段的数据是自己定义还是...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-22 22:09:48 | 显示全部楼层
relaxpeng 发表于 2013-7-22 22:08
数据段的数据是自己定义还是...

直接从内存中取值给AH和BH的 。  你可以把代码复制过去,自己调试一下,应该也有同样的现象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-22 22:21:21 | 显示全部楼层
狂飘的白云 发表于 2013-7-22 22:09
直接从内存中取值给AH和BH的 。  你可以把代码复制过去,自己调试一下,应该也有同样的现象。

注意CF的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-22 22:22:25 | 显示全部楼层
狂飘的白云 发表于 2013-7-22 22:09
直接从内存中取值给AH和BH的 。  你可以把代码复制过去,自己调试一下,应该也有同样的现象。

AH+BH+CY  / AH+BH+NC   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-22 22:53:52 | 显示全部楼层
楼上正解。
你没搞清楚,进位是什么时候产生的,和进位是什么时候被加到和里的。
进位(/借位)是在cmp时产生的。(cmp ah,bh  , ah比bh值小时,产生借位,置CF为1,否则置0)
adc加进去的CF值就是cmp时产生的借位,而ADC本句产生的进位(你的代码里一定会产生借位),只会影响后面语句,不会加到ADC这句的和里面。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-22 23:28:37 | 显示全部楼层
Dardy 发表于 2013-7-22 22:53
楼上正解。
你没搞清楚,进位是什么时候产生的,和进位是什么时候被加到和里的。
进位(/借位)是在cmp时产 ...

嗯,这回清楚了,谢谢了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-22 23:29:30 | 显示全部楼层

嗯,看到了,这回明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-24 07:57:34 | 显示全部楼层
看了答案,原来如此。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-24 08:37:03 | 显示全部楼层
原来如此{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-24 08:53:56 | 显示全部楼层
原来如此 学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 16:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表