make又不熟悉。。。。
16x16位:
int main (int argc,char* argv[])
{
unsigned short a,b;
unsigned long r;
a=argc;
b=argc+1;
r=a*b;
//asm { }
return r;
}
汇编结果:
cat uumul-16x16.s
.file "uumul.c"
gcc2_compiled.:
.globl __main
.text
.align 2
.globl main
.type main,@function
main:
link.w %a6,#-8
jsr __main
move.w 10(%a6),-2(%a6)
move.w 10(%a6),%d0
addq.w #1,%d0
move.w %d0,-4(%a6)
move.w -2(%a6),%d0
mulu.w -4(%a6),%d0
move.l %d0,-8(%a6)
move.l -8(%a6),%d1
move.l %d1,%d0
jbra .L2
.align 2
.L2:
unlk %a6
rts
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)"
32x32位:
int main (int argc,char* argv[])
{
unsigned long a,b;
unsigned long long r;
a=argc;
b=argc+1;
r=a*b;
//asm { }
return r;
}
汇编结果:
cat uumul-32x32.s
.file "uumul.c"
gcc2_compiled.:
.globl __main
.text
.align 2
.globl main
.type main,@function
main:
link.w %a6,#-16
jsr __main
move.l 8(%a6),-4(%a6)
move.l 8(%a6),%d0
addq.l #1,%d0
move.l %d0,-8(%a6)
move.l -4(%a6),%d0
muls.l -8(%a6),%d0
move.l %d0,-12(%a6)
clr.l -16(%a6)
move.l -12(%a6),%d1
move.l %d1,%d0
jbra .L2
.align 2
.L2:
unlk %a6
rts
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)"
c的实现:
#define BN_ULLONG unsigned long long
#define BN_ULONG unsigned long
#define BN_MASK (0xffffffffffffffffL)
#define BN_MASK2 (0xffffffffL)
#define BN_BITS2 32
#define Lw(t) (((BN_ULONG)(t))&BN_MASK2)
#define Hw(t) (((BN_ULONG)((t)>>BN_BITS2))&BN_MASK2)
void mul_add_c (unsigned long a,unsigned long b, unsigned long *c0,unsigned long *c1,unsigned long *c2)
{
unsigned long long t;
unsigned long t1,t2;
t=(BN_ULLONG)a*b;
t1=(BN_ULONG)Lw(t);
t2=(BN_ULONG)Hw(t);
*c0=(*c0+t1)&BN_MASK2; if ((*c0) < t1) t2++;
*c1=(*c1+t2)&BN_MASK2; if ((*c1) < t2) (*c2)++;
}
int main (int argc,char* argv[])
{
unsigned long a,b, c0,c1,c2;
//asm { }
mul_add_c(a,b,c0,c1,c2);
return c2;
}
汇编结果:
more uumul-muladd.s
.file "uumul.c"
gcc2_compiled.:
.text
.align 2
.globl mul_add_c
.type mul_add_c,@function
mul_add_c:
link.w %a6,#-16
move.l 8(%a6),%d0
lea (12,%a6),%a0
move.l %d0,%d1
mulu.l (%a0),%d0:%d1
move.l %d0,-8(%a6)
move.l %d1,-4(%a6)
move.l -4(%a6),-12(%a6)
move.l -8(%a6),%d1
clr.l %d0
move.l %d1,-16(%a6)
move.l 16(%a6),%a0
move.l 16(%a6),%a1
move.l (%a1),%d0
add.l -12(%a6),%d0
move.l %d0,(%a0)
move.l 16(%a6),%a0
move.l (%a0),%d0
cmp.l -12(%a6),%d0
jbcc .L3
addq.l #1,-16(%a6)
.L3:
move.l 20(%a6),%a0
move.l 20(%a6),%a1
move.l (%a1),%d0
add.l -16(%a6),%d0
move.l %d0,(%a0)
move.l 20(%a6),%a0
move.l (%a0),%d0
cmp.l -16(%a6),%d0
jbcc .L4
move.l 24(%a6),%a0
addq.l #1,(%a0)
.L4:
.L2:
unlk %a6
rts
.Lfe1:
.size mul_add_c,.Lfe1-mul_add_c
.globl __main
.align 2
.globl main
.type main,@function
main:
link.w %a6,#-20
jsr __main
move.l -20(%a6),-(%sp)
move.l -16(%a6),-(%sp)
move.l -12(%a6),-(%sp)
move.l -8(%a6),-(%sp)
move.l -4(%a6),-(%sp)
jsr mul_add_c
lea (20,%sp),%sp
move.l -20(%a6),%d1
move.l %d1,%d0
jbra .L5
.align 2
.L5:
unlk %a6
rts
.Lfe2:
.size main,.Lfe2-main
.ident "GCC: (GNU) 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www
.snapgear.com/)"