摘自 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) |