[国嵌攻略][045-046][一跃进入C大门]
[一跃进入C大门]
跳转方式
1.相对跳转:b或bl指令,通过计算两个地址之间的差值来给pc赋值相对跳转
2.绝对跳转:ldr指令,通过给pc直接赋值,完成绝对跳转
代码编写
1.在汇编代码中直接使用绝对跳转,跳转到C代码中,然后在C代码中通过点亮LED来验证
2.210在跳转到C程序时,需要注意复制代码时,要跳过校验信息。要不然跳转到内存时,前16个字节为头信息,整个起始地址向后偏移了16个字节,就找不到正确地址了
[C与汇编混合编程]
为什么需要C与汇编混合编程
1.汇编语言:执行效率高,编写繁琐
2.C语言:可读性强,移植性好,调试方便
3.混合编程可以提高执行效率,能够直接控制处理器,结合两者的优点
混合编程类型
1.汇编调用C函数
直接在汇编中调用C函数名(函数名相当于标号地址)
2.C调用汇编函数
在C中把汇编标号当函数调用(汇编标号需要通过global声明成全局)
3.C内嵌汇编代码
3.1格式:
__asm__(
汇编语句
:输出
:输入
:破坏描述
);
输出表示输出到C的变量,输入表示从C中输入的变量,破坏描述表示内嵌汇编中修改的寄存器。
C内嵌汇编以关键字”__asm__”或”asm”开始,下面四个部分,各部分之间使用”:”隔开,第一部分必须写,后面三个部分可以省略,但”:”不能省略
3.2示例:
void write_p15_c1(unsigned long value){
__asm__(
“mcr p15, 0, %0, c1, c0\n”
:
:”r”(value) @编译器任意选择一个rx寄存器
:
);
} unsigned long read_p15_c1(){
unsigned long value;
__asm__(
“mrc p15, 0, %0, c1, c0,0\n”
:”=r”(value) @’=’表示只写操作数,用于输出
:
:”memory” @表示修改内存,value局部变量保存在内存的栈中
);
return value;
} unsigned long old;
unsigned long temp; __asm__ volatile( @volatile告诉编译器,不要对优化下面的代码
“mrs %0, cpsr \n”
“orr %1, %0, #128 \n”
“msr cpsr_c, temp \n”
:”=r”(old),”=r”(temp)
:
:
); void init_led(){
__asm__(
"ldr r0, =0x56000010 \n"
"ldr r1, =0x00015400 \n"
"str r1, [r0] \n" "ldr r0, =0x56000014 \n"
"ldr r1, =0x00000140 \n"
"str r1, [r0] \n"
:
:
:"r0", "r1"
);
}
[国嵌攻略][045-046][一跃进入C大门]的更多相关文章
- [国嵌攻略][182][Sqlite嵌入式数据库移植]
数据库系统构成 在计算机系统中,保存数据的方式一般有两种: 1.普通文件方式 2.数据库方式 相比于普通文件方式,使用数据库来管理大批量数据具有更高的效率与安全性. 数据库系统一般由三个部分构成 1. ...
- [国嵌攻略][179][OpenSSL加密系统]
未加密传输的安全弊端 如果在网络传输中没有加密,就是以明文传输.传输的数据可以被抓包软件直接截获,并能读取里面的数据. 加密基本原理 1.对称加密 2.非对称加密 2.1.公钥私钥 公钥和私密要配对. ...
- [国嵌攻略][174][CGI快速入门-网页控制LED]
CGI程序(Common Gate Way Interface) 在服务器外部供服务器调用的程序,CGI程序与服务器配合后能让服务器完成更强大的功能. 1.浏览器通过HTML表单或超链接请求指向一个C ...
- [国嵌攻略][173][BOA嵌入式服务器移植]
1.解压boa嵌入式web服务 tar zxvf boa-0.94.13.tar.gz 2.进入src目录生成配置文件 ./configure 3.修改生成的Makefile CC=arm-linux ...
- [国嵌攻略][171][V4L2图像编程接口深度学习]
V4L2摄像编程模型 1.打开摄像头设备文件 2.获取驱动信息-VIDIOC_QUERYCAP 3.设置图像格式-VIDIOC_S_FMT 4.申请帧缓冲-VIDIOC_REQBUFS 5.获取帧缓冲 ...
- [国嵌攻略][165][usb下载线驱动设计]
查看USB设备的生产商ID和设备ID 示例: lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 生产商ID是1d ...
- [国嵌攻略][164][USB驱动程序设计]
USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.U ...
- [国嵌攻略][163][linux-usb软件系统架构]
软件系统架构 1.主机端软件架构 USB设备驱动->USB核心->USB主控制器驱动->USB主控制器 2.设备端软件架构 Gadget驱动->Gadget API->U ...
- [国嵌攻略][162][USB协议分析]
USB设备逻辑结构 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次.设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点. USB设备描述符 当我们把USB设备( ...
随机推荐
- bzoj 1996: [Hnoi2010]chorus 合唱队
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行 ...
- MVC 框架
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...
- vue2 watch引用类型 失败原因
vue中watch基本用法: new Vue({ el: '#t1', data: { a: { b: 1, c: 2 }, }, methods: { ch() { this.a.d=5 //不打印 ...
- 单独mybatis得使用
今天同学说要学习mybatis后来他写了个程序让我看看,我看了一下发现包引错了,他写的是单独的mybatis,引入的却是spring-mybatis,所以会报错. 今天我记录一下单独mybatis的使 ...
- npm安装删除模块以及cnpm淘宝镜像
npm安装模块 [$ npm install xxx]利用 npm 安装xxx模块到当前命令行所在目录: [$ npm install -g xxx]利用npm安装全局模块xxx: npm 删除模块 ...
- HTML 中有用的字符实体
HTML 中有用的字符实体
- Appium python
1.运行报错:FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.android.ime without first uninstalling ...
- python 打印几行空行、 打印不换行
2.x版本中使用print '\n' * n #n为行数 3.x版本中使用print('\n' * n) #n为行数 print 'Hello', :不会换行.[加上逗号(,)]
- 转载自 BotVS 「 珍藏版 」如何搭建一个完整的交易框架
[img]http://dn-filebox.qbox.me/8c218c119046b2a25df2d9c7b00c1e0fa6899bdd.png[/img]NO:01 交易策略 ≠ 交易系统. ...
- Ubuntu 设置内核版本的GRUB默认启动
注:我只是一只小小的搬运工.这篇文章内容摘自: https://www.calazan.com/how-to-set-an-older-kernel-version-as-the-default-in ...