520 likes | 647 Views
ARM 嵌入式系统结构与编程. 大连理工大学软件学院 邱铁 办公楼 409 Tel : 87571521 E_mail: qiutie@dlut.edu.cn 参考教材: 《ARM 嵌入式系统结构与编程 》 清华大学出版社 2009 年 3 月出版. ARM 微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器( PSR )处理指令、加载 / 存储指令、协处理器指令和杂类指令六大类。 本章将分类介绍 ARM 指令语法格式、指令编码格式和 ARM 指令的详细功能。. 第 4 章 ARM 指令集系统. 内容提要. 4 . 1 数据处理指令
E N D
ARM嵌入式系统结构与编程 • 大连理工大学软件学院 邱铁 办公楼409 Tel:87571521 E_mail: qiutie@dlut.edu.cn 参考教材:《ARM嵌入式系统结构与编程》 清华大学出版社2009年3月出版
ARM微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和杂类指令六大类。ARM微处理器的指令集可以分为数据处理指令、跳转指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和杂类指令六大类。 本章将分类介绍ARM指令语法格式、指令编码格式和ARM指令的详细功能。 第4章 ARM指令集系统
内容提要 • 4.1 数据处理指令 • 4.2 ARM分支指令 • 4.3 加载/存储指令 • 4.4 批量加载/存储指令 • 4.5 交换指令 • 4.6 程序状态寄存器PSR访问指令 • 4.7 协处理器操作指令 • 4.8 异常产生指令
4.3 加载/存储指令 • 用于操作32位的字类型数据以及8位无符号的字节类型数据; • 用于操作16位半字类型数据和8位的有符号字节类型数据。
4.3.1 加载/存储字、无符号字节指令 • 1. LDR/STR指令 • LDR{cond} Rd,<addressing> • STR{cond} Rd,<addressing> • LDR{cond}T Rd,<addressing> • STR{cond}T Rd,<addressing>
2. LDRB/STRB指令 • LDR{cond}B Rd,<addressing> • STR{cond}B Rd,<addressing> • LDR{cond} BT Rd,<addressing> • STR{cond}BT Rd,<addressing>
4.3.2 半字、有符号字节访问指令 • 半字数据访问指令用于内存中的数据与寄存器低16位数据进行操作,有符号字节访问指令可实现向寄存器加载8位的有符号字节数据。 • 对于向寄存器加载无符号半字数据,寄存器的高16位bits[31:16]清零; • 对于向寄存器加载有符号半字数据,寄存器的高16位bits[31:16]用符号位扩展为32位; • 对于向寄存器加载有符号字节数据,寄存器的高24位bits[31:8]用符号位扩展为32位。
LDR{cond}H Rd,<addressing > • STR{cond}H Rd,<addressing > • LDR{cond}SH Rd,<addressing > • LDR{cond}SB Rd, <addressing >
ARM微处理器所支持批量数据加载/存储指令可以一次性实现一片连续的存储器单元和多个寄存器之间进行传送数据。ARM微处理器所支持批量数据加载/存储指令可以一次性实现一片连续的存储器单元和多个寄存器之间进行传送数据。 • 批量数据加载指令用于将一片连续的存储器中的数据传送到多个寄存器中,批量数据存储指令能够实现将多个寄存器中的内容一次性的存放到一片连续的存储器中。
基本批量字数据加载/存储指令 • 批量加载: • LDM {<cond>}<addr_mode> <Rn> {!}, <registers> • 批量存储: • STM {<cond>}<addr_mode> <Rn> {!}, <registers>
注意事项: • * Rn不允许为程序计数器PC(R15) • * 指令中寄存器和连续内存地址单元的对应关系:编号低的寄存器对应内存低地址单元,编号高的寄存器对应内存高地址单元。 • *如果指令中基址寄存器<Rn>在寄存器列表<registers>中,而且指令中寻址方式指定指令执行后更新基址寄存器<Rn> 的值,则指令执行会产生不可预知的结果。
示例解析 • MOV R1,#0x9000 • MOV R0,#0x11 • MOV R2,#0x22 • MOV R3,#0x33 • MOV R4,#0x44 • MOV R5,#0x55 • STMDB R1! ,{R0,R2-R5}
用户模式下的批量字数据加载/存储指令 • 用户模式下的批量字数据加载/存储指令操作实现的操作是:即使处理器工作在特权模式下,存储系统也将访问看成是处理器在用户模式下,因此所加载/存储的寄存器组为用户模式下的寄存器。该指令寄存器列表中不包含程序计数器PC,不允许对基地址寄存器回写操作。
用户模式下的批量字数据加载/存储指令汇编语法格式为用户模式下的批量字数据加载/存储指令汇编语法格式为 • 批量加载: LDM {<cond>}<addr_mode> <Rn> , <registers_without_pc>^ • 批量存储: STM {<cond>}<addr_mode> <Rn> , <registers_without_pc>^
带PSR操作的批量字数据加载指令 • 在带PSR操作的批量字数据加载指令中,程序计数器PC包含在指令寄存器列表中。 • 该指令将数据从连续的内存单元中读取到指令中寄存器列表中的各寄存器中。它同时将目前处理器模式对应的SPSR寄存器内容复制到CPSR寄存器中。
批量加载: LDM {<cond>}<addressing_mode> <Rn> {!}, <registers_with_pc>^ • 批量存储: STM {<cond>}<addressing_mode> <Rn> {!}, <registers_with_pc>^
示例解析: • 如何用带PSR操作的批量字数据加载指令实现IRQ中断的返回? • 在进入IRQ中断处理程序时,首先计算返回地址,并保存相关的寄存器 • SUB R14,R14,#4 ; • STMFD R13!, {R0-R3, R12, LR} • 如果IRQ中断处理程序返回到被中断的进程则执行下面的指令。该指令从数据栈中恢复寄存器R0~R3及R12的值,将返回地址传送到PC中,并将SPSR_irq值复制到CPSR中 • LDMFD R13!, {R0-R3, R12, PC}^
4.5 交换指令 • ARM指令支持原子操作,主要是用来对信号量的操作,因为信号量操作的要求是作原子操作,即在一条指令中完成信号量的读取和修改操作。
字数据交换指令 • SWP是对字数据操作指令,用于将一个寄存器Rn为地址的内存字数据单元的内容读取到一个寄存器<Rd>中,同时将另一个寄存器Rm的内容写入到该内存单元中。 • SWP{<cond>} <Rd>, <Rm>, [<Rn>]
字节数据交换指令 • SWPB是对字节操作指令,用于将一个寄存器Rn为内存地址的字节数据单元的内容读取到一个寄存器Rd中,寄存器Rd的高24设置为0,同时将另一个寄存器Rm的低8位数值写入到该内存单元中 • SWP{<cond>}{B} <Rd>, <Rm>,[<Rn>]
4.6程序状态寄存器PSR访问指令 • 程序状态寄存器PSR访问指令用来实现通用寄存器与程序状态寄存器之间的数据传输,共有两条:读程序状态寄存器指令MRS和写程序状态寄存器指令MSR。 • 这类指令可以用来修改CPSR,通常是通过“读取-修改-写回”的操作序列来实现。
存储器访问指令关于访问地址的合成与确定是应该重点掌握的内容,具本参考教材《ARM嵌入式系统结构与编程》第4章4.3, 4.4节
读程序状态寄存器指令 • MRS指令用于将状态寄存器的内容传送到通用寄存器中。这是程序获得程序状寄存器PSR数据的唯一方法。 • MRS {<cond>} <Rd>, CPSR • MRS {<cond>} <Rd>, SPSR
写程序状态寄存器指令 • MSR指令用于将通用寄存器的内容或一个立即数传送到程序状态寄存器中,实现对程序状态寄存器的修改。 MSR {<cond>} CPSR_<fields>, < operand2> MSR {<cond>} SPSR_<fields>, < operand2>
fields设置状态寄存器中需要操作的位域。状态寄存器分为4个8位的域:fields设置状态寄存器中需要操作的位域。状态寄存器分为4个8位的域: bits[31:24]为条件标志位域,用f表示; bits[23:16]状态位域,用s表示; bits[15:8]扩展位域,用x表示; bits[7:0]控制位域,用c表示;
第二操作数operand2的构成形式有以下两种形式:第二操作数operand2的构成形式有以下两种形式: • <immediate>为将要传送到状态寄存器中的立即数; • <Rm>寄存器包含将要传送到状态寄存器中的数据。 • R(bit[22])为0时,写CPSR;R(bit[22])为1时,写SPSR。
4.7 协处理器操作指令 • 协处理器操作是ARM处理器对协处器进行管理,也就是ARM处理器的相关操作通过发送指令给协处理器,让协处理器来完成。ARM微处理器最多可支持16个协处理器,用于各种协处理操作。
协处理器数据操作指令 • 协处理器数据操作指令CDP用法:ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。 • CDP{<cond>} <Cp_num>,<opcode_1>,<CRd>,<CRn>,<CRm>, {<opcode_2>}
cond为指令执行的条件码。当<cond>忽略时指令为无条件执行。cond为指令执行的条件码。当<cond>忽略时指令为无条件执行。 • CRd为目标寄存器的协处理器寄存器。 • CRn为存放第1个源操作数的协处理器寄存器。 • CRm为存放第2个源操作数的协处理器寄存器。 • Cp_num为协处理器的编码。 • opcode1为协处理器将执行操作的第一操作码。 • opcode2为协处理器将执行操作的第二操作码。(可选)
协处理器加载/存储指令 • 协处理器的加载/存储指令可以用来实现ARM处理器与协处理器之间的数据传输,共有两条:协处理器数据加载指令LDC和协处理器数据存储指令STC。
协处理器的加载存储指令汇编语法格式如下: • LDC{<cond>}{L} <coproc>,<CRd>,<addressing_mode> • STC{<cond>}{L} <coproc>,<CRd>,<addressing_mode>
Rn为ARM处理器的通用寄存器,它用作基地址寄存器。Rn为ARM处理器的通用寄存器,它用作基地址寄存器。 • 需要注意的是,汇编语法格式中的L是表示传输的数据为长整数,其对应指令编码中的“N”。而指令二进制编码中的“L”是用来区别LDC和STC指令。
1.协处理器数据加载指令LDC • LDC指令用于将一系列连续的内存单元的数据读取到协处理器的寄存器中,并由协处理器来决定传输的字数。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。
2.协处理器数据存储指令STC • STC指令将协处理器的寄存器中的数据写入到一系列连续的内存单元中,并由协处理器来决定传输的字数。如果协处理器不能成功的执行该操作,将产生未定义指令异常中断。
ARM寄存器与协处理器寄存器数据传输指令 • ARM寄存器与协处理器寄存器数据传输指令用来实现ARM通用寄存器与协处理器寄存器之间的数据传输,共有两条:ARM寄存器到协处理器寄存器的数据传送指令MCR和协处理器寄存器到ARM寄存器的数据传送指令MRC。
ARM寄存器与协处理器寄存器数据传输指令汇编语法格式如下:ARM寄存器与协处理器寄存器数据传输指令汇编语法格式如下: MCR{<cond>} <Cp_num>,<opcode1>,<Rd>,<CRn>,<CRm>{,<opcode2>} MRC{<cond>} <Cp_num>,<opcode1>,<Rd>,<CRn>,<CRm>{,<opcode2>}
1.ARM寄存器到协处理器寄存器的数据传送指令MCR1.ARM寄存器到协处理器寄存器的数据传送指令MCR • MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断。 • MCR p6,2,R0,CR1,CR2,4 ;指令将ARM寄存器R0中数据传送到协处理器p6的寄存器中,其中R0是存放源操作数的ARM寄存器,CR1和CR2是作为目标寄存器的协处理器寄存器,操作码1为2,操作码2为4
2.协处理器寄存器到ARM寄存器的数据传送指令MRC2.协处理器寄存器到ARM寄存器的数据传送指令MRC • MRC指令将协处理器的寄存器中的数据传送到ARM处理器的寄存器中。如果协处理器不能成功的执行该操作,将产生未定义的指令异常中断 • MRC p10,3,R3,CR3,CR4,6 ; 指令将协处理器p10寄存器中的数据传送到ARM寄存器R3中,其中R3是存放目标操作数的ARM寄存器,CR3和CR4是作为目标寄存器的协处理器寄存器,操作码1为3,操作码2为6
4.8 异常产生指令 • ARM处理器所支持的异常产生指令有两条: • 软中断指令SWI • 断点调试指令BKPT(用于ARM V5及以上的版本)
软中断指令 • SWI(SoftWare Interrupt)指令用于产生软件中断,它将处理器置于监控模式(SVC),从地址0x08开始执行指令。 • ARM通过这种机制实现用户模式对操作系统中特权模式的程序调用,也就是使用户程序调用操作系统的系统程序成为可能。
SWI{<cond>} <immed_24>, • 操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递。
执行过程: • 将SWI后面指令地址保存到R14_svc; • 将CPSR保存到SPSR_svc; • 进入监控模式,将CPSR[4:0]设置为0b10011的将CPSR[7]设置为[1],禁止IRQ; • 将PC设置为0x08,并且开始执行那里的指令。 • 返回时:MOVS PC,R14
断点中断指令 • BKPT (BreakPoinT)指令产生软件断点中断,可用于程序的调试。当BKPT指令执行时,处理器停止执行下面的指令并进入相应的BKPT入口程序
BKPT <immed_16> • immed_16为16位的立即数,此立即数被调试软件用来保存额外的断点信息。