关于乘法mul问题
assume cs:cod,ds:dada 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-2 12:02
s:
mov bx,ds:
call cube
真的明白了,如果第一次相乘就大于16位,就溢出了
第一次相乘 180*180 = 32400 = 7E90h (还没有溢出)
如果真的要计算 180*180*180 就要改进算法了
180 不是极限 181 也可以 我不想找那个极限了 s:
mov bx,ds:
call cube
mov ds:,ax
mov ds:,dx
add si,2
add di,4
loop s
仔细看,你能明白的 学习 我也觉得奇怪,如果是dw 10000,20000,30000,40000,50000,60000会是什么情况?等会试试 人造人 发表于 2016-1-2 12:02
s:
mov bx,ds:
call cube
没看明白啊
人造人 发表于 2016-1-5 12:02
真的明白了,如果第一次相乘就大于16位,就溢出了
第一次相乘 180*180 = 32400 = 7E90h (还没有溢出)
...
就是算法不行吧,应该算不了大数了
页:
[1]