鱼C论坛

 找回密码
 立即注册
查看: 3416|回复: 10

10.8 mul习题 求解释

[复制链接]
发表于 2011-3-1 14:45:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
视频51小甲鱼叫做的一个习题 我怎么用DEBUG调试 7和8的结果怎么不对呢??

编程计算DATA段中 第一组数据的3次方,结果保留在后面一组dword单元中

assume cs:code
data segment
dw  1,2,3,4,5,6,7,8
dw  0,0,0,0,0,0,0,0
data ends

code segment
start:mov ax,data
       mov ds,ax
           mov si,0
           mov di,16
          
          
           mov cx,8
         s:mov bx,ds:[si]
           call s1
           mov ds:[di],ax
           mov ds:[di+1],dx
          
           add si,2
           add di,2
           loop s
          
           mov ax,4c00h
           int 21h
          
          s1:mov ax,bx
         mul bx
         mul bx
         
                 ret                 
code ends
end start

7 8不对

7 8不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-3-1 22:29:08 | 显示全部楼层
mov ds:[di],al
mov ds:[di+1],ah
试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-3-1 22:37:08 | 显示全部楼层
本帖最后由 china0008 于 2011-3-1 22:41 编辑
  1. assume cs:code
  2. data segment
  3. dw  1,2,3,4,5,6,7,8
  4. dw  0,0,0,0,0,0,0,0
  5. data ends

  6. code segment
  7. start:mov ax,data
  8.        mov ds,ax
  9.        mov si,0

  10.        mov bx,0
  11.            mov cx,8
  12. s:           mov bl,ds:[si]
  13.        call s1
  14.        mov ds:[si+16],ax      
  15.        add si,2
  16.        loop s
  17.            
  18.        mov ax,4c00h
  19.        int 21h
  20.            
  21.       s1:mov ax,bx
  22.          mul bl
  23.          mul bl         ret                 
  24. code ends
  25. end start
复制代码
给你做了答案  其实你的思路是对的,说明你学懂了。但是忽略的 长度相关的问题。具体看我这里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-3-1 22:38:48 | 显示全部楼层
你的问题主要在  s1:  子程序   mul bx  这里乘数16为。导致结果是32位。高位在dx,低位在ax。看你原来的保存结果的源码 你把32位的结果写到了 24位的范围了,结果自然一片混乱。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-3-1 22:39:01 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-3-1 22:46:26 | 显示全部楼层



这样存在一个隐患。你的s1子程序对dx有影响,就是如果dx中有值,你这样做,你就把dx给丢弃了。  不过对于这个题这样做也是会得到正确结果的。但是思路上不够严密。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-3-1 22:46:54 | 显示全部楼层
mov ds:[di],al
mov ds:[di+1],ah
试试
thrill 发表于 2011-3-1 22:29



    这样存在一个隐患。你的s1子程序对dx有影响,就是如果dx中有值,你这样做,你就把dx给丢弃了。  不过对于这个题这样做也是会得到正确结果的。但是思路上不够严密。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-3-1 22:49:27 | 显示全部楼层
本帖最后由 china0008 于 2011-3-1 23:03 编辑

恩 dx有值的话就也得加上  不过你的输出格式只有16位,我就直接忽略了  有dx也没地方放了

那不如修改他的  s1 子程序 让产生的结果保持16位。  反正最大的数才512 。  16位足够用了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-3-1 23:03:39 | 显示全部楼层
这样存在一个隐患。你的s1子程序对dx有影响,就是如果dx中有值,你这样做,你就把dx给丢弃了。   ...
china0008 发表于 2011-3-1 22:46




请举个列子,本人初学者
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-3-1 23:06:29 | 显示全部楼层
8086的乘法  乘数为16位的时候,积就用32位来保存。  而题目的保存结果的空间是16位的。那你的结果不是要丢弃16位的数据。   根据题目的实际情况。用 8位的乘数就足够了。这样产生的积刚好是16位。正好符合题意。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-3-1 23:33:56 | 显示全部楼层
是这个意思吗?
mov ds:[di],ax    低位
mov ds:[di+2],dx   高位
add di,2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-25 11:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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