ARM 寻址举例(19)

举例: 计算一个数组的所有元素的和。

	area first, code, readonly                                code32entry
startldr r0,=array
;	adr r0,array   ;ADR为小范围的地址读取伪指令
loopldr r1,[r0],#4cmp r1,#0addne r4,r4,r1bne loop
stopb stop; DCD 伪操作  数据缓冲池技术   ; dcd  机器码
arraydcd 0x11dcd 0x22dcd 0

首先是关于 dcd 指令的解释, dcd是一个 伪指令, 表示 在内存中分配一篇连续的单元,并且复制。

ldr r0, =array , 代表的是 加载 array 的地址 到r0 寄存器。相当于 C语言的 & 符号。

ldr r1, [r0], #4, 表示,将r0 的内容放到r1 , 并且r0 加4,

然后比较r1 是不是等于0 , 如果等于0 就代表已经到数组的最后了,就进入死循环,

如果不是0 , 那么就把 和 放到r4 的寄存器中。

然后是第二个例子: 内存的压栈与出栈。

    area first, code, readonly                               code32entry
Start;mov r0, #0x40000000ldr sp, =0x40001000  ;注意地址mov r1, #0x11mov r2, #0x22mov r3, #0x33mov r5, #0x55; 压栈stmfd sp!, {r1-r3, r5};stmia r0!, {r1-r3, r5} ; 加感叹号是自动修改基地址mov r1, #0 mov r2, #0mov r3, #0mov r5, #0ldmfd sp!, {r1-r3, r5};ldmdb r0!, {r2,r1,r3, r5} ; 寄存列表书写顺序无所谓, 低地址内容对应低编号寄存器 
stop b stop end

这里需要 说明的是  两个指令

STMFD 指的就是 进行压栈, LDMFD指的就是出栈。

ldr  sp, =0x40001000 , 值得是在 设置栈指针。

stmfd sp!, {r1,-r3,r5}, 这里代表的是,将寄存器组的数据,压栈到 sp 指针指向的地方,并且, sp 指针,需要同步向下走。

注意: r1,r2,r3,r5 ,在往内存中压栈的时候, 顺序是这样的, 内存中的低地址,存放的是 低标号的寄存器的值。

ldmfd sp! ,{r1-r3,r5} , 代表的是,出栈的操作, 出栈的顺序也是, 低地址的内存的值,对应的是低标号的寄存器。

这样的话,就可以完美的回复到之前压栈的寄存器中。

在然后的例子就是函数的嵌套调用。

 	area first, code, readonly                   code32entry
startldr sp, =0x40002000mov r1, #0x11mov r2, #0x22mov r3, #0x33mov r5, #0x55bl child_func1        ; 【先写跳转到 child_func1,再写跳转到child_func】	add  r0, r1,r2
stop b stop 
; 非叶子函数	
child_funcstmfd sp!, {r1-r3,r5,lr} ;;;在子函数里首先将所有寄存器值压栈保存,;;防止在子函数里篡改原本在主函数里运算需要的值,;;通常需要把r0-r12全都保存,为了安全和程序通用性应该这么做mov r1, #10       ;;在这里子函数想怎么做自己的事情就可以做自己的事情bl child_func1ldmfd sp!, {r1-r3,r5,lr};;;;; 放在主函数bl之后的第一句行吗?mov pc, lr
child_func1stmfd sp!, {r1-r3,r5};;;不论嵌套多少层子函数,都是先压栈,mov r1, #11ldmfd sp!, {r1-r3,r5};;对应的,在返回到自己的父函数之前将自己出栈mov pc, lrend

ldr sp, =0x40002000 ,这是在设置栈指针。

bl  child_func1 这是在进行跳转,这里有个隐含的操作,cpu 会自动的把下一条 PC指针的值, 放到LR寄存器中。

stmfd sp! , {r1-r3,r5,lr} , 这是在压栈, 这里特别提到了,lr ,这是把函数返回的PC值, 也压栈了。

bl child_func1  , 与之前的操作是一样的。

然后就是 返回的操作了。

ldmfd sp!, {r1-r3,r5}  这是在进行出栈了。

mov pc, lr ,这个指令就是在返回了。

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

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

相关文章

深入理解Seaborn库的高级功能(二)

Seaborn作为Python中一个功能强大的可视化库,建立在matplotlib的基础之上,提供了更高级的API,使得数据可视化的创建过程更为简便和直观。在实际的数据分析工作中,Seaborn不仅可以帮助我们快速绘制高质量的图表,还能通过丰富的图形种类和调色板选项,让数据展示更加生动、清…

javaee、ssm(maven)、springboot(maven)项目目录结构以及编译后文件目录存放路径

javaee项目目录结构: src下的文件或者是源码编译后都会放在WebRoot(项目根目录)文件夹\WebRoot\WEB-INF\classes目录中。 编译后的文件夹目录如下: 以上为普通的javaee项目目录结构,同maven工程目录结构是不一样的。…

Electron 项目实战 03: 实现一个截图功能

实现效果 实现思路 创建两个window,一个叫mainWindow,一个叫cutWindowmainWindow:主界面用来展示截图结果cutWindow:截图窗口,加载截图页面和截图交互逻辑mainWindow 页面点击截图,让cutWIndow 来实现具体…

实习项目|苍穹外卖|day1

碎碎念 眨眼间,留给自己的时间不多了。想要去好的公司实习,现在是八股不会背,算法题全忘,跟了好多教程,也没有能写上简历的项目。因此,我决定用两个月的时间学习两个能够写到简历上的项目(的确…

Android Studio:模拟器页面闪烁,手机模拟器输入画面闪烁 android studio闪屏

主要解决,android studio 启动app测试,输入数据时,手机画面就会闪烁,闪屏 1. 如图所示,依照顺序找到Edit ,并点击Edit 2. 找到Graphics 选择为SoftWare ,并保存修改即可 3. 如果此处不能选择S…

国内AI工具分类大盘点,这些神器你都用过了吗?

AI爆发到现成已经快2年了,基本上我自己也使用了近2年的AI产品。国内、外的AI产品体验了很多。 从最初文本聊天类的gpt、new bing、文心一言、通义千问,到后面绘图类Midjourney、Stable Diffusion、文心一格、通义万相等等。 在这里来分享我自己使用的一…

jmeter连接mysql数据库以及常规用法

1、在jmeter中新建一个测试计划,在测试计划界面中点击浏览,选择连接mysql数据库的jar包 如果没有jar包可以去网上下载,也可以通过如下链接进行下载 链接: https://pan.baidu.com/s/1BI6f19KSzXGlkSOwbnequw 提取码: gn8e 2、然后创建线程组&a…

SpringBoot日常:Spring之@PostConstruct解析

简介 spring的Bean在创建的时候会进行初始化,而初始化过程会解析出PostConstruct注解的方法,并反射调用该方法。 PostConstruct 的使用和特点 只有一个非静态方法能使用此注解;被注解的方法不得有任何参数;被注解的方法返回值必…

npm登录

npm 登录问题 npm login --auth-typelegacy报错 原因 npm源非npm本身源,需要切换: 查看源 nrm ls切换为npm源 nrm use npm重新登录 输入OTP验证后登录成功:

python从入门到精通:数据可视化-图形开发

1、json数据格式 • Json是一种轻量级的数据交互格式,可以按照Json指定的格式去组织和封装数据 • Json本质上是一种带有特殊格式的字符串 主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互&#xf…

【DSP+FPGA】基于2 个TMS320C6678+ XC7VX690T FPGA 的6U VPX 总线架构的高性能实时信号处理平台

6U VPX架构,符合VITA46规范板载 2 个TMS320C6678 多核DSP处理节点板载 1 片 XC7VX690T FPGA处理节点板载 2 个FMC 接口背板之间具有 4 路 x4 高速 GTH 互联,支持RapidIO、PCI ExpressFPGA 与 DSP 之间采用高速Rapid IO互联 基于6U VPX架构的高性能实时信…

BERT:Pre-training of Deep Bidirectional Transformers forLanguage Understanding

个人觉着BERT是一篇读起来很爽的论文 摘要 我们引入了一种新的语言表示模型BERT,它代表Bidirectional Encoder Representations from Transformers。与最近的语言表示模型不同(Peters et al., 2018a;Radford et al., 2018), BER…

组合式API-reactive和ref函数,computed计算属性,watch函数

一.reactive&#xff08;&#xff09;接收一个对象类型的数据&#xff0c;返回一个响应式的对象&#xff1a; <script setup> import {reactive} from vue const state reactive({count:100 }) const setCount () > {state.count } </script> <template>…

书生大模型实战营第三期进阶岛第三课——LMDeploy 量化部署实践

LMDeploy 量化部署实践 任务一&#xff1a;创建虚拟环境创建文件夹LMDEPLOY用于存放课程相关的文件创建模型软连接LMDeploy验证启动模型文件LMDeploy API部署InternLM2.5-1.8b以命令行形式连接API服务器以Gradio网页形式连接API服务器LMDeploy KV量化W4A16 模型量化和部署W4A16…

学习日志28

论文阅读&#xff1a;Quantum speed-ups in reinforcement learning 量子强化学习&#xff08;Quantum Reinforcement Learning, QRL&#xff09;是一种结合了量子计算和强化学习的方法&#xff0c;旨在利用量子力学的原理来加速和优化智能体的学习过程。量子加速则是指利用量子…

valgrind安装及使用

安装 下载源码下载地址 tar -jxvf valgrind-3.23.0.tar.bz2 cd valgrind-3.23.0 ./autogen.sh ./configure --prefix安装目录 make make install使用文档 官方文档

create-react-app 移除 ESLint 语法检查

ESLint 的作用&#xff1a; ESLint 是一个流行的 JavaScript 代码静态检查工具&#xff0c;旨在帮助开发者识别和修复代码中的问题。以下是关于 ESLint 的一些关键信息&#xff1a; 主要功能&#xff1a; 1.代码风格检查&#xff1a;ESLint 可以检查代码是否符合特定的编码风…

mysql 数据区备份

第一步 &#xff0c;进入mysql窗口锁住数据库&#xff08;不锁的可以只执行第二步&#xff09;&#xff1a; use dbName-- 使用xx数据库flush tables with read lock; -- 锁住数据库。第二步&#xff1a;打开cmd窗口&#xff0c;或者liunx命令行窗口 C:\Users\User>mysqld…

经典算法之链表篇(二)

目录 一&#xff1a;重排链表&#xff08;LeetCode.143&#xff09; 二&#xff1a;删除链表的节点&#xff08;LCR 136. 删除链表的节点&#xff09; 三&#xff1a;K个一组反转链表&#xff08;LeetCode.25&#xff09; 有关经典算法链表的第一篇内容&#xff0c;可以查看我…

ESXi服务器无法安装Windows11:“不符合此版本的Windows所需最低系统要求“

目录 一、问题描述1.使用环境2.问题截图3.问题解析 二、解决方法Ⅰ1.按 ShiftF10 弹出命令提示符2.在弹出的Dos框中输入regedit&#xff0c;回车&#xff0c;进入注册表。3.打开HKEY_LOCAL_MACHINE\SYSTEM\Setup&#xff0c;并新建 LabConfig 的项&#xff0c;在 LabConfig 下创…