转:http://andyhuzhill.github.io/arm/gcc/asm/2012/09/25/gcc-inline-assemly/

在操作系统级的编程中,有时候,C语言并不能完全的使用硬件的功能,这时候就需要嵌入一些汇编代码来实现功能。 有两种方式可以使C语言和assemly语言一起工作,一种是两种语言分开写成两个文件,链接的时候链接成一个文件;另一种就是在C语言中嵌入汇编代码。下面简单介绍一下如何在GCC中嵌入汇编代码。

GCC规定了一个内联汇编的语法,不同硬件平台上的GCC内联汇编几乎都是这样的:

asm(
汇编指令列表
:输出运算符列表
:输入运算符列表
:被更改的资源列表
};

在GCC中插入汇编代码,需要以asm关键字开头,中间四个部分用”:”分隔,如果你嵌入的汇编没有输入输出,或者更改资源,后面三项是可以省略的。

下面以一个实例来说明这个语法:

 1  void test(void)
2 {
3 int tmp;
4 // some code
5 __asm__(
6 " mov r1,%0\n\t"
7 :
8 : "r" (tmp)
9 : "r1"
10 );
11
12 }
13

以上代码的意思就是,将tmp变量的值赋给r1寄存器,%0代表出现在输入运算符列表和输出运算符列表中的第一个值,%1,%2依次类推。由于我们自己的汇编代码改变了r1的值,所以我们要通知GCC编译器,r1的值被我们改变了, 在 “r” (tmp) 表达式中,tmp代表C语言输入到汇编中的变量,”r”代表tmp会通过一个寄存器传递。可以使用的符号有以下几种:

                 表1 GCC4内联汇编操作符节选
操作符 含义
r 通用寄存器R0~R15
m 一个有效内存地址
l 数据处理指令中的立即数
X 被修饰的操作符只能作为输出

上面一个代码是将C语言的值传递到汇编代码中,也可以将汇编代码输出的结果传给C代码:

 1     void test(void)
2 {
3 int tmp;
4 __asm__(
5 "mov %0, #1\n\t"
6 : "=r" (tmp)
7 :
8 );
9 }
10

这段代码的意思是,将立即数1赋给变量tmp。 与上面不同的是,输入运算符列表移到了输出运算符列表,”r”前面也多了一个等于号。这个等号被称为约束修饰符,以下是几种修饰符的含义列表:

            表2  GCC4中内联汇编修饰符
修饰符 说明
被修饰的操作符是只读的
= 被修饰的操作符只写
+ 被修饰的操作符具有可读写的属性
& 被修饰的操作符只能作为输出

ARM体系下的GCC内联汇编的更多相关文章

  1. ARM嵌入式开发中的GCC内联汇编__asm__

    在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择.但如果完全通过汇编代码实现,又会过于复杂.难以调试.因此,C语言内嵌汇编的方式 ...

  2. 推荐一篇讲arm架构gcc内联汇编的文章

    这是来自ethernut网站的一篇文章,原文链接: http://www.ethernut.de/en/documents/arm-inline-asm.html 另外,据说nut/os是个不错的开源 ...

  3. 最牛X的GCC 内联汇编

    导读 正如大家知道的,在C语言中插入汇编语言,其是Linux中使用的基本汇编程序语法.本文将讲解 GCC 提供的内联汇编特性的用途和用法.对于阅读这篇文章,这里只有两个前提要求,很明显,就是 x86 ...

  4. GCC内联汇编入门

    原文为GCC-Inline-Assembly-HOWTO,在google上可以找到原文,欢迎指出翻译错误. 中文版说明 由于译者水平有限,故译文出错之处,还请见谅.C语言的关键字不译,一些单词或词组( ...

  5. [翻译] GCC 内联汇编 HOWTO

    目录 GCC 内联汇编 HOWTO 原文链接与说明 1. 简介 1.1 版权许可 1.2 反馈校正 1.3 致谢 2. 概览 3. GCC 汇编语法 4. 基本内联 5. 扩展汇编 5.1 汇编程序模 ...

  6. 汇编语言---GCC内联汇编

    转:http://www.cnblogs.com/taek/archive/2012/02/05/2338838.html GCC支持在C/C++代码中嵌入汇编代码,这些代码被称作是"GCC ...

  7. GCC 内联汇编(GCC内嵌ARM汇编规则)

    转:http://smileleeboo.howbbs.com/posts/list/3127/81062.html 更多文档参见:http://pan.baidu.com/s/1eQ7nd8Q 有时 ...

  8. VC内联汇编和GCC内联汇编的语法区别

    VC: #include <stdio.h> main(){ int a = 1; int b = 2; int c; __asm{ mov eax,a mov ebx,b mov ecx ...

  9. gcc 内联汇编

    http://www.cnblogs.com/zhuyp1015/archive/2012/05/01/2478099.html

随机推荐

  1. webview loadRequest

    // 所构建的NSURLRequest具有一个依赖于缓存响应的特定策略,cachePolicy取得策略,timeoutInterval取得超时值 [self.yourSite loadRequest: ...

  2. 设计模式之笔记--组合模式(Composite)

    组合模式(Composite) 定义 组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.       组合模式有 ...

  3. python的IDLE界面回退代码语句

    Alt+P回退到IDLE中之前输入的代码语句 Alt+N可以移至下一个代码语句

  4. C#杂七杂八记录

     1. 日期格式表示 DateTime.Now.ToString("yyyy-MM-dd")  2. div跟屏幕的高度一样高,自适应 <style> html, bo ...

  5. 应用程序有bug崩溃重启的案例

    1.程序主界面代码 using System;using System.Collections.Generic;using System.Diagnostics;using System.Linq;u ...

  6. leetcode 之Single Number(14)

    这题并不难,但需要注意细节. ListNode* addTwo(ListNode *l1, ListNode *l2) { ListNode dummy(-); ; ListNode *prev = ...

  7. Django Ajax学习一

    1. 简单的加法 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. [转]6个HelloWorld

    原文地址:点击打开链接 转这个帖子,是因为看了这个帖子使我明白了一个道理:一旦你发散自己的思维,激发自己的创意,就会发现原来编程是这么的好玩. 原文标题为<6个变态的C语言Hello World ...

  9. HDMI 电视 点对点 桌面超出屏幕

    一直在用电视作显示器,但是没有注意点对点到问题,只是感觉字体发虚.直到今天装win10,桌面会超出屏幕,使用intel控制面板调整分辨率后正常,但是注销或重启会再次回复.百度无果,自己摸索,不仅解决了 ...

  10. web.config 数据库连接

    方法一:connectionsStrings 首先配置web.config文件 <configurations> <connectionStrings> <add nam ...