当前位置: 首页 > news >正文

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

一、编程模型

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内部

startldr sp, =0x40001000mov r0, #1mov r1, #2mov r2, #3mov r3, #4bl funfunmov r0,#1mov r1,#2add r2,r0,r1mov pc ,lr ;调用后返回end

3.2.2外部

(1)export

(2)import

3.2.3传参

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

startldr sp, =0x40001000mov r0, #1mov r1, #2mov r2, #3mov r3, #4mov r4, #5mov r5, #6stmfd sp!, {r4,r5}bl fun		 import c_addbl c_add 

3.2.4嵌套中断

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

	preserve8area reset , code , readonlycode32entry
startldr sp, =0x40001000mov r0, #1mov r1, #2mov r2, #3mov r3, #4import c_addbl c_add ;将当前指令的下一条指令地址保存在LR寄存器,然后跳转。通常用于调用子程序,可通过在子程序的尾部添加mov  pc, lr 返回。nopb startexport asm_add
asm_addstmfd sp!,{r4-r12,lr}	;保护现场	add r0,r0,r1ldmfd 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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Mthrift服务调度
  • Robotframework框架基础
  • 自然语言处理系列五十三》文本聚类算法》文本聚类介绍及相关算法
  • 江协科技STM32学习- P11 中断系统,EXTI外部中断
  • DNS解析与网络通信中的套接字与协议栈工作机制详解
  • 概率学 笔记一 - 概率 - 随机变量 - 期望 - 方差 - 标准差(也不知道会不会有二)
  • Maven使用指南的笔记
  • Class3——Esp32|Thonny——网络连接主机-wifi连接(源代码带教程)
  • 《深度学习》OpenCV轮廓检测 轮廓近似 解析及实现
  • 代码随想录:377. 组合总和 Ⅳ
  • Nginx核心配置文件结构
  • 树莓派3B点灯(2)
  • 翻译器大分享,这5款你选哪款?
  • 鸿蒙(API 12 Beta6版)图形加速【Vulkan平台】超帧功能开发
  • Python游戏编程:用Python打造经典贪吃蛇小游戏
  • [译]如何构建服务器端web组件,为何要构建?
  • canvas 绘制双线技巧
  • Django 博客开发教程 16 - 统计文章阅读量
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript对象详解
  • Js基础——数据类型之Null和Undefined
  • js作用域和this的理解
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Mysql5.6主从复制
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • STAR法则
  • Vim Clutch | 面向脚踏板编程……
  • Vue全家桶实现一个Web App
  • 关于 Cirru Editor 存储格式
  • 关于字符编码你应该知道的事情
  • 记录:CentOS7.2配置LNMP环境记录
  • 日剧·日综资源集合(建议收藏)
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 使用SAX解析XML
  • 我这样减少了26.5M Java内存!
  • 一、python与pycharm的安装
  • postgresql行列转换函数
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #pragma预处理命令
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • ( 10 )MySQL中的外键
  • (23)Linux的软硬连接
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (十三)Flink SQL
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .Net 6.0 处理跨域的方式
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET MVC之AOP