打印hello world并改变变量i的值

 # include <stdio.h>

 int main()
{
int i = ;
__asm__(
"mov %0, #4\n"
:"=r" (i) //输出
: //输入
:"r0" //保护
);
printf("hello world! %d\n", i);
}

说明:mov可以将立即数传到寄存器,可以将一个寄存器的值传到另一个寄存器,但是不能跟内存打交道,跟内存打交道一般用ldr,str后面会说。

    第八行解释:“=r”  -----------------> 寄存器用了输出部分,输出也是可用的。

          “=&r” ------------------> 只用输出部分,输入不给任何人用。

          “+r” ---------------------> 输入与输出都用,对新手来说一般都用这个啦。

    第十行保护部分:首先__asm__(.......); 这条语句嵌入在C语言中,是当作一条指令;保护是保护R0之前的状态,就是__asm__之前的状态;程序最终都是要以汇编运行的,__asm__();之前也可能用到R0的吧?保护的就是这个R0,但是__asm__(...);里面也是可以用的;比如之前R0是100,asm指令完后还是100,中途随可以随便用。

简单的加减乘除

 #include <stdio.h>

 int main()
{
int i = ;
int j = ;
int sum = ;
//sum = i + j;
__asm__(
"add %0, %1, %2\n"
: "=r" (sum) //输出
: "r" (i), "r" (j) //输入
);
//sub %0, %2, %1
//mul %0, %1, %2
printf("sum %d\n", sum);
}

简单的做比较

 #include <stdio.h>

 int main()
{
int i = ;
int j = ;
int sum = ;
#if 0
if(i > j)
sum = i;
else
sum = j;
#endif
__asm__(
"cmp %1, %2\n"
"movgt %0, %1\n"
"movle %0, %2\n"
: "=r" (sum) //输出
: "r" (i), "r" (j) //输入
);
printf("sum %d\n", sum);
}

说明: gt      ----------------      >

    lt       ----------------      <

   ge      ----------------      >=

   le       ----------------      <=

   eq      ----------------      ==

   ne!     ----------------      !=

简单的累加和

 #include <stdio.h>

 int main()
{
int i = ;
int sum = ; #if 0
bunfly:
sum = sum + i;
i++;
if(i == )
goto haha;
goto bunfly;
haha: #else
__asm__(
"mov %0, #0\n"
"mov %1, #1\n"
"bunfly:\n"
"add %0, %0, %1\n"
"add %1, %1, #1\n"
"cmp %1, #100\n"
"beq haha\n"
"bne bunfly\n"
"haha:\n" : "=&r" (sum) //输出
: "r" (i) //输入
);
#endif printf("sum %d\n", sum);
}

说明:汇编程序功能可参考上面的C语言就很容易看懂汇编的意义,需要注意的是19,20两行的初始化以及29行的“=&r”。

这些程序都是再tiny4412板子上运行,当然使用的交叉编译,例:arm-none-linux-gnueabi-gcc 4.c -o 4

复习-C语言内嵌汇编-初级(1)的更多相关文章

  1. 复习-C语言内嵌汇编-初级(2)

    汇编取出内存中的值 # include <stdio.h> int main() { ; ; int *p = &i; //ret = *p; __asm__( "ldr ...

  2. Ok6410裸机驱动学习(三)C语言内嵌汇编

    1.C语言内嵌汇编使用方法 C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略 优化后的代码 2.汇编程序框 ...

  3. 简单了解C语言内嵌汇编

    最近看自旋锁的实现,自选锁的循环查找锁的主要实现类似如下,该实现使用到了内嵌的汇编(摘自sanos内核,源代码有2处实现,一处使用intel汇编,是没有问题的,另一处使用内嵌汇编语法,源代码中为cmp ...

  4. C语言内嵌汇编(arm-v7)----加减乘移位

    在现代嵌入式操作系统中,汇编语言当然必不可少,汇编语言的优势就是执行速度快.如果在C语言的代码中,在关键的地方内嵌汇编,那么效率将会大大的提高,我们来看看代码: #include <stdio. ...

  5. Linux内核--C语言中内嵌汇编 asm __volatile__

    在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...

  6. Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】

    转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...

  7. GCC在C语言中内嵌汇编 asm __volatile__ 【转】

    转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...

  8. GCC在C语言中内嵌汇编 asm __volatile__

    2012-11-26 22:20 17958人阅读 评论(2) 收藏 举报  分类: linux(59)  架构管理(24)  C/C++(59)  目录(?)[+] 在内嵌汇编中,可以将C语言表达式 ...

  9. Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly

    注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...

随机推荐

  1. Marshal 类的内存操作的一般功能

    Marshal类 提供了一个方法集,这些方法用于分配非托管内存.复制非托管内存块.将托管类型转换为非托管类型,此外还提供了在与非托管代码交互时使用的其他杂项方法. 命名空间:System.Runtim ...

  2. Ubuntu14.04如何备份和恢复系统

    清理Ubuntu14.04的系统的垃圾:先清空回收站,软件升级到最新.Ubuntu系统与Windows系统所采用的文件系统不同, Ubuntu系统在使用或更新过程中不会产生文件碎片和垃圾文件,所以在使 ...

  3. python中调用C++写的动态库

    一.环境:Windows XP + Python3.2 1. dll对应的源文件(m.cpp): #include <stdio.h> extern "C" { _de ...

  4. 关于sql 外键的讨论。

    外键是否采用看业务应用场景,以及开发成本的,大致列下什么时候适合,什么时候不适合使用: 1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能力限制 ...

  5. sulime运行 java 和 php

    执行php脚本 1. 先配置好php环境变量 2. Tools -> Build System -> New Build System.... {      "cmd" ...

  6. jsoup_解析任意网站,做任意网站客户端

    jsoup是一个解析网页源码的开源库,他能按照给定的规则提取出一个网页中的任意元素,和其他网页解析库不同的是,他提取网页内容的方式和css.jquery的选择器非常相似.因此如果你懂得前端的知识,只需 ...

  7. Service(Local Service)简介

    一.Service的作用 主要用于在后台处理一些耗时的逻辑操作,或者去执行某些长期运行的操作. 二.Service的创建 1.主要方法 IBinder onBind(Intent intent):必须 ...

  8. ArrayList--卧槽这就是源码

    最近在<数据结构与算法分析(java版)>中看到了实现ArrayList的简易代码,亲自做了一下.个中的疑点还是在代码中实现了一下.其中就包括内部类Iterator对外部成员访问的问题. ...

  9. 你必须知道的 34 个简单实用的 Ubuntu 快捷键

      ubuntu常用的快捷键: 1. Ctrl + W: 关闭当前 Nautilus 窗口 2. Ctrl+T: 在 Nautilus 打开新的 Tab 3. Ctrl + H: 切换隐藏文件(夹)显 ...

  10. Android不规则瀑布流照片墙的实现+LruCache算法

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZnJhbmNpc3NoaQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...