复习-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 ...
随机推荐
- Hadoop学习笔记——入门指令操作
假设Hadoop的安装目录HADOOP_HOME为/home/admin/hadoop. 启动与关闭启动HADOOP1. 进入HADOOP_HOME目录. 2. 执行sh bin/start-all. ...
- TcpClient
public class TcpClientSession { protected TcpClient Client { get; set; } /// <summary> /// 远程地 ...
- 收MUD巫师学徒,MUD开发,LPC语言开发
收MUD巫师学徒,MUD开发,LPC语言开发 对这个有兴趣的联系我,签订协议 Q 184377367
- 查看Linux下网卡状态或 是否连接
分类: 1) 通过mii-tool指令 [root@localhost root]# mii-tool eth0: negotiated 100baseTx-FD, link ...
- VS2008编译boost库
一.下载首先从boost官方主页http://www.boost.org/下载最新版boost安装包,我用的版本是boost.1.49.0二.新建文件夹 如果是使用下载的安装包,那么请将boost安装 ...
- MATLAB中文论坛帖子整理(GUI)
MATLAB中文论坛帖子整理(GUI) 目 录 1.GUI新手之——教你读懂GUI的M文件... 10 2.GUI程序中改变current directory引起的问题... 15 3.GUI中 ...
- C语言的本质(12)——指针与函数
往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂.下面详细为大家介绍C语言中指针函数和函数指针. 1.指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需 ...
- 在 Windows Azure 网站中进行纵向扩展和横向扩展
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Byron Tardif 撰写. 当您开始一个新的 Web 项目,或者刚刚开始开发一般的网站和应用程序时,您可能希望从小处着手. ...
- react-native学习笔记——ViewStack组件
今天来写一个组件,相信很多人都会用到的——ViewStack. ViewStack组件无疑是UI中很重要的一个组件,可惜react-native并没有内嵌进去,需要开发者自己去实现. 实现原理很简单, ...
- 全国计算机等级考试二级教程-C语言程序设计_第8章_地址和指针
面试: unsigned int *p1 = # int *p2 = # #define _CRT_SECURE_NO_WARNINGS #include<std ...