首页 > 其他分享 >嵌入式:堆栈寻址、相对寻址与ARM指令总结

嵌入式:堆栈寻址、相对寻址与ARM指令总结

时间:2022-12-19 13:33:04浏览次数:45  
标签:寻址 R7 嵌入式 地址 指令 寄存器 堆栈 ARM

堆栈寻址

堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针(SP)的专用寄存器(R13)指示当前的操作位置,堆栈指针总是指向栈顶。

当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。

根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。

堆栈工作方式

这样就有四种类型的堆栈工作方式

  • 满递增堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。
  • 满递减堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。
  • 空递增堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
  • 空递减堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成

堆栈寻址的实现

(1)在ARM指令中,堆栈寻址是通过Load/Store指令来实现的,如:

STMFD  SP!,{R1-R7,LR} ;将R1-R7,LR入栈
LDMFD SP!,{R1-R7,LR} ;数据出栈,放入R1-R7,LR

(2)在Thumb指令中,堆栈寻址通过PUSH/POP指令来实现,如:

PUSH   {R1-R7,LR} ;将R1-R7,LR入栈 
POP {R1-R7,PC} ;数据出栈,放入R1-R7,PC

相对寻址

与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:

BL  NEXT      ;跳转到子程序
; NEXT处执行
……
NEXT
……
MOV PC,LR ;从子程序返回

ARM指令详细介绍

ARM指令集总体分为以下6类:

  • 数据处理指令;
  • Load/Store指令;
  • 程序状态寄存器与通用寄存器之间的传送指令;
  • 转移指令;
  • 异常中断指令;
  • 协处理器指令。

ARM 指令及功能描述

数据处理指令(22条)

助记符

指令功能描述

ADC

带进位加法指令

ADD

加法指令

SUB

减法指令

SBC

带借位减法指令

RSB

逆向减法指令

RSC

带借位的逆向减法指令

CMP

比较指令

CMN

负数比较指令

MUL

32位乘法指令

MLA

乘加运算指令

UMLL

无符号数长乘

助记符

指令功能描述

UMLAL

无符号数长乘累加

SMULL

有符号数长乘

SMLAL

有符号数长乘累加

AND

逻辑与指令

ORR

逻辑或指令

EOR

异或指令

BIC

位清零指令

TST

位测试指令

TEQ

相等测试指令

MOV

数据传送指令

MVN

数据取反传送指令

Load/Store指令(5条)
状态寄存器与通用寄存器之间的传送指令(2条)
转移指令(4条)

助记符

指令功能描述

LDR

存储器到寄存器的数据传输指令

STR

寄存器到存储器的数据传输指令

LDM

加载多个寄存器指令

STM

批量内存字写入指令

SWP

交换指令

MRS

传送CPSR或SPSR的内容到通用寄存器指令

MSR

传送通用寄存器到CPSR或SPSR的指令

B

跳转指令

BL

带返回的跳转指令

BX

带状态切换的跳转指令

BLX

带返回和状态切换的跳转指令

异常中断产生指令(3条)
协处理器指令(5条)

助记符

指令功能描述

SWI

软件中断指令

BKPT

端点指令

CLZ

前导0计数指令

CDP

协处理器数据操作指令

LDC

存储器到协处理器的数据传输指令

STC

协处理器寄存器写入存储器指令

MRC

从协处理器寄存器到ARM寄存器的数据传输指令

MCR

从ARM寄存器到协处理器寄存器的数据传输指令

参考文献:

孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017.

标签:寻址,R7,嵌入式,地址,指令,寄存器,堆栈,ARM
From: https://blog.51cto.com/u_15736437/5951957

相关文章

  • Pycharm签名
    有了签名,可以知道一些基本信息。签名如下#-*-coding:utf-8-*-"""@time:${DATE}${TIME}@File:${NAME}.py@Software:${PRODUCT_NAME}@Author:qi......
  • 嵌入式:ARM间接寻址、变址寻址与多寄存器寻址
    寄存器间接寻址寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:LDRR0,[R1]/*R0←[R1]*/STRR0,[R1]/*[R1]←R0*/第一条......
  • 自学HarmonyOS应用开发(54)- 校正定位偏差
    上一篇文章已经介绍了如果获取当前所在位置的方法,这种方法存在一个问题:和实际位置之前存在500米左右的偏差。原因调查经过一番调查,结论是gps信号使用的是WGS-84坐标系,而高德......
  • ARM Neon 简介
    “ARMAdvancedSIMD”,nick-named,itprovides:    (1)、Asetofinterestingscalar/vectorinstructionsandregisters(thelatteraremappedtothesamechi......
  • (给大家科普一下)皇家国际游戏网址(hj8828.vip)开源OpenHarmony已推出14个行业发行版
    开源OpenHarmony已推出14个行业发行版IT之家8月8日消息,据财联社报道,华为HarmonyOS设备数加上鸿蒙智联设备数已突破4.7亿台,此前华为正式发布了HarmonyOS3系统。目......
  • (给大家科普一下)皇家国际游戏网址(hj8828.vip)诚迈科技落子OpenHarmony,
    诚迈科技落子OpenHarmony,隆重发布鸿诚志远(HongZOS)发行版11月3日,诚迈科技(南京)股份有限公司(以下简称“诚迈科技”)在东莞松山湖成功举办“鸿雁于飞·至诚志远——开源鸿蒙·诚......
  • earmusic任意文件读取漏洞[代码审计]
    怎么发现的,我也不懂啊。师傅怎么说,我跟着照做,毕竟技术不到位啊。功能点分析,反正这个下载的按钮可以存在漏洞。复现过程概述这个漏洞产生在用户端,首先去注册一个用户......
  • Pycharm异常处理
    异常处理&调试(类与对象再讲调试)异常:在运行代码过程中遇到的任何错误,大有error字样的都为异常异常处理:对代码中所有可能会出现的异常进行处理疑问:我们为什么要处理异常?......
  • 在不同电脑间同步pycharm的配置
    备份文件同步法最传统的方法就是把配置文件备份,然后在其它电脑上通过导入的方式来恢复,这种方法在很多软件中都实测可行。具体对应到pycharm中,可以在pycharm菜单栏file-......
  • 【数学模型】基于ARMR模型模拟风速附matlab完整代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......