鱼C论坛

 找回密码
 立即注册
查看: 1995|回复: 8

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

[复制链接]
发表于 2013-2-26 10:28:01 | 显示全部楼层 |阅读模式
1鱼币
问题是这样的 计算FFFF:0~FFFF:b单元中数据的和,结果存到DX中 我的问题是 小甲鱼说不能直接累加到 DL中 会发生越界进位的问题  要用个中介AX  那为什么AL就不会发生越界呢??有没有人帮我细说说  我这里没听明白 ~~谢谢大家啦

最佳答案

查看完整内容

楼主这个问题问的相当有水平,当初我也在这里卡了很久。来分析一下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 这个逻 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-26 10:28:02 | 显示全部楼层
本帖最后由 L]V[G 于 2013-2-26 16:03 编辑

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


如果按照你的疑问,就会变成:
S:  mov dl,[bx]       ;标号
     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,[bx]   ;(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,[bx]
     adc dh,0
     inc bx
     loop s



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












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

使用道具 举报

发表于 2013-2-26 12:35:15 | 显示全部楼层
因为使用mov dl, ds:[bx]给dl值的吧
直接add dl, ds:[bx]的话dl就越界了。
也许add dx, byte ptr ds:[bx]可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-26 12:59:55 | 显示全部楼层

mov dl,ds:[bx]
mov dh,0
add dx,dx  这样不对么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-26 13:11:08 | 显示全部楼层
dx = dx + dx?这有什么意义?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-26 13:32:31 | 显示全部楼层
跟着学习呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-26 17:22:03 | 显示全部楼层
L]V[G 发表于 2013-2-26 15:53
楼主这个问题问的相当有水平,当初我也在这里卡了很久。来分析一下P116程序5.6的s部分
s:  mov al,
      ...

厉害~~~多谢这位 LVG兄弟!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-27 19:29:20 | 显示全部楼层
我刚看完这一章的视频{:1_1:} 说实话 由于水平有限 2#朋友的解释我没有看明白……我的理解是 由于dx中存放的是累加(注意做的是加法)的内容,所以担心直接用dl会越界的问题;而ax中执行的mov al,[bx]只是每次将[bx]中的内容存储到al中(并没有做加法),所以一定是1个字节的长度最大也只能是FFh,所以不会出现越界的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-3-4 23:31:21 | 显示全部楼层
你只是把要相加的每个数放AL中  相加计算是用  DX 和 AX 完成的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 00:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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