2014年3月23日日曜日

ARMのgccでインラインアセンブラをするとき、変数を代入するやり方

akira@dynabookAZ:~/arm1403$ cat add1.c
#include <stdio.h>

int fadd(int x,int y);

main(){
   int a,b,c;
   a=fadd(3,5);
   printf("a=%d\n",a);

}


int fadd(int x,int y){
   int ret;
   ret=x+y;
   return ret;
}


akira@dynabookAZ:~/arm1403$ gcc -o add1 add1.c
akira@dynabookAZ:~/arm1403$ ./add1
a=8
akira@dynabookAZ:~/arm1403$ cat add2.c
#include <stdio.h>

int fadd(int x,int y);

main(){
   int a,b,c;
   a=fadd(13,25);
   printf("a=%d\n",a);

}


int fadd(int x,int y){
   int ret;
   asm("ldr r1,%0"::"g"(x));
   asm("ldr r2,%0"::"g"(y));
   asm("add r1,r1,r2");
   asm("mov %0,r1":"=g"(ret));
   return ret;
}


akira@dynabookAZ:~/arm1403$ gcc -o add2 add2.c
akira@dynabookAZ:~/arm1403$ ./add2
a=38
akira@dynabookAZ:~/arm1403$