当前位置: 代码迷 >> 汇编语言 >> 请问ARM- gcc中嵌入汇编--输入参数的有关问题
  详细解决方案

请问ARM- gcc中嵌入汇编--输入参数的有关问题

热度:3457   发布时间:2013-02-26 00:00:00.0
请教ARM-- gcc中嵌入汇编--输入参数的问题
请大家帮我看下这个问题,我想向代码中输入两个变量,可是发现无法输入,他实际运行总是输出第一个参数,不知道为什么,下面是我的程序
#include <stdio.h>
int main()
{
  int ou1=88,ou2=0;
  int in1=22,in2=44;
  __asm__ __volatile__(
    "mov %0,%2\n"
    "mov %1,%3\n"
    :"=r"(ou1),"=r"(ou2)
    :"r"(in2),"r"(in1)     ///不清楚这里为什么没有%2代表in1,%3代表in2;而是都是用%2%3都用第一个来做。
  );
  
  printf("sno ou1=%d,ou2=%d\n",ou1,ou2);
}




还有请大家帮忙下,我想用汇编完成C语言的copy函数,请问下应该如何写,
我的c语言代码如下:
#include <stdio.h>
#include <assert.h>
#define BUF_LEN   64
int c_copy(int *dst,int *src,int len)
{
  int i;
  assert(dst!=NULL &&src!=NULL);
  for(i=0;i<len;i++)
  {
     *dst++=*src++;
  }
   return len; 
}
int asm_copy(int *dst,int *src,int len)
{
   __asm__ __volatile__(
     "ldr r0,[%2] \n"
      "loop:\n"
        。。。。。。。。 //走到这里写不去了,不知道如何写了,应该用ldr命令还是ldm呢,???????
      "subs r0,r0,#1\n"
       "bne loop\n" 
       :"=r"(dst)
       :"r"(src),"r"(len)       
   );
}
int main()
{
   int dstBuf[BUF_LEN],srcBuf[BUF_LEN];
   int i;
   
   for(i=0;i<BUF_LEN;i++)
   {
      srcBuf[i]=i+20; 
   }
   
   c_copy(dstBuf,srcBuf,BUF_LEN);
   
   printf("dstBuf is :");
   for(i=0;i<BUF_LEN;i++)
   {
      printf(" %d",dstBuf[i]);
   }
   printf("\n");
   
    return 0;
}



------解决方案--------------------------------------------------------
看你这语句有点像arm的内联汇编,如果你的环境跟我一样--ubuntu系统--gcc编译器,那么我想你的mov指令写得有些问题:
  __asm__ __volatile__(
    "mov %0,%2\n"
    "mov %1,%3\n"
    :"=r"(ou1),"=r"(ou2)
    :"r"(in2),"r"(in1)     ///不清楚这里为什么没有%2代表in1,%3代表in2;而是都是用%2%3都用第一个来做。
  );

arm-gcc的内联汇编传参,在两个参数的情况下通常是前两个通用寄存器也就是r0,r1。但你这两个mov指令是把r2的内容送到r0,r3的内容送到r1。这传进来的参数没有用到,而且还被覆盖掉了。
修正为:
    "mov %2,%0\n"
    "mov %3,%1\n"
结果为:
sno ou1=44,ou2=22



  相关解决方案