骇客king 发表于 2016-1-1 09:35:56

关于乘法mul问题

assume cs:cod,ds:da

da segment
        dw 1,2,3,4,5,6,7,8
        dd 0,0,0,0,0,0,0,0
da ends

cod segment
start:
        mov ax,da
        mov ds,ax
        mov si,0
        mov di,16
        mov cx,8
       
       
        s:
        mov bx,ds:
        call cube
        mov ds:,ax
        mov ds:,dx
        add si,2
        add di,4
        loop s
       
        mov ax,4c00h
        int 21h
       
       
        cube:
        mov ax,bx
        mul bx
        mul bx
        ret
cod ends

end start

大家看这个程序的这个部分
mov ax,bx
        mul bx
        mul bx

这是一个计算三次方的子程序,结果放在ax,dx中,但是如果第一次相乘结果就大于16位,那就是ax,dx中都有数据,然后再mul bx,就是ax乘以bx,那dx中的数据等于就被忽略了,是不是是错误的了

人造人 发表于 2016-1-1 09:35:57

人造人 发表于 2016-1-2 12:02
s:
      mov bx,ds:
      call cube


真的明白了,如果第一次相乘就大于16位,就溢出了
第一次相乘 180*180 = 32400 = 7E90h (还没有溢出)
如果真的要计算 180*180*180 就要改进算法了
180 不是极限 181 也可以 我不想找那个极限了

人造人 发表于 2016-1-2 12:02:30

s:
      mov bx,ds:
      call cube
      mov ds:,ax
      mov ds:,dx
      add si,2
      add di,4
      loop s
仔细看,你能明白的

ufo9876 发表于 2016-1-3 15:45:35

学习

yundi 发表于 2016-1-5 11:49:38

我也觉得奇怪,如果是dw 10000,20000,30000,40000,50000,60000会是什么情况?等会试试

骇客king 发表于 2016-1-7 16:44:53

人造人 发表于 2016-1-2 12:02
s:
      mov bx,ds:
      call cube


没看明白啊

骇客king 发表于 2016-1-7 16:45:24

人造人 发表于 2016-1-5 12:02
真的明白了,如果第一次相乘就大于16位,就溢出了
第一次相乘 180*180 = 32400 = 7E90h (还没有溢出)
...

就是算法不行吧,应该算不了大数了
页: [1]
查看完整版本: 关于乘法mul问题