请大家帮我看下这个问题,我想向代码中输入两个变量,可是发现无法输入,他实际运行总是输出第一个参数,不知道为什么,下面是我的程序
#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