Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117158
  • 博文数量: 24
  • 博客积分: 1411
  • 博客等级: 上尉
  • 技术积分: 261
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-07 17:49
文章分类

全部博文(24)

文章存档

2009年(24)

我的朋友

分类:

2009-08-21 08:24:39

摘自  08homework5 

在Y86上实现 unsigned int 相乘,结果为 unsigned int

两个无符号数相乘,比如X×Y。

我们假设X的二进制值为 10111, Y值任意
10111 即为 (((1*2 + 0)*2 + 1)*2 + 1)*2 + 1
则 X×Y = ((((1*2 + 0)*2 + 1)*2 + 1)*2 + 1) * Y 

所以从低到高逐位扫描X,遇到1则把结果加上Y(遇到0则不动作);再将Y自乘2(相当于自加一次)。

此算法的复杂度为logN,相当高效的算法了。

#Execution begins at address 0
    .pos     0
Init:
    irmovl    Stack,%esp   
    irmovl    Stack,%ebp   
    jmp    Main
    
Multiply:
    pushl    %ebp
    rrmovl    %esp,%ebp
    pushl    %ebx        #save ebx
    pushl    %esi        #saveesi
    mrmovl    8(%ebp),%ecx    #get x
    mrmovl    12(%ebp),%edx    #get y
    irmovl    $0,%eax     #z := 0
    irmovl    $1,%ebx     #mask := 1
    rrmovl    %ebx,%esi     #store mask in tmp
    subl     %ecx,%esi
    jg    done
loop:
    rrmovl    %ecx,%esi    #store mask in tmp
    andl    %ebx,%esi    #if(x&mask)
    je    next
    addl    %edx,%eax    #z:=z+y
    next:
    addl    %ebx,%ebx    #mask=mask*2
    addl    %edx,%edx    #y=y*2
    rrmovl    %ebx,%esi    #store mask in tmp
    subl    %ecx,%esi    #ebx
    jle    loop
done:
    popl    %esi        #restore esi
    popl    %ebx        #restore ebx
    rrmovl    %ebp,%esp
    popl    %ebp
    ret

Main:
    irmovl    $3,%esi        #push arguments
    pushl    %esi
    irmovl    $5,%esi
    pushl    %esi
    call    Multiply    #mulitply(5,3)
    halt

    .pos    0x100
Stack:      



需要注意的是,最后的Stack之后必须有一行空行,否则init会报错说找不到label


................................................................................
备忘
阅读(1667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~