C语言中嵌入汇编
来源:网络收集 点击: 时间:2024-07-27以下所说嵌入的汇编都是GUN 的C语言中嵌入ARM汇编。
1)2个参数的内嵌语句
这种形式的汇编用于简单的语句,参数限制输入和输出语法格式如下:
asm(code : output operand list : inputoperand list : clobber list);
汇编和C语句这间的联系是通过上面asm声明中可选的output operand list和input operand list。Clobber list后面再讲。
下面是将C语言的一个整型变量传递给汇编,逻辑左移一位后在传递给C语言的另外一个整型变量。
/* Rotating bits example */
asm(mov %, %, ror#1 : =r (y) : r (x));
每一个asm语句被冒号(:)分成了四个部分。
汇编指令放在第一部分中的“”中间。
mov %, %, ror #1
接下来是冒号后的可选择的output operand list,每一个条目是由一对(方括号)和被他包括的符号名组成,它后面跟着限制性字符串,再后面是圆括号和它括着的C变量。这个例子中只有一个条目。
=r (y)
接着冒号后面是输入操作符列表,它的语法和输入操作列表一样
r (x)
为了增加代码的可读性,你可以使用换行,空格,还有C风格的注释。
asm(mov %, %, ror#1
: =r (y) /* Rotation result. */
: r (x) /* Rotated value. */
: /* No clobbers */
);
在代码部分%后面跟着的是后面两个部分方括号中的符号,它指的是相同符号操作列表中的一个条目。
%表示第二部分的C变量y,%表示三部分的C变量x;
符号操作符的名字使用了独立的命名空间。这就意味着它使用的是其他的符号表。简单一点就是说你不必关心使用的符号名在C代码中已经使用了。在早期的C代码中,循环移位的例子必须要这么写:
asm(mov %0, %1, ror #1 :=r (result) : r (value))
在汇编代码中操作数的引用使用的是%后面跟一个数字,%1代表第一个操作数,%2代码第二个操作数,往后的类推。这个方法目前最新的编译器还是支持的。但是它不便于维护代码
实例代码:

2) 带.s文件的汇编
编译命令:
arm-linux-gcc main.cAsmfile_gnu.s -o mains
main.c
#includestdio.h
extern voidpcm8_2_pcm16(unsigned char* pIn, int nInlen, short* pOut);
extern voidpcm16_2_pcm8(short* pIn, int nInlen,unsigned char* pOut);
int main()
{
unsigned char* pIn=1234;
short pInd;
unsigned char pOutd;
int nInlen=4;
int i = 0;
short pOut;
for(i=0;i4;i++)
printf( 0x%x ,pIn);
printf(\n);
memset((char *)pOut,0,256*2);
memset((char *)pInd,0,256*2);
memset((char *)pOutd,0,256*2);
pcm8_2_pcm16(pIn,nInlen,pOut);
for(i=0;i4;i++)
printf( 0x%x ,pOut);
printf(\n);
memcpy((char *)pInd,(char *)pOut,256*2);
pcm16_2_pcm8(pInd,nInlen,pOutd);
for(i=0;i4;i++)
printf( 0x%x ,pOutd);
printf(\n);
return 0;
}
Asmfile_gnu.s
.text
.global pcm8_2_pcm16
.global pcm16_2_pcm8
#*******************************#
#********* ENCODER 实现将第一个输入参数
#左移8位然后异或0x8000 然后拷贝到第三个参数
#DECODE 取第一个参数所指的数据先异或0x8000
#然后右移8位将数据拷贝到第三个参数
#*******************************
pcm8_2_pcm16:
MOV R6,#0
MOV R7,#0
ENCODER:
LDRB R5,
MOV R8,R5,LSL#8
EOR R9,R8,#0x8000
STRH R9,
ADD R7,R7,#2
ADD R6,R6,#1
SUB R1,R1,#1
CMP R1,#0
BNE ENCODER
B OVER
pcm16_2_pcm8:
MOV R6,#0
MOV R7,#0
DECODE:
LDRH R5,
EOR R8,R5,#0x8000
MOV R9,R8,LSR#8
STRB R9,
ADD R7,R7,#1
ADD R6,R6,#2
SUB R1,R1,#1
CMP R1,#0
BNE DECODE
OVER:
.end
c语言版权声明:
1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。
2、本站仅提供信息发布平台,不承担相关法律责任。
3、若侵犯您的版权或隐私,请联系本站管理员删除。
4、文章链接:http://www.1haoku.cn/art_1014174.html