4 跳转指令
实现汇编程序跳转的两种方式
直接修改PC的值
mov pc , #0x04
通过跳转指令跳转
b 标签
@程序跳转到指定的标签下执行,此时LR寄存器不保存返回地址
bl 标签
@程序跳转到指定的标签下执行,此时LR寄存器保存返回地址
5 内存读写指令(重点)
查看可用内存
查看指定内存数据
5.1 单寄存器内存读写指令
从内存中读取一个寄存器大小的数据或者向内存中写入一个寄存器的数据
写操作
str{条件码} 目标寄存器,[目标地址] @将目标寄存器的数值写入到目标地址为首地址的内存中,写入4字节数据
strh{条件码} 目标寄存器,[目标地址] @将目标寄存器的数值写入到目标地址为首地址的内存中,写入2字节数据
strb{条件码} 目标寄存器,[目标地址] @将目标寄存器的数值写入到目标地址为首地址的内存中,写入1字节数据
读操作
ldr{条件码} 目标寄存器,[目标地址] @从目标地址为首地址的内存中读取4字节数据保存到目标寄存器
ldrh{条件码} 目标寄存器,[目标地址] @从目标地址为首地址的内存中读取2字节数据保存到目标寄存器
ldrb{条件码} 目标寄存器,[目标地址] @从目标地址为首地址的内存中读取1字节数据保存到目标寄存器
单寄存器读写时地址索引方式
前索引
str{条件码} 目标寄存器,[基地址,偏移量] @将目标寄存器的数值写入到以基地址+偏移量为首地址的内存中,写入4字节数据
ldr{条件码} 目标寄存器,[基地址,偏移量] @从基地址+偏移量为首地址的内存中读取4字节数据保存到目标寄存器
后索引
str{条件码} 目标寄存器,[基地址],偏移量 @将目标寄存器的数值写入到以基地址为首地址的内存中,然后基地址改变数值偏移量大小
ldr{条件码} 目标寄存器,[基地址],偏移量 @从基地址为首地址的内存中读取4字节数据保存到目标寄存器,基地址数值增加偏移量大小
自动索引
str{条件码} 目标寄存器,[基地址,偏移量]! @将目标寄存器的数值写入到以基地址+偏移量为首地址的内存中,然后基地址数值增加偏移量大小
ldr{条件码} 目标寄存器,[基地址,偏移量]! @从基地址+偏移量为首地址的内存中读取4字节数据保存到目标寄存器,基地址数值增加偏移量大小
5.2 批量寄存器内存读写方式
将多个寄存器的数值向内存中写入或者从内存中读取多个寄存器大小的数据放到寄存器中
写:
stm 基地址,{寄存器列表} @将寄存器列表中寄存器的数值写入到基地址位首地址的内存中
读:
ldm 基地址,{寄存器列表} @从基地址为首地址的内存中读取多个字节的数据写入到寄存器列表中每个寄存器中注意:
1.寄存器列表中寄存器可以用','分隔,如果寄存器列表中寄存器编号连续,可以用'-'链接一片连续的寄存器
2.不管寄存器列表中寄存器编号的顺序是怎么样的,处理器操作时永远是低地址对应小编号寄存器
批量寄存器内存读写时基地址的增长方式
通过基地址的地址增长方式设置可以让我们操作内存的同时让基地址也发生变化,可以防止前一次的数据被后一次覆盖
地址增长方式分为ia\ib\da\db四种不同的方式:
stmia 基地址!,{寄存器列表} @先向基地址内存中写入数据,基地址数值往地址大的方向增长
stmib 基地址!,{寄存器列表} @先让基地址数值往地址大的方向增长,然后向基地址内存写入数据
stmda 基地址!,{寄存器列表} @先向基地址内存中写入数据,基地址数值往地址小的方向增长
stmdb 基地址!,{寄存器列表} @先让基地址数值往地址小的方向增长,然后向基地址内存写入数据
5.3 栈内存的读写
在内存中会分配一段内存,叫做栈内存,主要用于保存一些临时数据。操作栈时需要栈顶的地址,栈顶地址保存在SP中。
栈的分类
1.根据栈指针地址增长的方式,分为增栈和减栈
增栈:操作栈时栈指针往高地址增长 A
减栈:操作栈时栈指针往低地址增长 D
2.根据压栈结束后栈指针指向的内存中有没有有效数据,分为空栈和满栈
空栈:压栈结束后栈指针指向的内存中没有有效数据 E
满栈:压栈结束后栈指针指向的内存中有有效数据 F
根据上面的划分标准,栈分为空增栈(EA)、满增栈(FA)、空减栈(ED)、满减栈(FD)
栈内存读写示例---叶子函数的调用过程
叶子函数:函数中不存在别的函数调用,这种类型的函数叫做叶子函数
栈内存读写示例---非叶子函数的调用过程
非叶子函数:函数中存在别的函数的调用,这种类型的函数叫做非叶子函数
6 状态寄存器传送指令
当前程序状态寄存器CPSR保存了当前的程序的工作状态,包括工作模式、处理器状态、中断禁止状态等信息
我们无法通过常规方式对CPSR的值进行读写,只有通过专门的读写指令才可以实现
注意:在特权模式下可以通过修改CPSR数值切换到非特权模式,但是非特权模式不能随便切换到特权模式,不然系统会受到不利的影响,只有发生对应的异常时才可以从user切换到特权模式
读CPSR数值:
MRS 目标寄存器,CPSR @将CPSR寄存器的数值读取出来保存到目标寄存器
修改CPSR数值:
MSR CPSR,数值 @将数值写入到CPSR寄存器中
7 软中断产生指令
软中断是从软件层次上模拟硬件中断,当软中断触发以后可以让处理器进入SVC模式下工作
7.1 软中断产生指令以及使用实例
格式: swi 中断号 @这条指令执行之后就会触发一个软中断
注意:中断号用来区分不同的中断,这里中断号十一个12位的整型数
7.2 异常模式和异常源
ARM处理器有5种异常模式和7种异常源
异常模式是处理器的工作模式
异常源是引发处理器进入异常模式的源头
7.3 异常向量表
异常向量表是内存中的一段内存,这段异常向量表内存通常是程序最开始的内存,一共32字节,被平分为8等份,其中一份保留,其他的每一份4字节,对应一种异常源,内部保存了切换到异常源对应的异常模式的指令。
当一个异常源产生,处理器分析异常,进入异常源对应的异常向量表位置,切换到异常处理程序进行异常的处理
每一种异常源在异常向量表中的位置是固定不变的,不可以改变
7.4 异常触发后处理器做的事情---四大步三小步(重点)
一、将异常出现前的CPSR的值保存到对应异常的SPSR中
二、修改CPSR数值
1.修改模式位为对应异常的模式
2.切换处理器状态为ARM状态
3.根据产生得异常合理禁止中断
三、保存程序返回地址到对应异常的LR寄存器中
四、修改PC寄存器的值为对应异常的异常向量表位置
7.5 异常返回
1.将SPSR寄存器保存的异常触发前的CPSR数值赋值给CPSR
2.将LR保存的返回地址赋值给Pc