转: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. C基础 寻找随机函数的G点

    引言 随机函数算法应该是计算机史上最重要的十大算法之一吧. 而C中使用的随机函数 #include <stdlib.h> _Check_return_ _ACRTIMP int __cde ...

  2. FineReport——发送邮件

    在FR中,个用户之间可以通过邮件的形式进行通信,但是存在一个问题就是FineReport平台只能设置一个发件人账户,收件人账户可以有多个. 所以在实际的系统开发中可能需要自己开发信息交互的模块. 在系 ...

  3. java中this的用法如:this.name=name

    package com.chensi; /** * 这个是为了搞懂那个 this.name = name的. * @author ZHL * */ public class ThisTestZhl { ...

  4. 听justjavac大神live前端的入门与进阶小笔记

    代码规范 代码强壮,调试代码 少用变量,多用常量 少用for循环,why循环,多用函数式, 不要直接去使用框架 刷题 提高编程思维 用js去做c语音的问题 阅读别人代码,去看别人的代码 a+b> ...

  5. Word中截取部分内容并保存为jpg图片的方法

    private void button1_Click(object sender, EventArgs e) { var appWord = new Microsoft.Office.Interop. ...

  6. 如何将json拼接在url后面当做地址栏参数?

    function param(data) { let url = '' for (var k in data) { let value = data[k] !== undefined ? data[k ...

  7. PHP必用代码片段

    在编写代码的时候有个神奇的工具总是好的!下面这里收集了 50+ PHP 代码片段,可以帮助你开发 PHP 项目. 这些 PHP 片段对于 PHP 初学者也非常有帮助,非常容易学习,让我们开始学习吧- ...

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

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

  9. springBoot service层 事务控制

    springBoot使用事物比较简单,在Application启动类s上添加@EnableTransactionManagement注解,然后在service层的方法上添加@Transactional ...

  10. codeforces 某套题s : surf(贪心 || 动态规划)

    题目: Now that you’ve come to Florida and taken up surfing, you love it! Of course, you’ve realized th ...