ARM汇编指令-STMFD/LDMFD

发布者:RainbowMelody最新更新时间:2024-12-23 来源: cnblogs关键字:ARM  汇编指令  STMFD  LDMFD 手机看文章 扫描二维码
随时随地手机看文章

  根据调用规则ATPCS,程序一般都使用FD(FullDescending)类型的数据栈(满栈),那么对立的就由空栈类型的数据栈。空栈是指SP操作完后指向的地址空间是未使用的,反之满栈就是SP指向的地址已经使用了。所以对应到压栈出站时的操作就有一点点不一样。如果是满栈模型则会先执行栈指针的操作后在向栈指针指向的位置写入,反之就是先写入在移动栈指针。这里先要明确数据传输语法的基本语法格式。


数据传输指令语法格式:


CMD{cond}  Rn{!}, reglist{^}


CMD  为命令有LDM*/STM* 

cond  为条件码(可选)

Rn    为基址寄存器

{!}   可选后缀,选用后缀后表示请求回写,即当数据传输完成后将最后的地址写入到基址寄存器Rn中,不选用则基址寄存器内容不改变

{^}  该后缀表示后面的寄存器都是用户模式下的寄存器;其次当CMD为LDM且寄存器列表中包含R5(PC)时,除正常传输数据还需要将SPSR复制到CPSR


LDM和STM还分为两种情况,一种是普通数据传送,还有一个是用于堆栈的操作时。


普通数据传输过程中使用IA IB DA DB区别基址的移动方向,其中A和B分别表示befor和after,I和D分别表示Increment和Decrement。


xxxIA     传送后地址增加4

xxxIB     传送前地址增加4 

xxxDA     传送后地址减少4

xxxDB     传送前地址减少4 

用于堆栈时用FD,ED,FA,EA来区别栈操作的方式其实就是区别一下方式是相同的。F表示Full (满栈)而E表示Empty(空栈)。A表示Ascenging(递增),D表示Descending(递减)。组合起来就是:


xxxFD  满栈递减栈(ARM核通常时这种)

xxxFA   满栈递增栈

xxxED  满栈递减栈

xxxEA  空栈递增栈

总结一下就是如下:


LD : load 加载,出栈操作

ST : store 存储,入栈操作

M : multi 多次

F: full 满栈,SP指向最后一个数据

E: empty 空栈,SP指向与最后一个数据相邻的下一个可写入存储单元

D: descending 递减,代表栈的增长方向

A: ascending 递增,代表栈的增长方向


STMFD/LDMFD指令详解


STMFD  SP,{R0-R3}


;执行伪指令大致是:

;SP-4  = R3

;SP-8  = R2

;SP-12 = R1

;SP-16 = R0

;SP 的值未修改。


LDMFD  SP,{R0-R3}

;执行伪指令大致是:

;R3 = SP-4  

;R2 = SP-8  

;R1 = SP-12

;R0 = SP-16 

;SP 的值未修改。


STMFD  SP!,{R0-R3}

;执行伪指令大致是:

;SP-=4 

;SP = R3

;SP-=4 

;SP= R2

;SP-=4 

;SP= R1

;SP-=4 

;SP = R0

;SP-=4 

;SP 的值已修改。


STMED  SP!,{R0-R3}

;执行伪指令大致是:

;SP = R3

;SP-=4 

;SP= R2

;SP-=4 

;SP= R1

;SP-=4 

;SP = R0

;SP-=4 

;SP 的值已修改。


参考:


http://blog.chinaunix.net/uid-28458801-id-3791987.html


https://blog.csdn.net/stephenbruce/article/details/51151147


https://www.jianshu.com/p/aa4695b6bc26


https://blog.csdn.net/weiwei_xiaoyu/article/details/20563479


关键字:ARM  汇编指令  STMFD  LDMFD 引用地址:ARM汇编指令-STMFD/LDMFD

上一篇:ARM cache 工作方式
下一篇:u-boot 移植 --->7、u-bootl流程粗线条梳理

推荐阅读最新更新时间:2026-03-25 12:53

嵌入式开发学习(4)<ARM汇编指令集详解>
数据传送指令:   MOV 两个寄存器之间传递。例 MOV r1,r0,将寄存器r0中的内容赋值给r1。   MVN 同MOV用法一样,区别是MOV是原值传递,而MVN是按位取反后传递。 算数运算指令:   ADD SUB RSB ADC SBC RSC 逻辑指令:   AND ORR EOR BIC   BIC的用法:BIC r0,r1,#0x1f,将r1中的数的bit0到bit4清零后赋值给r0;为什么是bit0到bit4呢,这个是由#0x1f来决定,#0x1f有五个bit位是1。如写成#0xf,就有四个bit位是0。 比较指令:   CMP CMN TST TEQ 比较指令用来比较两个寄存器中的数。特点:比较指令不用后加S后
[单片机]
ARM汇编指令集的特点
8种寻址方式 寄存器寻址 mov r1,r2 立即寻址 mov r#0xFF00 寄存器移位寻址 mov r0,r1,lsl #3 寄存器间接寻址 ldr r1, 基址变址寻址 ldr r1, 多寄存器寻址 ldmia r1!,{r2-r7,r12} 堆栈寻址 stmfd sp!,(r2-r7,lr) 相对地址 flag:beq flag 指令后缀 B(byte) 功能不变,操作长度变为8位 H(half word) 功能不变,操作长度变为16位 S(signed) 功能不变,操作长度变为有符号 如ldr、ldrb、drh、ldrsb、 S(S标志) 功能不变,影响CPSR标
[单片机]
【s3c2440】第二课:arm汇编指令
s3c2440 arm汇编指令以及使用示例 首先需要了解s3c2440CPU内部的寄存器有哪些: CPSR/SPSR寄存器格式: arm指令 (1)运算指令 (2)跳转指令 (3)协处理器相关指令 (4)数据转移指令 tips: db(Decrement Before):先减后存 ib(Increment Before):先增后存 da(Decrement After):先存后减 ia(Increment After):先存后增 (5)异常处理指令
[单片机]
【s3c2440】第二课:<font color='red'>arm</font><font color='red'>汇编指令</font>
汇编指令ARM体系机构)
常用汇编指令 1、ARM状态下的通用寄存器和程序计数器 (1)ARM状态下各工作模式使用的寄存器 (2)当前程序状态寄存器(CPSR) N:结果是否为负数 Z:运算结果是否为0 C:进位/借位/移位溢出 V:溢出标志(Overflow) I:中断禁止位 F:快中断禁止位 T:CPU状态位;置位时,CPU处于Thumb状态;否则处于ARM状态。 M4~M0:工作模式位 中断禁止位:I位和F位属于中断禁止位。它们被置位时,IRQ中断、FIQ中断分别被禁止。 2、ARM指令在机器中的表示格式是用32位的二进制数表示。 ARM中有一条指令为:ADDEQS R0,R1,#8; ARM指令分为5个域: 第1个域:4位 的条件码
[单片机]
<font color='red'>汇编指令</font>(<font color='red'>ARM</font>体系机构)
ARM 汇编指令 ADR 与 LDR 使用
简介 这两个都是伪指令:ADR 是小范围的地址读取伪指令,LDR 是大范围的读取地址伪指令。可实际使用的区别是: ADR 是将基于 PC 相对偏移的地址值或基于寄存器相对地址值读取的伪指令,而 LDR 用于加载 32 位立即数或一个地址到指定的寄存器中。 以下面的汇编代码为例: .global _start _start: ldr r0, loop adr r0, loop ldr r0, =loop loop: nop 用以下命令完成汇编、链接操作,并输出反汇编文件 # arm-linux-gcc asm.S -o asm.o -c # arm-linux-ld -Ttext 0x1004 asm
[单片机]
ARM汇编指令集1
(汇编)指令是CPU机器指令的助记符,经过编译过会得到一串0011组成的机器码,可以由CPU读取执行。 (汇编)伪指令本质不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。 两种不同风格的ARM指令 --ARM官方的ARM汇编风格:指令一般用大写,Windows中的IDE开发环境(如ADS、MDK)常用。如:LDR R0, --GNU风格的ARM汇编:指令一般用小写字母、Linux中常用。如:ldr r0, ARM 汇编的特点1:LDR/STR架构 --ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容载入CPU中通用寄存器
[单片机]
ARM汇编文件的组成和汇编指令类型
ARM汇编文件的组成 指令:编译完成后作为一条指令(机器码)存储在内存单元中,CPU执行时能够完成处理的操作 伪指令:在编译时替换成能被识别的ARM指令 伪操作:知道编译器进行编译,编译完成后不生成指令,也不占用内存空间。 ARM汇编指令类型 数据处理指令 跳转指令:实现程序执行过程中的跳转 Load/Store指令:CPU与内存数据之间的操作指令 状态寄存器存送指令:对状态寄存器操作(只能使用这些指令对状态寄存器操作) 协处理器指令:对协处理器进行操作 异常产生指令:产生异常(软中断),实现模式切换
[单片机]
ARM汇编指令的速查表、特点和格式
理解汇编指令的特点,对于汇编指令助记符记忆、理解以及使用帮助很大,请重视! 0.1 指令与伪指令 汇编指令-CPU机器指令的助记符,经过编译后会得到一串1和0组成的机器码,可以由CPU读取执行。 汇编伪指令-编译器环境提供的,用来指导编译过程的“指令”,本质上不是指令,仅是与汇编指令写在一起,经过编译后伪指令不会生成机器码。 0.2 两种不同风格的ARM指令 ARM官方风格ARM汇编:指令一般用大写字母、Windows中的IDE开发环境(如ADS、MDK等)常用。如: LDR R0, GNU风格ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0, 0.3 ARM汇编指令的特点 0.3.1 LDR/STR架构 A
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved