嵌入式 C 中嵌套汇编的格式
来源:互联网 发布:造梦西游3瘴气源码 编辑:程序博客网 时间:2024/05/22 03:04
在使用gcc编译的时候,可以在C语言程序中嵌套汇编指令,这样极大的方便在高级语言中使用跟配件相关的指令。
(1) 在gcc中嵌套的汇编指令跟纯汇编文件的语法有一点不一样,在gcc中嵌套指令的格式是固定的:
__asm__(code : output operand list : input operand list : clobber list);
__asm__(汇编语句模板 : 输出部分 : 输入部分 : 破坏描述部分);
其中包括四个部分,每个部分之间使用":"分开
汇编语句模板是汇编命令的字符串,输出部分是需要输出到C变量参数列表,输入部分是需要从C变量输入到ASM汇编的参数列表,破坏描述部分是指执行汇编指令会破坏的寄存器描述。
第一部分是必须写的,后面三部分是可以省略,但是分号":"不能省略!
例如:
__asm__("cli":::);
一个嵌套汇编块里面可以写多条汇编指令,指令之间需要换行符隔开 “\n" 或分号" ; "隔开,如:
__asm__("mrs r0, cpsr \n"
"orr r0, r0, #128\n"
"msr cpsr_c, r0\n"
:
:
:);
(2) 嵌套汇编里面可以访问C语言所定义的变量,可以在输入部分,给汇编指令传递C语言定义的参数,也可以在输出部分把汇编指令中得到的值传递到C语言所定义的变量中。
例如:
{
unsigned long x;
unsigned long temp;
(void) (&temp == &x);
__asm__ __volatile__(
"mrs %0, cpsr \n"
"orr %1, %0, #128 \n"
"msr cpsr_c, %1\n"
: "=r" (x), "=r" (temp)
:
: "memory", "cc");
}
上面代码中,%0 表示第一个参数,%1 表示第二个参数,依此类推,可以得到其它的参数,
这是老版本的gcc的方法了,好像只可以支持到10个参数。新版本的是可以直接在汇编中使用参数名来访问的,不过大部分源码还是使用%0的方法,这里也只看这个方法。
--> "=r" (x), "=r" (temp)
这里是输出的列表,每个参数是以逗号","隔开的,"=r"(x)表示asm中第一个参数的值保存到变量x中;"=r"(temp)表示asm中第二个参数的值保存到变量temp中.
--> 如果是需要输入参数的话,则输入部分,把"="号去除,
unsigned long x;
__asm__ __volatile__(
"msr cpsr_c, %0 \n"
:
: "r" (x)
: "memory", "cc");
上面代码就是把变量x传入到汇编指令当中去,后面的破坏描述符会告诉编译器哪个寄存器被使用了,避免寄存器使用冲突。
(3) "memory"描述符 表示
1.将不重新排序该段内嵌汇编指令与前面的指令。
2.不使用寄存器作为缓存。
- 嵌入式 C 中嵌套汇编的格式
- 嵌入式 C 中嵌套汇编的格式
- 嵌入式汇编的基本格式
- 嵌入式汇编的基本格式
- 嵌入式汇编的基本格式
- 嵌入式中C和汇编的一些技巧
- gnu嵌入式汇编的基本格式
- keil软件中C语言嵌套汇编
- 嵌入式中C和汇编的一些技巧---上海嵌入式(中嵌学院)
- c 语言中插入汇编使用的格式
- Linux C中内联汇编的语法格式及使用方法
- C 语言 嵌套 汇编
- IAR中C内嵌汇编格式
- 嵌入式系统中嵌套Makefile的编写
- AT&T汇编格式及嵌入式汇编
- 汇编与VC (c or c++)之间的嵌套调用
- Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)
- Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)
- source insight 用法
- 如何安装消息队列(MSMQ)
- Android: HttpClient与Webview共享cookies
- 批量替换文本内容-PHP操作文件方法
- android logcat详解及缓存
- 嵌入式 C 中嵌套汇编的格式
- 简化Spring(1)--配置文件
- ASP.NET中的函数集
- timeten安装及配置
- 一个菜鸟对密码学的理解(软件注册加密)
- Windows操作系统设置,快捷键,常用的dos命令
- Editplus常用正则表达式
- MFC中,Release版出错Debug版不出错的一个最常见原因之深入剖析
- 读书笔记 -- 《江湖丛谈》