琼华 发表于 2013-2-26 10:28:01

汇编5.2 LOOP和[bx]的联合应用这节的问题

问题是这样的 计算FFFF:0~FFFF:b单元中数据的和,结果存到DX中 我的问题是 小甲鱼说不能直接累加到 DL中 会发生越界进位的问题要用个中介AX那为什么AL就不会发生越界呢??有没有人帮我细说说我这里没听明白 ~~谢谢大家啦

L]V[G 发表于 2013-2-26 10:28:02

本帖最后由 L]V

楼主这个问题问的相当有水平,当初我也在这里卡了很久。来分析一下P116程序5.6的s部分
s:mov al,
   mov ah,0
   add dx,ax
   inc bx
   loop s
以上这是正确的,


如果按照你的疑问,就会变成:
S:mov dl,       ;标号
   mov dh,0         ;标号      
   add dx,dx                                                                                    
    inc bx
   loop s
这个逻辑上的错误,当执行完第一次后,dx保存的值只是 dx + dx的值,并不是所要求的值
而且在标号处的语句又把dx保存的值给覆盖了
例如:ffff:0 ---ffff:b 内存单元的值 为 1,1,1,1,1,1,1,1,1,1,1,1
                                  执行12次循环, dx的最终值 为:2



下面是我自己举得逻辑正确,但是发生溢出的情况:
   mov dh,0
s:add dl,   ;(dl) = (dl) + (bx)
   inc bx
   loop s      
为什么会发生溢出呢?假设加到某个数的时候,dl的值为 FF,这是8位寄存器能储存的最大数值 (此时dx = 00ff)   
如果我们再循环一次,dl相加的某个数正好是1,那么dl的值为00,此时 bx = 0000!!!原因就是溢出了,那溢出的数到了哪里呢?标志寄存器flag中,此时标志寄存器第0位CF为1(不懂不要紧,这是第十一章的知识,等你学到了自然会了)




以下这个是不用ax作为中转的办法之一,就是视频中以后的办法之一
这个我就不写注释了,这个办法应该行得通
sub dx,dx
s:add dl,
   adc dh,0
   inc bx
   loop s



特别声明:以上代码是我手打的,答案为原创!!用了45分钟解答,调试,我是汇编菜鸟,自学到第十一章,希望楼主可以认真多看几次!!欢迎看到这个回帖的人 交流交流!我的鱼C空间有我的相关资料












七月之变 发表于 2013-2-26 12:35:15

因为使用mov dl, ds:给dl值的吧
直接add dl, ds:的话dl就越界了。
也许add dx, byte ptr ds:可以

琼华 发表于 2013-2-26 12:59:55

七月之变 发表于 2013-2-26 12:35 static/image/common/back.gif
因为使用mov dl, ds:给dl值的吧
直接add dl, ds:的话dl就越界了。
也许add dx, byte ptr ds:可以

mov dl,ds:
mov dh,0
add dx,dx这样不对么?

七月之变 发表于 2013-2-26 13:11:08

dx = dx + dx?这有什么意义?

bafengao 发表于 2013-2-26 13:32:31

跟着学习呀

琼华 发表于 2013-2-26 17:22:03

L]V static/image/common/back.gif
楼主这个问题问的相当有水平,当初我也在这里卡了很久。来分析一下P116程序5.6的s部分
s:mov al,
      ...

厉害~~~多谢这位 LVG兄弟!!

NO.1_SPEED 发表于 2013-2-27 19:29:20

我刚看完这一章的视频{:1_1:} 说实话 由于水平有限 2#朋友的解释我没有看明白……我的理解是 由于dx中存放的是累加(注意做的是加法)的内容,所以担心直接用dl会越界的问题;而ax中执行的mov al,只是每次将中的内容存储到al中(并没有做加法),所以一定是1个字节的长度最大也只能是FFh,所以不会出现越界的问题

小小小小鱼 发表于 2013-3-4 23:31:21

你只是把要相加的每个数放AL中相加计算是用DX 和 AX 完成的
页: [1]
查看完整版本: 汇编5.2 LOOP和[bx]的联合应用这节的问题