复习-C语言内嵌汇编-初级(1)
打印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)的更多相关文章
- 复习-C语言内嵌汇编-初级(2)
汇编取出内存中的值 # include <stdio.h> int main() { ; ; int *p = &i; //ret = *p; __asm__( "ldr ...
- Ok6410裸机驱动学习(三)C语言内嵌汇编
1.C语言内嵌汇编使用方法 C内嵌汇编以关键字”_asm_或asm开始,下辖4个部分,各部分之间用“:”分开,第一部分是必须写的,后面3个部分可以省略,但是分号:不能省略 优化后的代码 2.汇编程序框 ...
- 简单了解C语言内嵌汇编
最近看自旋锁的实现,自选锁的循环查找锁的主要实现类似如下,该实现使用到了内嵌的汇编(摘自sanos内核,源代码有2处实现,一处使用intel汇编,是没有问题的,另一处使用内嵌汇编语法,源代码中为cmp ...
- C语言内嵌汇编(arm-v7)----加减乘移位
在现代嵌入式操作系统中,汇编语言当然必不可少,汇编语言的优势就是执行速度快.如果在C语言的代码中,在关键的地方内嵌汇编,那么效率将会大大的提高,我们来看看代码: #include <stdio. ...
- Linux内核--C语言中内嵌汇编 asm __volatile__
在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...
- Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】
转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...
- GCC在C语言中内嵌汇编 asm __volatile__ 【转】
转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...
- GCC在C语言中内嵌汇编 asm __volatile__
2012-11-26 22:20 17958人阅读 评论(2) 收藏 举报 分类: linux(59) 架构管理(24) C/C++(59) 目录(?)[+] 在内嵌汇编中,可以将C语言表达式 ...
- Beennan的内嵌汇编指导(译)Brennan's Guide to Inline Assembly
注:写在前面,这是一篇翻译文章,本人的英文水平很有限,但内嵌汇编是学习操作系统不可少的知识,本人也常去查看这方面的内容,本文是在做mit的jos实验中的一篇关于内嵌汇编的介绍.关于常用的内嵌汇编(AT ...
随机推荐
- sql从某不连续的数字中将其分段并找出缺失的数字并分段
首先做准备数据 )) ') ') ') ') ') ') ') ') ') ') ') ') ') ') ') ') 将数据转换成应该处理的数据格式 ),colValue INT ) ) ,LEN(c ...
- Netty详解
Netty详解 http://blog.csdn.net/suifeng3051/article/category/2161821
- HDU 2473 - Junk-Mail Filter ,并查集的删点
Problem Description Recognizing junk mails is a tough task. The method used here consists of two ste ...
- C++中的面向对象笔记
公共继承,相当于属于关系.如CLASS B:public A,表示B就是A,A做到的,B也能做到. CLASS A {}; CLASS B:public A {}; A a; B b; a=b;//错 ...
- Android 软键盘小知识点
chatText = (EditText) findViewById(R.id.chatText); chatText.setOnKeyListener(new OnKeyListener() { p ...
- WdatePicker日历控件使用方法
1. 跨无限级框架显示 无论你把日期控件放在哪里,你都不需要担心会被外层的iframe所遮挡进而影响客户体验,因为My97日期控件是可以跨无限级框架显示的 示例2-7 跨无限级框架演示 可无限跨越框架 ...
- php调用java类文件
最近在折腾php调用java类,网上查阅资料,最终选用JavaBridge,遇到的第一个问题是java_require() 函数引入自定义java打包而成的jar文件,在新版本的JavaBridge中 ...
- Log4j的应用实例(转)
转自:http://www.cnblogs.com/eflylab/archive/2007/01/12/618080.html 在Log4J使用笔记中没有怎么写实例,那么在这篇中我将Log4j的一个 ...
- Oracle EBS-SQL (WIP-16):检查期间手工下达的车间任务数.sql
select WE.DESCRIPTION 任务说明, --DECODE( ...
- 使用Task简化Silverlight调用Wcf
原文http://www.cnblogs.com/lemontea/archive/2012/12/09/2810549.html 从.Net4.0开始,.Net提供了一个Task类来封装一个异步操作 ...