我是靠谱客的博主 活泼香氛,最近开发中收集的这篇文章主要介绍Cortex-M0反汇编中关于PC的理解一、关于Cortex-M0的基础知识二、关于PC值的理解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、关于Cortex-M0的基础知识

1、指令集

CortexM0是CortexM家族中的微处理器核心,其拥有最低闸数、最低功耗以及强悍性能的优异表现。CortexM0为32位、3级流水线的RISC处理 器,其核心与 ARM7同为
冯·诺依曼(Von Neumann)架构,采指令和数据共享同一总线的设计。
CortexM0同时支持了Thumb和部分的Thumb2指令集,核心不论是在正常程序执行还是处理中断异常模式均保持在单一Thumb状态下执行,免去了不 必要的状态切换,
大幅地节省了执行时间和指令码大小。Thumb指令集为一16位长度之指令码,为ARM指令集之子集,程序代码密度提高了一倍,但可能需要更多的指令去执行相
同的任务,所以造成了性能的下降。

2、流水线架构

CortexM0为32位、3级流水线RISC处理器,其核心与ARM7同为冯·诺依曼(Von Neumann)架构,采指令和数据共享同一总线的设计。
 
从图中可以看出,一条汇编指令的运行有三个步骤,取指、译码、执行,当第一条汇编指令取指完成后,紧接着就是第二条 指令的取指,然后第三条...如此
嵌套 PC总是指向当前正在"取值"所对应的地址,而不是当前正在执行代码所对应的位置。

二、关于PC值的理解


1、LDR命令的理解

(1)LDR命令


关于“Rt = 存储器[字对齐(PC + 4)] + 零展开(#immed8<<2)” 的理解:
(A)PC值是当前正在执行命令的地址+4(三级流水线),即PC总是指向当前正在取指的地址。
PC是32位,需要按字对齐,即要求其最低两bit为0。
(B)#immed8<<2中,immed8指的是机器码的低字节。

以上述图片中其中一行反汇编代码为例,进行举例说明:
代码地址 机器码 汇编代码 (pc+40)所对应的地址
0x000000D4    480A        LDR  r0, [pc,#40];    @0x00000100
其中机器码“480A”中的“A<<2”对应immed8,即immed8 = (0x0A<<2)=40。
下面是一个类似的示例:

(2)PC值

谈谈PC值的计算方法,PC值=当前正在执行指令所在地址+4,加4的原因是Cortex-M0内核使用的是3级流水线结构,且采用的是16位的THUMB指令,
按16位数据进行取指(即PC每次加2),由于是3级流水线结构,在指令中使用到的PC值的时候实际上PC已经指向第三条指令地址了,所以要加4。
至于在各个内核的处理器中汇编代码是否能够通用的问题,也能解决,原因是我们实际在写汇编代码的时候几乎是不会用到PC作为基址的寻址方式(除非
是自找难受或者是对所写程序了如指掌的大神),编译器会在编译的时候自动处理,所以不会存在由于流水线级数不同而导致的代码不通用的问题。

(3)关于0x000000D4位置"LDR r0,[pc,#40];@0x00000100"的理解:

LDR  R0 , =0x50000100,使用的是32位立即数寻址方式;但是经过Keil编译之后的汇编代码却是:LDR  r0 , [pc , #40],使用 的是基于PC寄存器的基址寻址方
式,也就是说编译器在编译时会自动去选择合适的方式来实现相同的功能,而且从我了解到的资料中,大部分的立即数寻址方式在最终生成的代码中其实都是基
于“文字池”,然后使用PC作为基址的寻址方式。    

2、PC值与当前正在执行命令所在地址的关系(以Cortex-M0为例进行说明)

在实际的调试过程中,PC的取值并不是每次都是当前正在执行命令的地址+4,偶尔是当前正在执行命令的地址+2,让我困惑了很久。
后来突然想到PC是32位,要求以字对齐,联想是不是和当前正在执行命令的地址有关。查看几处反汇编代码,和我理解的一致,但不知道是不是最根本的原因。
如果我的理解有误,也希望达人能够指正。
下面的图片中标记了PC取值不同的地方:




参考网址:http://bbs.eeworld.com.cn/forum.php?mod=viewthread&tid=590498&page=1#pid2277686
http://blog.csdn.net/he_ning/article/details/37569779
http://blog.csdn.net/lee244868149/article/details/49488575

最后

以上就是活泼香氛为你收集整理的Cortex-M0反汇编中关于PC的理解一、关于Cortex-M0的基础知识二、关于PC值的理解的全部内容,希望文章能够帮你解决Cortex-M0反汇编中关于PC的理解一、关于Cortex-M0的基础知识二、关于PC值的理解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部