MOV PC,LR

BL NEXT ;跳转到子程序

......... ;NEXT处执行

NEXT

..........

MOV PC,LR ;从子程序返回

这里的BL是跳转的意思,LR(R14)保存了返回地址

PC(R15)是当前地址,把LR给PC就是从子程序返回

这里有一下总结

首先

1.SP(R13) LR(R14)PC(R15)

2.lr(r14)的作用问题,这个lr一般来说有两个作用:

1》.当使用bl或者blx跳转到子过程的时候,r14保存了返回地址,可以在调用过程结尾恢复。

2》.异常中断发生时,这个异常模式特定的物理R14被设置成该异常模式将要返回的地址。

另外注意pc,在调试的时候显示的是当前指令地址,而用mov lr,pc的时候lr保存的是此指令向后数两条指令的地址,大家可以试一下用mov pc,pc,结果得到的是跳转两条指令,这个原因是由于arm的流水线造成的,预取两条指令的结果.

3.》我以前看书不懂的地方

子程序返回的三种方法

现在总结如下

1.MOV PC,LR

2.BL LR

3.在子程序入口处使用以下指令将R14存入堆栈

STMFD SP!,{<Regs>,LR}

对应的,使用以下指令可以完成子程序的返回

LDMFD SP!, {<Regs>,LR}

时间: 2024-10-24 02:55:16

MOV PC,LR的相关文章

ARM MOV PC加8

缘由 今天在分析ARM伪指令ADR,书上说ADR通常会被一条ADD或SUB指令替代实现相同功能.我反汇编了一下确实如此会基于PC相对偏移的地址量读取到寄存器中,可是计算却发现对不上 如上图所示,ADR R2,BOB被指令SUB R2,PC,#0x0C替换. 计算 可是由图可知PC值应该为8,执行完这条语句后指向下一条指令的地址12.可是8-12=-4,得不到结果4.如果要得到4的结果,则PC值应该为16,比理论值大8. 为什么读取PC值时,比预想的大8 查阅手册http://infocenter

ARM 内核SP,LR,PC寄存器

深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益. 1.堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引.这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性. 2.连接寄存器r14(LR):每种模式下r14都有自身版组,它有两个特殊功能. (1)保存子程序返回地址.使用

(转)深入理解SP、LR和PC

网址:http://blog.csdn.net/zhou1232006/article/details/6149548 深入理解ARM的这三个寄存器,对编程以及操作系统的移植都有很大的裨益. 1.堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式.非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引.这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的

ARM寄存器

ARM寄存器 一.ARM工作状态下的寄存器组织 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个位状态寄存器.但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式.但在任何时候,通用寄存器R14~R0.程序计数器PC(即R15).一个状态寄存器都是可访问的. 通用寄存器通用寄存器包括R0~R15,可以分为3类:(1)未分组寄存器R0~R7(2)分组寄存器R8~R14(3)程序计数器PC(R15) 1.未分组寄存器R0~R7在所有运

嵌入式学习笔记101-uboot_1.1.6移植(1)

根据前篇博文(嵌入式学习笔记100-uboot1.1.6初体验)最后的结论,现在开始将其实现: a. 修改makefile的CROSS_COMPILE指定编译器 arm-linux-gcc -v –> gcc version 3.4.5 CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux- chmod -R 777 u-boot-1.1.6/

我的RTOS 之一 --S5PV210 异常向量表基址和软中断测试

1.异常向量表基址 s5pv210 默认指定了异常向量基址0xD003_4700, 当异常比如中断触发时,会自动跳转到基址查找异常处理函数s5pv210 默认指定了异常向量基址0xD003_4700, 当异常比如中断触发时,会自动跳转到基址查找异常处理函数 通过代码可以这样实现,通过代码可以这样实现, #define _Exception_Vector 0xD0037400 #define pExceptionRESET ( *((volatile unsigned long *)(_Excep

Linux Kernel - Debug Guide (Linux内核调试指南 )

http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环

从点亮一个LED开始,Cortex-A9裸机程序设计

电路原理图: 如何点亮一个LED? 通过对原理图进行分析,我们能够发现给三极管的基极加上一个高点平时,三级管be结导通构成通路,此时二极管就点亮了.若要将LED熄灭只需取消高电平输出. 如何使三级管基极获得一个高电平? 控制三极管基极的其实是exynos4412的一个引脚(忽略具体是怎么连接的),因此我们要做的就是: 配置相关寄存器使引脚变为输出功能(这里配置为输出功能 0x1) 配置上下拉(若需要) 操作寄存器改变引脚电平变化 配置带负载能力(若需要) 相关寄存器 配置引脚功能 获取或设置引脚

U-BOOT-2016.07移植 (第一篇) 初步分析

U-BOOT-2016.07移植 (第一篇) 初步分析 目录 U-BOOT-201607移植 第一篇 初步分析 目录 编译和移植环境 更新交叉编译工具 1 下载arm-linux-gcc 443 2 安装arm-linux-gcc 443 安装环境Ubuntu 910 下载u-boot-201607并解压 分析顶层Makefile 1 找出目标依赖关系 2 总结 初次编译u-boot 1 配置 2 编译 分析u-boot启动流程 1 分析startS 2 分析crt0S 3 总结 1. 编译和移