ARM fiq和irq的区别 共享内存 混合联编 6.25

news2024/12/29 8:44:18

day4

汇编代码初始化系统中:

为什么要保存cpsr:要把其他的状态还原 如(N Z)
user:
	mov r0,#3
	cmp r0,#4
	...			//irq
	movlt r1,#5
	
irq:
	mov r0,#10
	cmp r0,#10
	moveq r2,#6

fiq和irq的区别:

fiq和irq的区别:
1.fiq有自己独立的寄存器
2.fiq比irq快
	b reset
	b und
	...
	b irq
	b fiq
	fiq:
		xxx...(b fiq之后会立刻运行fiq 马上就是xxx,只需要pc+4就可以执行了)
	irq:
		xxx...(irq 需要跳转)
		
3.fiq可以打断irq,irq不能打断fiq

共享内存

data: .space 64
mov r0, #10
ldr r1,=data
str r0,[r1]
mov r0,#5
ldr r0,[r1]

.globl _start
_start: b	reset
	ldr	pc, _undefined_instruction
	ldr	pc, _software_interrupt
	ldr	pc, _prefetch_abort
	ldr	pc, _data_abort
	ldr	pc, _not_used
	ldr	pc, _irq
	ldr	pc, _fiq

_undefined_instruction: .word _undefined_instruction
_software_interrupt:	.word swi_handler
_prefetch_abort:	.word _prefetch_abort
_data_abort:		.word _data_abort
_not_used:		.word _not_used
_irq:			.word _irq
_fiq:			.word _fiq

reset:
/*set the cpu to SVC32 mode */
	mrs	r0, cpsr
	bic	r0, r0, #0x1f
	orr	r0, r0, #0xd3
	msr	cpsr,r0

/* Set vector address  register */
	ldr	r0, =_start
	mcr	p15, 0, r0, c12, c0, 0	@Set VBAR

/*设置svc的栈顶指针*/
    ldr sp , stacktop

/*set the cpu to software_interrupte mode */

mrs r0 , cpsr
bic r0 , r0 , #0x1f
orr r0 , r0 , #0xd0
msr cpsr,r0

/*设置user的栈顶指针*/
ldr sp,stacktop
sub sp,sp,#256

bl _main

stack: .space 256*8
stacktop: .word stack+256*8
data: .space 64

_main:

mov r1,#10
mov r2,#3
ldr r7,=data
str r1,[r7]
str r2,[r7,#4]
mov r1,#66
mov r2,#44
bl user_sub
ldr r3,[r7,#8]
bl user_add
ldr r3,[r7,#8]

nop
nop

user_sub:
stmfd sp!,{r0-r12,lr}
swi 0x1
ldmfd sp!,{r0-r12,pc}

user_add:
stmfd sp!,{r0-r12,lr}
swi 0x2
ldmfd sp!,{r0-r12,pc}

swi_handler:
stmfd sp!,{r0-r12,lr}
ldr r5,[lr,#-4]
bic r5,r5,#0xff000000
cmp r5,#0x1
bleq swi_sub
cmp r5,#0x2
bleq swi_add
ldmfd sp!,{r0-r12,pc}^

swi_sub:
stmfd sp!,{r0-r12,lr}
ldr r7,=data
ldr r1,[r7]
ldr r2,[r7,#4]
sub r1,r1,r2
str r1,[r7,#8]
ldmfd sp!,{r0-r12,pc}

swi_add:
stmfd sp!,{r0-r12,lr}
ldr r7,=data
ldr r1,[r7]
ldr r2,[r7,#4]
add r1,r1,r2
str r1,[r7,#8]
ldmfd sp!,{r0-r12,pc}

1.混合编译

1.函数的参数
如果用C代码写函数,函数定义在汇编当中时,参数列表有r0,r1,r2,r3来获取
如果参数列表过多,只有前四个参数可以给寄存器,剩下的全部放在内存中

2.函数的返回值:r0给C
.global _start
.global user_add
.global user_sub
_start: b	reset
	ldr	pc, _undefined_instruction
	ldr	pc, _software_interrupt
	ldr	pc, _prefetch_abort
	ldr	pc, _data_abort
	ldr	pc, _not_used
	ldr	pc, _irq
	ldr	pc, _fiq

_undefined_instruction: .word _undefined_instruction
_software_interrupt:	.word swi_handler
_prefetch_abort:	.word _prefetch_abort
_data_abort:		.word _data_abort
_not_used:		.word _not_used
_irq:			.word _irq
_fiq:			.word _fiq

reset:
/*set the cpu to SVC32 mode */
	mrs	r0, cpsr
	bic	r0, r0, #0x1f
	orr	r0, r0, #0xd3
	msr	cpsr,r0

/* Set vector address  register */
	ldr	r0, =_start
	mcr	p15, 0, r0, c12, c0, 0	@Set VBAR

/*设置svc的栈顶指针*/
    ldr sp , stacktop

/*set the cpu to software_interrupte mode */

mrs r0 , cpsr
bic r0 , r0 , #0x1f
orr r0 , r0 , #0xd0
msr cpsr,r0

/*设置user的栈顶指针*/
ldr sp,stacktop
sub sp,sp,#256

bl main

stack: .space 256*8
stacktop: .word stack+256*8
data: .space 64


user_sub:
stmfd sp!,{r1-r12,lr}
ldr r7,=data
str r0,[r7]
str r1,[r7,#4]
swi 0x1
ldr r0,[r7,#8]
ldmfd sp!,{r1-r12,pc}

user_add:
stmfd sp!,{r1-r12,lr}
ldr r7,=data
str r0,[r7]
str r1,[r7,#4]
swi 0x2
ldr r0,[r7,#8]
ldmfd sp!,{r1-r12,pc}

swi_handler:
stmfd sp!,{r0-r12,lr}
ldr r5,[lr,#-4]
bic r5,r5,#0xff000000
cmp r5,#0x1
bleq swi_sub
cmp r5,#0x2
bleq swi_add
ldmfd sp!,{r0-r12,pc}^

swi_sub:
stmfd sp!,{r0-r12,lr}
ldr r7,=data
ldr r1,[r7]
ldr r2,[r7,#4]
sub r1,r1,r2
str r1,[r7,#8]
ldmfd sp!,{r0-r12,pc}

swi_add:
stmfd sp!,{r0-r12,lr}
ldr r7,=data
ldr r1,[r7]
ldr r2,[r7,#4]
add r1,r1,r2
str r1,[r7,#8]
ldmfd sp!,{r0-r12,pc}
/*===============================================
*   文件名称:main.c
*   创 建 者: memories
*   创建日期:2023年06月25日
*   描    述:have a nice day
================================================*/
#include <stdio.h>

int main(int argc, char *argv[])
{ 
    int a = 100;
    int b = 200;
    int c = user_add(a,b);  
} 

链接文件:

ENTRY(_start)
SECTIONS{
	. = 0x0;				
	.text : {				
		test.o(.text)		
		*(.text)
	}
	.data : {
		*(.data)
	}
	.bss : {
		*(.bss)
	}
}

混合编译的意义:

all:
arm-linux-gcc sub_test.s -o test.o -c -g
arm-linux-gcc main4.c -o main4.o -c -g
arm-linux-ld test.o main4.o -o test.elf -Ttest.lds
arm-linux-ld test.o -o test.elf -Ttest.lds
qemu-system-arm -machine xilinx-zynq-a9 -m 256M -serial stdio -kernel test.elf -S -s
arm-linux-objcopy test.elf test.bin -O binary

汇编运行速度很快,但是晦涩难懂,所以一般是函数初始化或者系统初始化的时候需要写汇编,可以快速完成任务,其他功能还是需要写C语言,方便人理解

pc的作用:

dd(a,b);
}




## 链接文件:

```tex
ENTRY(_start)
SECTIONS{
	. = 0x0;				
	.text : {				
		test.o(.text)		
		*(.text)
	}
	.data : {
		*(.data)
	}
	.bss : {
		*(.bss)
	}
}

混合编译的意义:

汇编运行速度很快,但是晦涩难懂,所以一般是函数初始化或者系统初始化的时候需要写汇编,可以快速完成任务,其他功能还是需要写C语言,方便人理解

pc的作用:

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVPR 2023 | SAN: Side Adapter Network for Open-Vocabulary Semantic Segmentation

CVPR 2023 | SAN: Side Adapter Network for Open-Vocabulary Semantic Segmentation 论文&#xff1a;https://arxiv.org/abs/2302.12242代码&#xff1a;https://github.com/MendelXu/SAN 架构设计 冻结的 CLIP&#xff0c;其位置编码为了适应不同于预训练的输入分辨率&…

贪心算法:解决最优问题的简洁而高效方法

目录 引言&#xff1a; 一. 概念与原理 二. 应用场景 3. 实现方法 4. 优缺点分析 引言&#xff1a; 在计算机科学领域&#xff0c;我们经常面临着需要在一系列选择中找到最优解决方案的问题。贪心算法正是针对这类最优化问题而设计的一种简洁而高效的方法。不同于其他复杂…

Educational Codeforces Round 151 (Rated for Div. 2)(A-B)

打完涨了20分…… 算法选修课就学会了dfs……如果有期末复习的这种劲头&#xff0c;其他算法估计早就学会了&#xff08; A Forbidden Integer 这个还WA了三发…… signed main(){IOS;int n,k,x;bool f1;cf{cin>>n>>k>>x;if(k1)cout<<"NO"…

Quiz 14_2-1: Using Web Services | Python for Everybody 配套练习_解题记录

文章目录 Python for Everybody课程简介Quiz 14_2-1: Using Web Services单选题&#xff08;1-15&#xff09;操作题Autograder : Extracting Data from XML Python for Everybody 课程简介 Python for Everybody 零基础程序设计&#xff08;Python 入门&#xff09; This cou…

Echarts折线图默认不显示数据圆点,鼠标hover时折线图上才显示圆点

option {......tooltip: {trigger: axis,},series: [{symbol: circle,symbolSize: 5,showSymbol: false, // 只有在 tooltip hover 的时候显示symbolitemStyle: { // symbol样式normal: {color: rgb(255, 255, 255),borderColor: rgba(255, 255, 255, 0.2), // symbol边框颜色…

6.20、JAVA 初识序列化与反序列化

初识序列化与反序列化 1 概述 序列化是指将对象的状态信息转换为可以存储或传输形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后可以通过从存储区中读取或者反序列化对象的状态,重新创建该对象. 序列化:利用ObjectOutputStream,把对象的信息,按照固定…

【QT】如何自定义QMessageBox的窗口大小,通过继承QDialog重新实现美观的弹窗

目录 1. QMessageBox原有的弹窗2. 网上第一种方法&#xff1a;通过样式表setStyleSheet实现改变弹窗大小&#xff08;总体不美观&#xff09;3. 网上第二种方法&#xff1a;重写ShowEvent()改变弹窗大小&#xff08;总体也不美观&#xff09;4. 最好的办法&#xff1a;继承QDia…

centos安装k8s

1. 前置 俩台centos服务器,不过多说明,教程基于centos 2. hosts配置 我这样配置&#xff0c;最后没发现那块有联动&#xff0c;望大佬更正 vim /etc/hosts 在末尾添加 192.***** master 192.*** note3. 防火墙 说是要关闭防火墙&#xff0c;我俩台服务器都是基于内网&…

服务器数据库中遭受Devos勒索病毒攻击后解密处理方法,勒索病毒数据恢复

在当今数字化时代&#xff0c;服务器数据库的安全性备受关注。然而&#xff0c;网络安全威胁依然存在&#xff0c;勒索病毒如Devos仍然是一种常见的攻击计算机病毒。最近&#xff0c;收到很多企业的求助&#xff0c;企业的财务系统账套遭到了Devos勒索病毒攻击&#xff0c;导致…

js数组中对象的替换,替换原数组 lodash中一些常用的方法(很实用)

代码 let myArray [{name: John, age: 25},{name: Alice, age: 30},{name: Bob, age: 35} ];// 要替换的对象 let objToReplace {name: Alice, age: 30};// 替换为的对象 let replacementObj {name: Alex, age: 28};// 使用forEach方法 myArray.forEach((obj, index) > …

浙大滨江院Om中心发布首个大规模图文配对遥感数据集,让通用基础模型也能服务遥感领域...

写在前面 2021 年年底&#xff0c;OpenAI 发布了 CLIP&#xff0c;利用带噪的图像-文本配对数据预训练的视觉语言模型&#xff0c;展示了前所未有的图像-文本关联能力&#xff0c;在各种下游任务中取得了惊人的结果。虽然取得了很大的进展&#xff0c;但是这类通用视觉语言基础…

Visual C++中的虚函数和纯虚函数(以策略设计模式为例)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来说说Visual C中的虚函数和纯虚函数。该系列帖子全部使用我本人自创的对比学习法。也就是当C学不下去的时候&#xff0c;就用JAVA实现同样的代码&#xff0c;然后再用对比的方法把C学会。 直接说虚函数…

微信小程序 rich-text富文本框 怎么设置里面节点的样式

1、在JS中我们获取数据&#xff0c;在没有类名的情况下 使用正则匹配你想要添加演示的节点 res[1].data[0].f_content为rich-text里面的节点 如图 代码&#xff1a;让获取的节点中的图片的最大宽度为100%,高度为auto this.content res[1].data[0].f_content.replace(/\<…

数据库连接与操作怎么学习? - 易智编译EaseEditing

学习数据库连接和操作是进行数据管理和处理的关键技能之一。下面是一些建议&#xff0c;可以帮助您学习数据库连接和操作&#xff1a; 学习数据库基础知识&#xff1a; 首先&#xff0c;了解数据库的基本概念、术语和原理。掌握关系型数据库和非关系型数据库的特点以及它们之…

Spring Boot中的Elasticsearch自动配置

Spring Boot中的Elasticsearch自动配置 Elasticsearch是一个基于Lucene的分布式全文搜索引擎&#xff0c;它在搜索、分析等方面具有出色的表现。Spring Boot中的Elasticsearch自动配置为我们提供了一种快速集成Elasticsearch的方式&#xff0c;使我们可以在Spring Boot应用程序…

【Unity每日一记】常见的类你都掌握了吗,没有就过来看看吧

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

layui弹出层laydate时间选择一闪而过,无法弹出时间选择

问题&#xff1a;layUI日期框弹不出&#xff0c;一闪而过 laydate.render({elem: #ctime,type: datetime,trigger:click }); 解决方案&#xff1a;关键代码&#xff0c;添加如下代码 trigger:click 实现效果

浏览器基础原理-安全: HTTPS

HTTP协议的历史: HTTP协议的目的很单纯, 就是为了传输超文本文件, 所以早期的 HTTP 一直保持着明文传输数据的特征, 但是中间很有可能会被截取或者篡改, 即收到中间人攻击. 解析HTTP协议栈层面: HTTPS往里面加入了安全层, 它的指责是: 对发起HTTP请求的数据进行加密和对接收…

Redis实战篇(二)

三、优惠卷秒杀 3.1 全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显 受单表数据量的限制 场景分析一&am…

初学mybatis(二)CRUD操作及配置解析

学习回顾&#xff1a;初学mybatis&#xff08;一&#xff09; 一、namespace 1、将上面案例中的UserMapper接口改名为 UserDao&#xff1b;2、将UserMapper.xml中的namespace改为为UserDao的路径 .3、再次测试 结论&#xff1a; 配置文件中namespace中的名称为对应Mapper接口或…