ARM编程模型、指令集、ARM汇编语言程序设计

news2024/9/20 0:01:44

一、编程模型

1.1数据和指令类型

在之后的演示当中,我们大多数将采用ARM指令集

1.2处理器工作模式

1.3ARM寄存器

1.3.1分类

        (1) 31 个通用寄存器,包括 PC(程序计数器)在内,都是 32 位的寄存器。
        (2) 6 个状态寄存器,都是 32 位的寄存器。

LR(链接寄存器):保存函数的返回地址

SP(栈指针寄存器):指向栈顶(满减栈)

1.3.2程序状态寄存器

1.3.3程序指针PC

        CPU总是按照PC的指向对指令序列进行取指、译码和执行,也就是说,最终是PC 决定了程序运行流向。

        在程序开始执行前,将程序指令序列的起始地址,即程序的第一条指令所在的内存单元地址送入PC,CPU  按照 PC的指示从内存读取第一条指令(取指)。当执行指令时,CPU自动地修改PC  的内容,即每执行一条指令PC增加一个量,这个量等于指令所含的字节数(指令字节数),使 PC总是指向下一条将要取指的指令地址。由于大多数指令都是按顺序来执行的,所以修改PC 的过程通常只是简单的对PC 加“指令字节数”。

        

因此,我们可以判断,PC总是指向正在执行的下下一个操作

二、ARM指令集

2.1数据处理指令集

2.1.1BIC指令

2.1.2条件执行及标志位

三、汇编语言程序设计

3.1立即数

循环右移偶数位

像0X104就是立即数,0X101就不是立即数,0X104换算成二进制是0000 0000 0000 0000 0000 0001 0000 0100,可以看做是0000 0000 0000 0000 0000 0000 0100 0001循环右移30位变换成的,所以是立即数,但0X101换算成二进制是0000 0000 0000 0000 0000 0001 0000 0001,无法通过变换完成,所以不是立即数
一个简单的区分立即数的方法,立即数是8位常数变换来的,右移偶数位其实根本没有限制,因为8位的常数是可变的,那么只要保证数值换算成二进制后带有1的数位在8位以内就可以判定为立即数。

3.2函数调用

3.2.1内部

start
	ldr sp, =0x40001000

	mov r0, #1
	mov r1, #2
	mov r2, #3
	mov r3, #4
	
	bl fun


fun
	mov r0,#1
	mov r1,#2
	add r2,r0,r1
	mov pc ,lr ;调用后返回
	

	end

3.2.2外部

(1)export

(2)import

3.2.3传参

4个以上传参需要将参数入栈

start
	ldr sp, =0x40001000

	mov r0, #1
	mov r1, #2
	mov r2, #3
	mov r3, #4
	mov r4, #5
	mov r5, #6

	stmfd sp!, {r4,r5}
	bl fun		 

	import c_add
	bl c_add 

3.2.4嵌套中断

使用入栈出栈的方式,保留lr,每次函数结束出栈时赋值给pc,返回函数调用后该执行的指令

	preserve8
	area reset , code , readonly
	code32
	entry
start
	ldr sp, =0x40001000

	mov r0, #1
	mov r1, #2
	mov r2, #3
	mov r3, #4

	import c_add
	bl c_add ;将当前指令的下一条指令地址保存在LR寄存器,然后跳转。通常用于调用子程序,可通过在子程序的尾部添加mov  pc, lr 返回。

	nop
	b start

	export asm_add
asm_add
	stmfd sp!,{r4-r12,lr}	;保护现场	
	add r0,r0,r1
	ldmfd sp!,{r4-r12,pc}  ;恢复现场
	

	end
int asm_add(int x,int y);

int c_add(int a,int b,int c,int d)
{
		int sum = asm_add(a,b);
		sum += asm_add(c,d);
		

		return sum;
}

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

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

相关文章

实习项目|苍穹外卖|day7

缓存菜品 1.根据原型进行需求分析与设计&#xff08;接口文档&#xff09; 2.根据接口设计DTO&#xff08;redis数据类型选取&#xff09; 3.编码controller-》service-》mapper GetMapping("/list")ApiOperation("根据分类id查询菜品")public Result<…

51单片机-第十三节-直流电机驱动(PWM)

一、直流电机介绍&#xff1a; 直流电机是一种将电能转换为机械能的装置。 一般的直流电机有两个电极&#xff0c;电极正接&#xff0c;电机正转&#xff0c;电极反接&#xff0c;电机反转。 直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&#xff08;转子&#…

GB35114 USC安防平台 中星微国密摄像机配置 流程

中星微国密摄像机配置介绍 如下以中星微VS-IPC8021S-Y-T4摄像机为例&#xff0c;需要先各自获取p10文件&#xff0c;并通过证书签发机构或者测试SM2证书签发获取证书。 网络配置如下: 摄像机的IP地址为192.168.1.108&#xff0c;国标ID为34020000001320000015 系统的IP地址…

Robotframework框架基础

1.Robot Framework是开源的自动化测试框架&#xff0c;基于关键字驱动的测试方法2.它提供用于创建和执行自动化测试的工具和库&#xff0c;并支持使用不同的测试库和插件进行扩展 一.以下是Robot Framework框架的基础知识 1. 安装&#xff1a;通过pip安装Robot Framework和相…

打造可视化数字大屏供应链管理平台详解:从食堂采购系统源码开始

这篇文章将深入探讨直播美颜SDK与主播美颜工具的技术原理及其发展趋势&#xff0c;帮助开发者了解如何通过技术手段实现流畅、高效的实时美颜效果。 一、什么是直播美颜SDK&#xff1f; 直播美颜SDK是一种为开发者提供实时美颜功能的集成开发工具包。它通过对摄像头捕捉到的画…

现代计算机中数字的表示与浮点数、定点数

现代计算机中数字的表示与浮点数、定点数 导读&#xff1a;浮点数运算是一个非常有技术含量的话题&#xff0c;不太容易掌握。许多程序员都不清楚使用操作符比较float/double类型的话到底出现什么问题。这篇文章讲述了浮点数的来龙去脉&#xff0c;所有的软件开发人员都应该读…

轻松搞定用户认证:微搭低代码平台打造完美登录体验01用户登录

目录 1 创建数据源2 搭建后端API3 用户登录4 最终的代码总结 欢迎阅读我们的微搭低代码全栈开发课程&#xff0c;这是我们的第二篇。在第一篇中我们整体描述了小程序的功能结构&#xff0c;这一篇我们就进入实际的开发。 在开发小程序的时候&#xff0c;第一个需要考虑的就是用…

数据结构基础讲解(一)——线性表之顺序表专项练习

本文数据结构讲解参考书目&#xff1a; 通过网盘分享的文件&#xff1a;数据结构 C语言版.pdf 链接: https://pan.baidu.com/s/159y_QTbXqpMhNCNP_Fls9g?pwdze8e 提取码: ze8e 目录 前言 一.线性表的定义 二.线性表的基本操作 三.线性表的顺序存储和表示 四.顺序表中基本操作…

如何设置好看的电脑屏保?电脑屏保设置教程

如何设置好看的电脑屏保&#xff1f;电脑屏保设置教程。大家好&#xff0c;今天小编给大家带来了好看的电脑屏保&#xff0c;教大家如何设置一个好看的电脑屏保。屏保软件很多&#xff0c;今天我们介绍一款比较有特殊的屁屏保软件&#xff1a;芝麻时钟&#xff08;芝麻时钟 桌面…

【C++二分查找】1760. 袋子里最少数目的球

本文涉及的基础知识点 C二分查找 LeetCode1760. 袋子里最少数目的球 给你一个整数数组 nums &#xff0c;其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次&#xff1a; 选择任意一个袋子&#xff0c;并…

AMEsim和Simulink联合仿真生成新的.mexw64液压模型文件

AMEsim和Simulink进行联合仿真非常重要的就是AMEsim经过第四阶段Simulation会在相同文件下面生成一个与AMEsim液压模型相同名字的.mexw64文件&#xff0c;在Simulink进行联合仿真的S-Function需要找的也就是这个文件&#xff0c;只不过输入的时候除了液压模型名字之外&#xff…

形态学运算合集

圆形结构元素 禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

Post-Training有多重要?一文带你了解全部细节

1. 简介 随着LLM学界和工业界日新月异的发展&#xff0c;不仅预训练所用的算力和数据正在疯狂内卷&#xff0c;后训练&#xff08;post-training&#xff09;的对齐和微调方法也在不断更新。InstructGPT、WebGPT等较早发布的模型使用标准RLHF方法&#xff0c;其中的数据管理风…

Git撤销add

git要提交版本第一步是add&#xff0c;就算是文件本身已经存在只是修改&#xff0c;也需要添加&#xff0c;即添加到暂存区。其中最偷懒和也保险的命令是&#xff1a; git add . 即添加了本地&#xff08;多称工作目录&#xff09;所有文件。 撤销add有以下文章&#xff1a; …

解决SRS流媒体服务服务器无法接收客户端ipv6 RTMP推流的思路

这篇短文我不介绍SRS是什么&#xff0c;主要介绍一个场景问题&#xff0c;场景是你使用服务器并且部署了SRS服务配置成一个媒体流转发服务&#xff0c;也就是客户端往SRS流媒体服务器推流&#xff0c;然后SRS把流转推出去&#xff0c;但是会涉及到一个问题是&#xff1a;用户客…

人工智能时代开启ai代写模式,让创作变得更加简单!

随着人工智能技术的飞速发展&#xff0c;我们的生活和工作方式正在发生翻天覆地的变化。在这个信息爆炸的时代&#xff0c;内容创作领域也迎来了新的变革——ai代写。这一模式的出现&#xff0c;让文章写作变得更加简单高效&#xff0c;为创作者们打开了新的可能。 一、ai代写的…

短剧影视小程序任意文件读取

1 漏洞描述&#xff1a; 任意文件读取&#xff1a; 在/Ems.php 控制器中的 juhecurl 方法存在curl_exec函数&#xff0c;且参数url为用户可控&#xff0c;导致漏洞产生 2 搜索语句&#xff1a; Fofa&#xff1a; "/VwmRIfEYDH.php" 3 漏洞复现&#xff1a; poc …

JVM - 字节码文件详解

文章目录 目录 文章目录 1. 无关性基石 2. Class类文件结构 magic- 魔数 主副版本号 常量池 访问标志 类索引,父类索引与接口索引集合 字段 方法 属性 3. 类加载机制 类的生命周期 类加载过程 加载 连接 验证 准备 解析 初始化 4. 类加载器 类与类加载器…

RT-Thread Nano版本在STM32G474上的快速移植

目录 概述 1 RT-Thread Nano 1.1 Nano版本介绍 1.2 RT-Thread Nano的特点 2 STM32Cube创建项目 2.1 配置参数 2.2 RT-Thread配置 3 RT-Thread适配MCU 3.1 预编译代码 3.2 解决编译错误 3.2.1 配置OS_TICK 3.2.2 使能finsh_config.h 3.3.3 移植FINSH 3.3 配置TICK …

《黑神话:悟空》专题合集MOD/修改器/壁纸/音乐/CG剧情

《黑神话&#xff1a;悟空》专题合集」 链接&#xff1a;https://pan.quark.cn/s/d67857f4e308 包含内容: 《黑神话&#xff1a;悟空》MOD合集 《黑神话&#xff1a;悟空》修改器&#xff08;风灵月影&#xff09; 《黑神话&#xff1a;悟空》壁纸合集 《黑神话&#xff1…