STM LDM汇编批量加载指令的错误用法

一、背景

在调试程序过程中,遇到一个问题,程序入栈出栈后,总是跑飞,用gdb调试,发现入栈操作后,查看入栈后的数据在出栈时不对应。

二、分析内容

1、

STMFD   SP!,    {R0-R12, R1}

以前理解是,先入栈R1,然后在依次递减入栈R12--->R0, 理论上 一共入栈14个数据

反编译后,发现竟然少了一个,入栈13个数据

反编译的汇编如下:

23e062fc: e92d1fff
push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}

2、

如果把上面改成两部操作

STMFD   SP!,    {R1}

STMFD   SP!,    {R0-R12}

反编译后:

23e062fc: e92d0002
push {r1}

23e06300: e92d1fff
push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}

这样,在出栈时就没有问题

3、

如果这样入栈

STMFD   SP!,    {LR,R0-R12}

反编译后:

23e062fc: e92d5fff
push {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}

三、总结

通过这个现象发现 {。。。。。}里面的寄存器,应该是按照从小到大的顺序排列,如果有重复的寄存器,将会直接忽略掉。

所以在批量load或store时,应注意避免,或者分几步load或者store。

时间: 2024-07-30 10:17:14

STM LDM汇编批量加载指令的错误用法的相关文章

ARM汇编- LDR加载指令,LDR伪指令

1,ldr加载指令LDR指令的格式为:LDR{条件}  目的寄存器,<存储器地址>LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中.该指令通常用亍从存储器中读取32位的字数据到通用寄存器,然后对数据迕行处理.当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转.该指令在程序设计中比较常用,丏寻址方式灵活多样,请读者认真掌握.指令示例: LDR R0,[R1]                                     

【转】arm汇编—ldr加载指令,ldr伪指令

1,ldr加载指令 LDR指令的格式为:LDR{条件}  目的寄存器,<存储器地址>LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中.该指令通常用亍从存储器中读取32位的字数据到通用寄存器,然后对数据迕行处理.当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转.该指令在程序设计中比较常用,丏寻址方式灵活多样,请读者认真掌握.指令示例:LDR R0,[R1]         :将存储器地址为R1的字数据读入寄存器R0.LDR R0

arm汇编—ldr加载指令,ldr伪指令

分类: 嵌入式 2014-01-17 17:15:20 操作系统:ubuntu10.04汇编语言:arm 1,ldr加载指令LDR指令的格式为:LDR{条件}  目的寄存器,<存储器地址>LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中.该指令通常用亍从存储器中读取32位的字数据到通用寄存器,然后对数据迕行处理.当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转.该指令在程序设计中比较常用,丏寻址方式灵活多样,请读者认真掌握.指

ARM中LDR伪指令与LDR加载指令

ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令. LDR伪指令的形式是“LDR Rn,=expr”.下面举一个例子来说明它的用法. COUNT EQU       0x40003100 …… LDR       R1,=COUNT MOV      R0,#0 STR       R0,[R1] COUNT是我们定义的一个变量,地址为0x40003100.这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法. LDR       R1,=COUNT是将C

Android之批量加载图片OOM问题解决方案

一.OOM问题出现的场景和原因 一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题.那么如何彻底解决这个问题呢?本文将具体介绍这方面的知识. 首先我们来总结一下,在加载图片过程中出现的OOM的场景无非就这么几种: 1.  加载的图片过大 2.  一次加载的图片过多 3.  以上两种情况兼有 那么为什么在以上场景下会出现OOM问题呢?实际上在API文档中有着明确的说明,出现OMM的主要原因有两点: 1.移动设备会

遭遇sql server 2005 启动包未能正确加载需要重新安装错误,重装.NET FRAMEWORK经历分析

开发的机器,系统情况如下: 1.server 2003 sp2 x86 2.补丁安装360 3.升级到IE8 因为担心server 2003 sp2 不能够自动update,最近都是用360打补丁,比较快,但是问题很多,首先是.NET 2.0 SP2的更新会引起IIS6.0 的崩溃,然后就是SQL SERVER 2005 MANAGEMENT STUDIO 的启动失败,又不想重装系统,找了很多的工具,最重要的windows installer clean up.cleanup_tool,步骤如下

VS2013 编译程序时报无法加载PDB文件错误解决方案

vs2013运行c++出现:无法查找或打开 PDB 文件. "ConsoleApplication1.exe"(Win32): 已加载"C:\Users\hp\Documents\Visual Studio 2013\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe".已加载符号. "ConsoleApplication1.exe"(Win32): 已加载"C:\Win

[译文]JOAL教程 第六课 高级加载方式与错误处理

[译文]JOAL教程 原文地址:http://jogamp.org/joal-demos/www/devmaster/lesson6.html 原文作者:Athomas Goldberg 译文:三向板砖 转载请保留以上信息. 本次课程对应的学习笔记:http://blog.csdn.net/shuzhe66/article/details/40303739 第六课 高级加载方式与错误处理 本文是DevMaster.net(http://devmaster.net/)的OpenAL教程对应的JOA

Vue 自定义图片懒加载指令v-lazyload

Vue是可以自定义指令的,最近学习过程中遇见了一个需要图片懒加载的功能,最后参考了别人的代码和思路自己重新写了一遍.以下将详细介绍如何实现自定义指令v-lazyload. 先看如何使用这个指令: <img v-lazyload="imageSrc" > imageSrc是要加载的图片的实际路径. 为了实现这个指令,我们首先单独建立一个文件,名字为lazyload.js.并填写基本的代码,如下: //Vue 图片懒加载,导出模块 export default (Vue , o