|
发表于 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空间有我的相关资料
|
|