大家看看,为什么相同的程序,执行结果不同?
同一个程序,两次的不同之处只是交换了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
两次ADC AH,BH后AH中存放的值为什么不同?一次是AX=0200,一次是AX=0300 CMP AH,BH;这个不是交换ah和bh的值,而是比较两都的值,两都的值不会因cmp而改变,但会影响到标志寄存器的值。
ADC 带进位的加法,还会把标志位CF的值也加进去。 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? 进来学习学习 数据段的数据是自己定义还是... relaxpeng 发表于 2013-7-22 22:08 static/image/common/back.gif
数据段的数据是自己定义还是...
直接从内存中取值给AH和BH的 。你可以把代码复制过去,自己调试一下,应该也有同样的现象。 狂飘的白云 发表于 2013-7-22 22:09 static/image/common/back.gif
直接从内存中取值给AH和BH的 。你可以把代码复制过去,自己调试一下,应该也有同样的现象。
注意CF的值 狂飘的白云 发表于 2013-7-22 22:09 static/image/common/back.gif
直接从内存中取值给AH和BH的 。你可以把代码复制过去,自己调试一下,应该也有同样的现象。
AH+BH+CY/ AH+BH+NC 楼上正解。
你没搞清楚,进位是什么时候产生的,和进位是什么时候被加到和里的。
进位(/借位)是在cmp时产生的。(cmp ah,bh, ah比bh值小时,产生借位,置CF为1,否则置0)
adc加进去的CF值就是cmp时产生的借位,而ADC本句产生的进位(你的代码里一定会产生借位),只会影响后面语句,不会加到ADC这句的和里面。 Dardy 发表于 2013-7-22 22:53 static/image/common/back.gif
楼上正解。
你没搞清楚,进位是什么时候产生的,和进位是什么时候被加到和里的。
进位(/借位)是在cmp时产 ...
嗯,这回清楚了,谢谢了! relaxpeng 发表于 2013-7-22 22:21 static/image/common/back.gif
注意CF的值
嗯,看到了,这回明白了 看了答案,原来如此。 原来如此{:1_1:} 原来如此 学习了
页:
[1]