ckzmo 发表于 2011-3-1 14:45:06

10.8 mul习题 求解释

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

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

assume cs:code
data segment
dw1,2,3,4,5,6,7,8
dw0,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:
           call s1
           mov ds:,ax
           mov ds:,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

thrill 发表于 2011-3-1 22:29:08

mov ds:,al
mov ds:,ah
试试

china0008 发表于 2011-3-1 22:37:08

本帖最后由 china0008 于 2011-3-1 22:41 编辑

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

code segment
start:mov ax,data
       mov ds,ax
       mov si,0

       mov bx,0
           mov cx,8
s:           mov bl,ds:
       call s1
       mov ds:,ax      
       add si,2
       loop s
         
       mov ax,4c00h
       int 21h
         
      s1:mov ax,bx
         mul bl
         mul bl         ret               
code ends
end start给你做了答案其实你的思路是对的,说明你学懂了。但是忽略的 长度相关的问题。具体看我这里。

china0008 发表于 2011-3-1 22:38:48

你的问题主要在s1:子程序   mul bx这里乘数16为。导致结果是32位。高位在dx,低位在ax。看你原来的保存结果的源码 你把32位的结果写到了 24位的范围了,结果自然一片混乱。

ckzmo 发表于 2011-3-1 22:39:01

本帖最后由 china0008 于 2011-3-1 22:45 编辑

mov ds:,al
mov ds:,ah
试试
thrill 发表于 2011-3-1 22:29 http://www.fishc.com/dz/images/common/back.gif


问题解决 thanks

china0008 发表于 2011-3-1 22:46:26

问题解决 thanks
ckzmo 发表于 2011-3-1 22:39 http://fishc.com/dz/images/common/back.gif


这样存在一个隐患。你的s1子程序对dx有影响,就是如果dx中有值,你这样做,你就把dx给丢弃了。不过对于这个题这样做也是会得到正确结果的。但是思路上不够严密。

china0008 发表于 2011-3-1 22:46:54

mov ds:,al
mov ds:,ah
试试
thrill 发表于 2011-3-1 22:29 http://fishc.com/dz/images/common/back.gif


    这样存在一个隐患。你的s1子程序对dx有影响,就是如果dx中有值,你这样做,你就把dx给丢弃了。不过对于这个题这样做也是会得到正确结果的。但是思路上不够严密。

thrill 发表于 2011-3-1 22:49:27

本帖最后由 china0008 于 2011-3-1 23:03 编辑

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

那不如修改他的s1 子程序 让产生的结果保持16位。反正最大的数才512 。16位足够用了。

ckzmo 发表于 2011-3-1 23:03:39

这样存在一个隐患。你的s1子程序对dx有影响,就是如果dx中有值,你这样做,你就把dx给丢弃了。   ...
china0008 发表于 2011-3-1 22:46 http://www.fishc.com/dz/images/common/back.gif



请举个列子,本人初学者

china0008 发表于 2011-3-1 23:06:29

8086的乘法乘数为16位的时候,积就用32位来保存。而题目的保存结果的空间是16位的。那你的结果不是要丢弃16位的数据。   根据题目的实际情况。用 8位的乘数就足够了。这样产生的积刚好是16位。正好符合题意。

ckzmo 发表于 2011-3-1 23:33:56

是这个意思吗?
mov ds:,ax    低位
mov ds:,dx   高位
add di,2
页: [1]
查看完整版本: 10.8 mul习题 求解释