在c代码中嵌入汇编指令

在c代码中嵌入汇编指令

ID:12614217

大小:29.00 KB

页数:7页

时间:2018-07-18

在c代码中嵌入汇编指令_第1页
在c代码中嵌入汇编指令_第2页
在c代码中嵌入汇编指令_第3页
在c代码中嵌入汇编指令_第4页
在c代码中嵌入汇编指令_第5页
资源描述:

《在c代码中嵌入汇编指令》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、在C代码中嵌入汇编指令标题:在C代码中嵌入汇编指令发信站:BBS水木清华站(FriApr1119:53:302003),转信在C代码中嵌入汇编指令--转贴自21IC中国电子网AVR单片机论坛hudaidai发表于6/27/20025:58:22PM(此文和《如何使用AVRGCC》原来在一起,太长了贴不上。经过我的重新编排以便于初学者参考,在我下载的地方已经原作者不可考了。功劳属于原作者,修改编排后产生的错误由hudaidai负责)在C代码中嵌入汇编指令一.GCC的ASM声明首先看一个从PORTD读入数据的例子:asm("in%0,%1":"=r"(value):"I"(P

2、ORTD):);由上可以看出嵌入汇编的4个部分:1.汇编指令本身,以字符串"in%0,%1"表示;2.由逗号分隔的输出操作数,本例为"=r"(value)3.由逗号分隔的输入操作数,本例为"I"(PORTD)4.Clobber寄存器嵌入汇编的通用格式为:asm(code:outputoperandlist:inputoperandlist:clobberlist);例子中%0表示第一个操作数,%1表示第二个操作数。即:%0->"=r"(value)%1->"I"(PORTD)如果在后续的C代码中没有使用到汇编代码中使用的变量,则优化编译时会将这些语句删除。为了防止这种情况

3、的发生,需要加入volatile属性:asmvolatile("in%0,%1":"=r"(value):"I"(PORTD):);嵌入汇编的的Clobber寄存器部分可以忽略,而其他部分不能忽略,但可以为空。如下例:asmvolatile("cli"::);二.汇编代码用户可以在C代码里嵌入任意的汇编指令,就如同在汇编器里写程序一样。AVR-GCC提供了一些特殊的寄存器名称:符号寄存器__SREG__状态寄存器SREG(0x3F)__SP_H__堆栈指针高字节(0x3E)__SP_L__堆栈指针低字节(0x3D)__tmp_reg__r0__zero_reg__r1。对

4、于C代码而言其值永远为0三.输入/输出操作数约束符号适用于范围ar16~r23b指针Y,Zdr16~r31e指针X,Y,ZG浮点常数0.0I6比特正常数0~63J6比特负常数-63~0lr0~r15M8比特正常数0~255N整数常数-1O整数常数8,16,24P整数常数1rr0~r31tR0W寄存器对r24,r26,r28,r30X指针Xr27:r26Y指针Yr29:r28Z指针Zr31:r30要注意的是,在使用这些约束符号时要防止选择错误。例如,用户选择了"r"约束符号,而汇编语句则使用了"ori"。编译器可以在r0~r31之间任意选择寄存器。若选择了r2~r15,则会

5、由于不适用ori而出现编译错误。此时正确的约束符应该是"d"。约束符号还可以有前置修饰符,如下表所示。修饰符指定=只写操作数+读-写操作数(嵌入汇编不支持)&寄存器只能用做输出输出操作数必须为只写操作数,C表达式结果必须为l(r0~r15)。编译器不检查汇编指令中的变量类型是否合适。输入操作数为只读。如果输入/输出使用同一个寄存器怎么办呢?此时可以在输入操作数的约束字符里使用一个一位数字来达到这个目的。这个数字告诉编译器使用与第n个(从0开始计数)操作数相同的寄存器。例如:asmvolatile("SWAP%0":"=r"(value):"0"(value));这条语句的

6、目的是交换变量value的高低4位。约束符号"0"告诉编译器使用与第一个操作数相同的寄存器作为输入寄存器。要注意的是,即使用户没有指定,编译器也有可能使用相同的寄存器作为输入/输出。在某些情况下会引发严重的问题。如果用户需要区分输入/输出寄存器,则必须为输出操作数增加修饰符"&"。如下例所示。asmvolatile("in%0,%1;out%1,%2":"=&r"(input):"I"(port),"r"(output));此例的目的是读入端口数据,然后给端口写入另一个数据。若编译器不幸使用了同一个寄存器作为参数input和output存储位置,则第一条指令执行后outp

7、ut的内容就被破坏了。而用了修饰符"&"之后,这个问题得以解决。下面为一个高16位与低16位交换的32位数据操作的例子:asmvolatile("mov__tmp_reg__,%A0;mov%A0,%D0;mov%D0,__tmp_reg__;mov__tmp_reg__,%B0;mov%B0,%C0;mov%C0,__tmp_reg__":"=r"(value):"0"(value))"0"代表第一个操作数,"A","B","C","D"表示:31………………2423………………1615………………87…………………0DCB

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。