汇编5.2 LOOP和[bx]的联合应用这节的问题
问题是这样的 计算FFFF:0~FFFF:b单元中数据的和,结果存到DX中 我的问题是 小甲鱼说不能直接累加到 DL中 会发生越界进位的问题要用个中介AX那为什么AL就不会发生越界呢??有没有人帮我细说说我这里没听明白 ~~谢谢大家啦本帖最后由 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空间有我的相关资料
因为使用mov dl, ds:给dl值的吧
直接add dl, ds:的话dl就越界了。
也许add dx, byte ptr ds:可以 七月之变 发表于 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这样不对么? dx = dx + dx?这有什么意义? 跟着学习呀 L]V static/image/common/back.gif
楼主这个问题问的相当有水平,当初我也在这里卡了很久。来分析一下P116程序5.6的s部分
s:mov al,
...
厉害~~~多谢这位 LVG兄弟!! 我刚看完这一章的视频{:1_1:} 说实话 由于水平有限 2#朋友的解释我没有看明白……我的理解是 由于dx中存放的是累加(注意做的是加法)的内容,所以担心直接用dl会越界的问题;而ax中执行的mov al,只是每次将中的内容存储到al中(并没有做加法),所以一定是1个字节的长度最大也只能是FFh,所以不会出现越界的问题 你只是把要相加的每个数放AL中相加计算是用DX 和 AX 完成的
页:
[1]