ARM体系结构与汇编指令

ARM体系结构

ARMnTDMI

ARM处理器状态

ARM状态:32位,处理器执行字方式的ARM指令,处理器在系统上电时默认为ARM状态。

Thumb状态:16位,处理器执行半字方式的Thumb指令。

Thumb代码密度大,比arm状态高30%。

ARM处理器模式

29.jpg

ARM寄存器

arm一共有37个用户可访问的32位寄存器,其中有6个32位宽的状态寄存器目前只使用了其中12位。

31个通用寄存器:r0-r15,r13_svc, r14_svc, r13_abt, r14_abt, r13_und, r14_und, r13_irq, r14_irq, r8_fiq, r9_fiq, r10_fiq, r11_fiq, r12_fiq, r13_fiq, r14_fiq。

6个状态寄存器:CPSR, SPSR_svc, SPSR_abt, SPSR_und, SPSR_irq, SPSR_fiq。

arm处理器共有7种不同的处理器模式,每种模式都有一组相应的寄存器组。

<img src="./pic/24.jpg" />


24.jpg

Thumb状态寄存器集是arm状态集的子集。

<img src="./pic/25.jpg" />
25.jpg

1.当前程序状态寄存器

CPSR:当前程序状态寄存器。监视和控制cpu内部操作。

SPSR:程序状态保存寄存器。 用于保存任务在异常发生之前的CPSR状态的当前值。.

<img src="./pic/26.jpg" />


26.jpg

<img src="./pic/27.jpg" />


27.jpg

1.1条件代码标志

1.2控制标志位

I、F:中断禁止标志位。

T:处理器状态位。

M0-M4:处理器模式位。

1.2.1 中断禁止标志位
1.2.2 控制位t
表示了正在操作的状态。   是在Thumb状态下还是在ARM状态下。
1.2.3 模式控制位
不是所有的组合都表示有效的模式。

1.3 保留位

<img src="./pic/28.jpg" />

ARM体系的异常、中断及其向量表

预留......

ARM体系的存储系统

预留......

ARM处理器寻址方式

4.1寄存器寻址

4.2立即寻址

4.3寄存器移位寻址

4.4寄存器间接寻址

4.5基址寻址

4.6多寄存器寻址

4.7堆栈寻址

4.8相对寻址

Thumb汇编指令

Thumb指令集没有协处理器指令、信号量指令以及访问CPSR或SPSR指令。没有乘加指令及64位乘法指令等。

除了分支指令b有条件执行功能外,其他指令均无条件执行。

预留......

ARM汇编指令

1.相对跳转指令:

b、bl:

bl除了跳转之外,还将返回地址(bl的下一条指令的地址)保存在lr寄存器中。他们是位置无关的指令(范围为当前指令的前后32mb)
    b fun1
......
fun1:
    bl fun2
......
fun2:
......

有两种方式实现跳转:1.使用分支指令直接跳转。 2.向PC寄存器赋值实现跳转。

[图片上传失败...(image-aaec3c-1624843219395)]

2.数据处理:传送指令mov,地址读取伪指令ldr

mov :

指令是把一个寄存器的值赋给另一个寄存器,或者把一个常数赋给寄存器。
mov r1, r2
mov r1, #4096

如果传送的数不能确定是否可以使用“立即数”来表示的话,可以使用Ldr命令来赋值。

ldr是伪指令,如果该常数能用立即数表示,则直接使用mov指令,否则编译时将常数放入某个位置,使用内存读取伪指令把它读出来。

ldr r1, =4097       /*r1=4097,将常数赋值给r1*/
ldr r1, =label      /*获取代码的绝对地址*/
label:
......

ldr: 本意为“大范围的地址读取伪指令”

[图片上传失败...(image-4ae443-1624843219395)]

3.内存访问指令:ldr,str,ldm,stm

ldr:既可以是“大范围地址读取伪指令” 也可以是内存访问指令。 当它的第二个参数前面有“=”时,表示伪指令,否则表示内存访问指令。

ldr:从内存中读取数据到寄存器。操作的数据为32位。

str:把寄存器的值存储到内存中。操作的数据为32位。

[图片上传失败...(image-428693-1624843219395)]

ldm和stm:属于批量内存访问指令,只用一条指令就可以读写多个数据。

格式:

ldm {cons}<addressing_mode> <rn>{!} <register list>{^}
stm {cons}<addressing_mode> <rn>{!} <register list>{^}

{cond} :表示指令的执行条件。 条件如下表3.2所示.

[图片上传失败...(image-1a96dc-1624843219395)]

{addressing_mode}表示地址变化模式,有下列4中方式:

ia: 事后递增方式。

ib:事先递增方式。

da:事后递减方式。

db:事先递减方式。

{rn}中保存内存的地址,如果后面加上感叹号,指令执行后,rn的值会变成下一个内存单元的地址。

<registre list>表示寄存器列表,对于ldm指令,从<rn>所对应的内存块中取出数据,写入这些寄存器;对于stm指令,把这些寄存器的值写入<rn>对应的内存块中。

{^}:

1.<register list>中有pc寄存器,它表示指令执行后,spsr寄存器的值将自动复制到cpsr寄存器中--常用来从中断函数中返回。

2.<register list>中没有pc寄存器,它表示操作的是用户模式下的寄存器,而不是当前特权模式的寄存器。

指令中寄存器列表和内存单元的对应关系为:编号低的寄存器对应内存中的低地址单元,编号高的寄存器对应内存中的高地址单元。

HandleIRQ:                  @中断入口函数
    sub lr, lr, #4          @计算返回地址
    stmdb sp!,  {r0-r12,lr} @保存使用到的寄存器
                            @r0-r12,lr被保存在sp表示的内存中
                            @“!”使得指令执行后sp=sp-14*4
                            
    ldr lr, =int_return     @设置调用IRQ_Handle函数后的返回地址
    ldr pc, =IRQ_Handle     @调用中断分发函数
int_return:
    ldmia   sp!,    {r0-r12,pc }^   @中断返回,^表示将spsr的值复制到cpsr
                                    @于是从irq模式返回被中断的工作模式
                                    @!使得指令执行后sp=sp+14*4

[图片上传失败...(image-f25e77-1624843219395)]

4.乘法指令(arm7tdmi-s加入的指令)

[图片上传失败...(image-576447-1624843219395)]

5.加减指令:add,sub

add r1, r2, #1      @表示r1=r2+1
sub r1, r2, #1      @表示r1=r2-1

6.程序状态寄存器的访问指令:msr,mrs

arm处理器有一个程序状态寄存器cpsr, 用来控制处理器的工作模式、设置中断的总开关。

msr cpsr, r0        @复制r0到cpsr中
mrs r0, cpsr        @复制cpsr到r0中

7.杂项指令:swi,mrs,msr

[图片上传失败...(image-d0e64e-1624843219396)]

8.其他伪指令

.extern main    @定义一个外部符号(可以是变量和函数) 这个main代表一个函数。
.text           @表示下面的语句都属于代码段。
.global _start  @将本文中的某个程序标号定义为全局的,这个_start表示一个全局函数。
_start:

adr             @小范围地址读取伪指令
adrl            @中等范围的地址读取伪指令
ldr             @大范围地址读取伪指令

nop             @空操作伪指令

9.汇编指令的执行条件

详解:https://www.jianshu.com/p/0c6192da2fd0

条件有:看上边表3.2

arm指令包含4位的条件域码,这表明可以定义16个执行条件,可以将这些执行条件的助记符附加到汇编指令后。

例如:moveq,movgt等。

arm-thumb子程序调用规则ATPCS

预留......

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容