| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 551 人关注过本帖
标题:初学者看王爽的书中关于mul的疑问
只看楼主 加入收藏
livy
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-4-11
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
初学者看王爽的书中关于mul的疑问
书中有一个程序是计算N的3次方的,程序如下
 cube:
           mov ax,bx
(1)      mul bx
(2)      mul bx
           ret
其中bx中保存N
根据书上说的,乘数为16位的,结果默认低位保存在ax中,高位保存在dx中,那么当N较大时,在执行完(1)后,ax、dx中均有数据。
执行(2)时,由于ax中保存的数为一个乘数,而这个乘数只是N的平方的低位,这样算的话怎么可能会得到正确的答案呢?
搜索更多相关主题的帖子: 答案 
2011-04-12 22:03
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:0 
1. 是有这个问题.DX有值的话,OF,CF都会被置位,并且后面还是进行16位计算,原来的DX值被覆盖了
2. 比较大的数可以这么干
程序代码:
-a 0100
0B74:0100 mov  bx,3e8
0B74:0103 mov  ax,bx
0B74:0105 mul  ax
0B74:0107 jnc  0117
0B74:0109 push ax
0B74:010A push dx
0B74:010B pop  ax
0B74:010C mul  bx
0B74:010E mov  cx,ax
0B74:0110 pop  ax
0B74:0111 mul  bx
0B74:0113 add  dx,cx
0B74:0115 jmp  119
0B74:0117 mul  ax
0B74:0119 int  3
0B74:011A
-g

AX=CA00  BX=03E8  CX=3A98  DX=3B9A  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0B74  ES=0B74  SS=0B74  CS=0B74  IP=0119   NV UP EI PL NZ NA PE NC
0B74:0119 CC            INT     3
-

技术问题,请不要以短消息方式提问
2011-04-12 22:49
livy
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-4-11
收藏
得分:0 
版主厉害明白了
不过比如说FFFF的三次方的话,结果为FFFD0002FFFF,这样也超过了范围,是不是在这种情况下需要用内存单元来存储呢?如果是,那么怎么将mul的结果存储地址设置为内存中的某个地址呢?
2011-04-13 22:15
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
楼主说的FFFF^3,这涉及到大数运算,16位CPU无法胜任! 建议使用64位运算。

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-04-13 22:47
wog
Rank: 2
来 自:南昌
等 级:论坛游民
帖 子:33
专家分:31
注 册:2010-10-2
收藏
得分:0 
回复 4楼 ansic
hi^^
现在大家都来汇编这里逛啊

[ 本帖最后由 wog 于 2011-4-14 00:00 编辑 ]
2011-04-13 23:50
zaixuexi
Rank: 12Rank: 12Rank: 12
来 自:上海
等 级:火箭侠
威 望:8
帖 子:858
专家分:3233
注 册:2010-12-1
收藏
得分:20 
程序代码:
    ;0xFFFF * 0xFFFF *0xFFFF = 0xFFFD0002FFFF (6 bytes)

1.  0xFFFF*0xFFFF = 0xFFFE0001

2.  0xFFFE0001 * 0xFFFF
    = (0xFFFE0000 * 0xFFFF) + (0x0001 * 0xFFFF)
    = (0xFFFE * 0xFFFF) * 0x10000 + 0xFFFF
    = (0xFFFD0002) * 0x10000 + 0xFFFF
    = (0xFFFD0002 << 16) + 0xFFFF
    = (dw + dd) + dw

3.  hiword  dw 0
    lodword dd 0
4.
    mov  bx,0ffffh
    mov  ax,bx
    mul  bx
    ;0xFFFF * 0xFFFF = 0xFFFE0001
    ;dx = 0xFFFE ax = 0x0001
    push ax
    push dx
    pop  ax
    ;ax = 0xFFFE
    mul  bx
    ;0xFFFE * 0xFFFF = 0xFFFD0002
    ;dx = 0xFFFD ax = 0x0002
    mov  ds:[hiword],dx
    mov  ds:[lodword+2],ax
    pop  ax
    ;ax = 0x0001
    mul  bx
    ;0x0001 * 0xFFFF = 0xFFFF
    ;dx = 0x0000 ax = 0xFFFF
    add  ds:[lodword],ax
    adc  ds:[lodword+2],dx
5. vc __asm code
图片附件: 游客没有浏览图片的权限,请 登录注册

6. 每个人理解不一样,我这是最粗糙的实现了,呵呵.希望贴出来字能对齐.

技术问题,请不要以短消息方式提问
2011-04-14 00:32
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
回复 6楼 zaixuexi

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-04-14 10:19
快速回复:初学者看王爽的书中关于mul的疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013722 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved