狂飘的白云 发表于 2013-7-22 21:25:27

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

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


(1)
ASSUME        CS:CODESG

CODESG        SEGMENT
START:        MOV        AX,1000H
                MOV        DS,AX
                MOV        AH,DS:
                MOV        BH,DS:
               
                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)
ASSUME        CS:CODESG

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


狂飘的白云 发表于 2013-7-22 21:27:08

两次ADC AH,BH后AH中存放的值为什么不同?一次是AX=0200,一次是AX=0300

Dardy 发表于 2013-7-22 21:35:59

CMP      AH,BH;这个不是交换ah和bh的值,而是比较两都的值,两都的值不会因cmp而改变,但会影响到标志寄存器的值。
ADC 带进位的加法,还会把标志位CF的值也加进去。

狂飘的白云 发表于 2013-7-22 21:42:41

Dardy 发表于 2013-7-22 21:35 static/image/common/back.gif
CMP      AH,BH;这个不是交换ah和bh的值,而是比较两都的值,两都的值不会因cmp而改变,但会影响到标 ...

这个我知道。但是问题是这样的,第一次程序给AH=5600,给BH=AC00,然后进行了 ADC AH,BH
这时候 得出AH=0300存在一个进位。但是第二次程序给AH=AC00,给BH=5600,然后进行了 ADC AH,BH
这时候 得出AH=0200,同样存在一个进位。难道说   ACh+56h不等于56h+ACh?

active 发表于 2013-7-22 21:56:08

进来学习学习

relaxpeng 发表于 2013-7-22 22:08:27

数据段的数据是自己定义还是...

狂飘的白云 发表于 2013-7-22 22:09:48

relaxpeng 发表于 2013-7-22 22:08 static/image/common/back.gif
数据段的数据是自己定义还是...

直接从内存中取值给AH和BH的 。你可以把代码复制过去,自己调试一下,应该也有同样的现象。

relaxpeng 发表于 2013-7-22 22:21:21

狂飘的白云 发表于 2013-7-22 22:09 static/image/common/back.gif
直接从内存中取值给AH和BH的 。你可以把代码复制过去,自己调试一下,应该也有同样的现象。

注意CF的值

relaxpeng 发表于 2013-7-22 22:22:25

狂飘的白云 发表于 2013-7-22 22:09 static/image/common/back.gif
直接从内存中取值给AH和BH的 。你可以把代码复制过去,自己调试一下,应该也有同样的现象。

AH+BH+CY/ AH+BH+NC   

Dardy 发表于 2013-7-22 22:53:52

楼上正解。
你没搞清楚,进位是什么时候产生的,和进位是什么时候被加到和里的。
进位(/借位)是在cmp时产生的。(cmp ah,bh, ah比bh值小时,产生借位,置CF为1,否则置0)
adc加进去的CF值就是cmp时产生的借位,而ADC本句产生的进位(你的代码里一定会产生借位),只会影响后面语句,不会加到ADC这句的和里面。

狂飘的白云 发表于 2013-7-22 23:28:37

Dardy 发表于 2013-7-22 22:53 static/image/common/back.gif
楼上正解。
你没搞清楚,进位是什么时候产生的,和进位是什么时候被加到和里的。
进位(/借位)是在cmp时产 ...

嗯,这回清楚了,谢谢了!

狂飘的白云 发表于 2013-7-22 23:29:30

relaxpeng 发表于 2013-7-22 22:21 static/image/common/back.gif
注意CF的值

嗯,看到了,这回明白了

沉默的风采 发表于 2013-7-24 07:57:34

看了答案,原来如此。

a02201023 发表于 2013-7-24 08:37:03

原来如此{:1_1:}

qiusuo 发表于 2013-7-24 08:53:56

原来如此 学习了
页: [1]
查看完整版本: 大家看看,为什么相同的程序,执行结果不同?