(培训体系)2020年ARM培训讲义提纲

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ARM培训讲义提纲
单位:西安电子科技大学编写:何方勇
编写日期:2005年7月1日
1.绪言
本次ARM培训主要使各位受训人员了解嵌入式操作系统的基本概念、软硬件构成框架、以及掌握与嵌入式操作系统相关的知识。

随着通信技术、电子技术、计算机技术、以及微电子技术的发展,片上系统(SOC)成为当今电子技术的一大主流;这就使得嵌入式开发技术成为整个业界的研究和开发的热点。

我们知道当今世界通信与信息技术发展的3大热点是:第三、四代移动通信技术、数字电视技术、以及汽车电子技术。

在这几个热点技术的最终实现将被纳入系统的概念,其中嵌入式系统将在里面伴有重要的角色。

2.嵌入式操作系统
嵌入式操作系统作为一种新的系统,我们应该怎么把握呢?以下我们将简要介绍一下嵌入式系统。

2.1.嵌入式操作系统的基本概念
从字面上,我们可以从两方面理解嵌入式系统:嵌入式、系统。

列举适当的例子说明嵌入式系统的应用:手持设备、大型通信设备
2.2.嵌入式操作系统与常见的单片机、DSP系统的细微区别
从系统的概念出发讲解:单片机、和DSP是没有系统概念的
2.3.嵌入式操作系统的软硬件平台开发
1.嵌入式操作系统的硬件构成:核心处理器、程序和数据存储器、总线系统、外围接口(设备)等;
2.嵌入式操作系统的软件构成:系统软件、API、底层驱动、应用程序等结合微机系统操作系统讲解
3.常见嵌入式操作系统:VxWorks、PSOS、LINUX、WINCE、NUCLEUS等,各种操作系统的区别和优点及应用前景。

2.4.怎样进行嵌入式系统设计
嵌入式系统开发是本次培训的主要内容,那我们应该从以下方面入手:处理器、硬件部件、
操作系统、编程语言、软件开发工具、硬件开发平台、软件组成。

1)处理器:速度、IO 设计指标、处理器的软件支持、处理器调试方式、处理器提供商的信誉度;
2)硬件部件:硬件实现难度、开发周期、市场前景、供货情况
3)操作系统:产品的适合度、调试难度、代码结构、可开发潜力、移植可行性
4)编程语言:高级语言、低级语言
5)软件开发工具:系统调试功能如何、支持的库函数、开发商的软件支持
3.嵌入式处理器
在以上的讲义中我们简要提到了嵌入式开发的各方面的问题,接下来我们将从硬件开始讲解。

在嵌入式系统中,主要以ARM芯片作为该系统的核心芯片。

3.1.嵌入式处理器简介
ARM是Advanced RISC Machines的缩写,ARM公司于1990成立,ARM以低成本、低功耗、高性能迅速占领了全球市场。

其产品广泛应用到移动通信、消费电子、以及嵌入式市场。

ARM公司不生产芯片,只是IP供应商,只做设计。

常见ARM处理器系列有:ARM7系列、ARM9系列、ARM9E系列、ARM10系列、SecurCore SC100、Strong ARM、XScale。

在此,我们主要讲解ARM7系列、ARM9系列:1)ARM7系列:0.9MIPS/MHz3级流水、冯.诺依曼结构;其内核主要有ARM7TDMI和ARM720T;T:支持16位THUMB指令,D支持在片调试,M增强型乘法器,产生全64位结果,I:嵌入式ICE硬件提供片上断点和调试点支持
2)ARM9系列:1.1MIPS/MHz5级流水、哈佛结构;其内核主要有ARM920T、ARM722T 和ARM940T;
3.2.基于ARM内核的芯片扩展
由于ARM公司只做IP,不生产具体的芯片;所以我们所使用的ARM芯片都是全世界其他硬件芯片厂商在经过ARM公司的授权,然后在此基础上进行硬件扩展,以满足不同领域的需求。

ARM9系列是当今嵌入式系统应用的主流芯片内核技术。

全世界各大厂商都采用ARM 公司的IP来开发自己的ARM芯片,主要厂商有:三星、AD、TI、菲利普、Intel、CIRRUS LOGIC等。

下面,我们以三星公司的ARM芯片S3C2410X为例来简要介绍基于ARM内核的芯片扩展。

注意:ARM9系列是兼容ARM7系列的。

3.3.A RM920T内核详解
现在基于ARM920T内核的芯片逐渐成为嵌入式系统芯片的主流,我们有必要详解其结构;这是进一步学习软件开发的基础。

内核的结构图如下所示:
下面我们将重点介绍ARM920T的协处理器CP15和内存管理单元MMU
3.3.1.协处理器CP15
3.3.2.内存管理单元MMU
4.软件开发
嵌入式系统的软件开发包括:操作系统和应用程序开发两个方面。

下面我们进一步讲解基于ARM芯片的汇编语言。

4.1.A RM编程模型
ARM常见版本是V4和V5,现在主要用的是V4,
处理器工作状态:ARM,THUMB
开关状态:进入THUMB状态、进入ARM状态
存储器格式:大小端点格式
指令长度:32位、16位
数据类型:字,半字,字节
操作模式:7种
寄存器:31个通用寄存器和6个状态寄存器中断:
4.2.A RM基本寻址方式
寄存器寻址:
立即寻址:
寄存器移位寻址:
寄存器间接寻址:
变址寻址:
多寄存器寻址:
堆栈寻址:
块拷贝寻址:
相对寻址:
4.3.A RM指令集
本章内容是详细讲解ARM指令集。

4.3.1.ARM指令格式
1.指令集格式:
ARM指令集格式如下表4-1所示:
表4-1:ARM指令集格式
注意:
某些指令码没有定义,但并不导致未定义指令陷阱出现,例如一个乘法指令的第6位变为1。

不应使用这些指令,因为它们的作用也许会由未来的ARM执行
2.ARM指令集表:
下面表4-2、表4-3列出了ARM指令集:
表4-2:
表4-2:ARM指令集表4-3:
表4-3:ARM指令集
3.条件码:
在ARM状态下,所有指令都会根据CPSR条件码和指令条件域的状态被有条件地执行。

该域(位31:28)决定了执行一条指令的环境。

如果C、N、Z和V标志的状态满足该域的编码条件,指令就被执行,否则不予执行。

存在着16个可能条件,每种由复加在指令记忆符后的一个双字符后缀表示。

例如,Branch(B为汇编语言)变为BEQ表示“Branch if Equal”,意思是当Z标志被置位时执行Branch指令。

实际上,表3-2中所列的15个不同的条件也许会用到,第16个(1111)保留,不能使用。

在后缀缺省时,大多数指令的条件域被设置成“Always”(后缀AL)。

这意味着不管CPSR的条件码是什么,指令永远被执行。

下表4-4给出了条件码概况:
表4-4:ARM指令中的条件码
4.3.2.ARM指令集详解
★★1分支与交换(BX指令,Branch和Exchange指令):
该指令仅仅在条件为真时被执行,参见表4-4。

该指令通过将一个通用寄存器Rn的内容复制到程序计数器PC来执行一个分支。

这个分支会引起管道流,并会根据Rn指定的地址再入。

该指令也允许交换指令集。

当执行该指令时,Rn[0]的值决定了是否按照ARM指令还是THUMB指令对指令流进行解码。

指令格式如下图4-1所示:
图4-1:BX指令格式
★指令循环时间:
执行BX指令占用2S+1N周期(与BL一样),这里S和N分别代表连续(S周期)和非连续(N周期)。

★汇编程序语法:
BX-分支和交换指令
BX {cond} Rn ;{cond}为双字母条件记忆符(即条件码),见表4-4,而Rn 表
示一个有效寄存器(比如:R0)
★使用R15作操作数:
如果将R15作操作数,该情况未定义。

例:
ADR R0, Into_THUMB + 1 ;产生分支目标地址,bit0置位,进入THUMB状态
BX R0 ;分支并改变到THUMB状,R15(PC):=R0
CODE16 ;汇编作为THUMB指令的后续码
Into_THUMB
ADR R5, Back_to_ARM ;产生分支目标到字排列地址,bit0置低,变回到ARM BX R5 ;分支并变回到ARM状态,R15(PC):=R0
ALIGN ;字排列
CODE32 ; 汇编作为ARM指令的后续码
Back_to_ARM
★★2分支与带链接分支(B、BL)
该指令仅仅在条件为真时被执行,参见表4-4。

该指令的编码如下图4-2所示。

图4-2:B、BL指令格式
分支指令包含有一个有符号的2态补充24位偏移(相当于25根地址线+符号位,即+/-32M 字节)。

这被左移两位,符号扩展至32位,并加到程序计数器PC。

因此该指令可以指定+/-32M 字节的分支。

该指令偏置必须考虑预取操作,它会引起程序计数器PC超前当前指令2个字(8个字节)。

超过+/-32M字节的分支必须使用偏置或事先装入寄存器的绝对目标。

在这种情况下,如果要求有带链接类型的分支操作,应当将PC值人工存入R14。

★链接位:
带链接的分支(BL)将旧的PC写入当前存储空间的链接寄存器(R14)。

写入R14的值被调整到允许预取,并包含紧跟着“分支与链接指令”的指令地址。

注意CPSR不保留PC值,
R14[1:0]总是清零。

从带链接的分支返回,如果链接寄存器仍然有效,可使用MOV PC,R14;或如果链接寄存器以被Rn存作堆栈指针,使用LDM Rn!,{..PC}。

★指令循环时间:
分支和带链接分支指令占用2S+1N增加的周期(与BX一样),这里S和N分别代表连续(S 周期)和内部(I周期)。

★汇编程序语法:
{}中的内容任意,<>中的内容必须出现
B{L}{cond} <expression>
{L} 常用请求带链接分支的指令形式。

如果缺省,R14不受指令影响,即不将旧的PC值存入R14。

{cond} 如表4-4中所示的双字母助记符(条件码),如果缺省,默认为AL(Always)。

<expression> 目标单元,汇编程序计算偏移量。


here BAL here ;等待,指令汇编成0xEAFFFFFE
B there ;等待,默认条件是“Always”
CMP R1,#0 ; R1=0?比较
BEQ fred ; 为零,则跳转;反之,继续下一个指令
BL sub+ROM ; 跳转,调用子程序
ADDS R1,#1 ; R1=R1+1,设置CPSR标志
BLCC sub ; C=0, 调用子程序
★★3数据处理:
数据处理指令仅在条件为真时被执行,参见表4-4。

该指令编码如下图4-3所示。

图4-3:数据处理指令
该指令通过对一或两个操作数进行指定的算术或逻辑运算产生结果。

第一个操作数总是一个寄存器(Rn)。

根据指令中L(即D25)位的值,第二个操作数可能是一个移位寄存器(Rm)或一个8位循环立即数(Imm)。

根据指令中S位的值,确定该指令的结果是否可以保护或更新CPSR 中的条件码。

确定的运算(TST(OP1与OP2)、TEQ(OP1异或OP2)、CMP(OP1-OP2)、CMN(OP1+OP2))不将结果写入Rd。

它们只用执行检测和设置结果中的条件码并总对S位置位。

★CPSR标志:
数据处理运算可分为逻辑运算和算术运算,逻辑运算(AND、EOR、TST、TEQ、ORR、MOV、BIC、MVN)对操作数的所有相应位或产生结果的操作数执行逻辑运算。

如果S位被置位(并且Rd不是R15,见下表),则CPSR中的V标志不受影响,C标志将被置位来执行barrel shifter (或当移位操作为LSL #0时保护),Z标志当且仅当结果全零时被置位,N被置为结果bit31的逻辑值。

ARM数据处理指令见下表4-5
表4-5:数据处理指令
算术运算(SUB、RSB、ADD、ADC、SBC、RSC、CMN)将每个操作数都看作是一个32位的整数(无符号或两个独立的符号,两种情况时一样的)。

如果S位被置位(并且Rd不是R15),则CPSR中的V标志在结果的bit31出现溢出时被置位,如果操作数均为无符号数可以不理会,但如果操作数为两个独立的有符号数则会发出错误提示,C标志会由于执行ALU的bit31被置位,Z标志当且仅当结果全零时被置位,N标志被置为结果bit31的值(如果认为操作数为两个独立的有符号数时指示结果为负)。

★移位:
当第二个操作数被指定为移位寄存器时,寄存器的移位操作受指令中的移位域控制。

该域指示要执行的移位类型(逻辑左移或右移、算术右移或循环右移)。

寄存器要移动的值可包含在指令的立即域中,或者在另一个寄存器(除了R15)。

不同移位类型的编码如图4-4所示。

图4-4: ARM移位操作
★指定偏移量指令:
当指令中指定了偏移量时,它包含了一个5位的区域,其赋值范围为0~31。

逻辑左移(LSL)获取Rm的内容并将每一位移动指定量到更有意义的位置。

结果的最不重要位以零填充,Rm的最高位被丢弃,并不映射到结果中,除非当ALU运算处于逻辑状态(见上面)时,丢弃的最不重要的位变为shifter的进位输出,并可能锁定CPSR的S位。

例如,LSL #5的影响如下图4-5所示。

图4-5:逻辑左移
注意:
LSL #5是一个特例,这里shifter进位输出是CPSR C标志的过去值。

Rm的内容被直接用作第二个操作数。

逻辑右移(LSR)指令类似,但是Rm的内容被移到结果最不重要的位置。

LSR #5的影响如下图4-6所示。

图4-6:逻辑右移
此种移位使得Rm的第31位有零进位输出。

与逻辑左移零一样,逻辑右移零是多余的,所以汇编程序将LSR #0(以及ASR #0和ROR #0)转换成LSL #0,并允许指定LSR #32。

算术右移(ASR)与逻辑右移类似,不同的是高位被Rm的bit31填充而不是零。

这保护了2个独立符号状态中的符号,例如,ASR #5如下图4-7所示。

图4-7:算术右移
此种移位使得Rm的bit31重新用作进位输出,并且操作数2的每一位也等于Rm的bit31。

所以根据Rm的bit31的值,结果为全1或全0。

循环右移(ROR)操作是将逻辑右移操作中移出去的位再引入放置在结果的高端,在逻辑右移中常用零来填充高位。

例如,ROR #5如下图4-8所示。

图4-8:循环右移
期望给ROR #0的移位域形式用于对barrel shifter的特殊功能,即带扩展的循环右移编码。

这个循环右移是它使用附加的CPSR的C标志来提供一个要被移位的 33 位的数量到Rm内容的最高端,参见下图4-9。

图4-9:带扩展循环右移
★指定偏移量寄存器
只有Rs的最低端字节被用来确定偏移量。

Rs可以是除R15外的任何寄存器。

如果该字节为零,Rm未改变的内容将被当作第二操作数,并且旧的CPSR的 C标志值将会被作为shifter的进位输出。

如果1到31位之间字节有值,移位结果将与指定移位指令的同一个值和移位操作匹配。

如果字节中的值大于等于32,结果为上面所述移位的逻辑扩展:
1.LSL 32结果为零,进位输出等于Rm的0位;
2.LSL大于32结果为零,进位为零;
3.LSR 32结果为零,进位输出等于Rm的31位;
4.LSR大于32结果为零,进位为零;
5.ASR大于等于32结果和进位等于Rm的31位;
6.ROR 32结果等于Rm,进位等于Rm的31位;
7. ROR n结果和进位与ROR n-32相同,这里n大于32;因此不断从n中减去32,直到n值在1~31
之间,见前面。

注意:
必须使带有控制移位寄存器指令的bit 7为零,该位为1会引起指令为乘或未定义。

★立即数循环:
立即数循环域是一个4位无符号整数,指定对8位立即数进行移位操作。

该值为扩展到32位的零,然后通过在循环域中的两倍值服从右移。

这可以产生许多常数,例如2的幂。

★写入R15
当Rd为除R15外的寄存器时,CPSR中的条件码标志可以从前面所述的ALU标志更新。

当Rd为R15并且指令中的S标志未置位时,操作结果被放入R15且CPSR不受影响。

当Rd为R15且S标志置位时,操作结果被放入R15,对应于当前模式的SPSR被移入CPSR。

这允许自动存储PC和CPSR的状态改变。

这种指令格式在用户模式下不能使用。

★用R15作操作数
如果R15(PC)被用于数据处理指令中的一个操作数,可直接使用该寄存器。

PC值就是指令地址、加上由于指令预取的8或12个字节。

如果指令中指定了移位量,PC 为前8个字节。

如果用寄存器指定移位量,则PC为前12个字节。

★TEQ、TST、CMP和CMN操作码:
注意:
TEQ、TST、CMP和CMN不写结果操作结果但置位CPSR中的标志位。

即使助记符中没有指定,汇编程序也应当总将这些指令的S标志置位。

不能使用TEQP指令,它是早期ARM处理器使用的TEQ指令:代替PSR转移操作。

在ARM920T中TEQP的功能是:如果处理器工作在特许模式就将SPSR_<mode>移入CPSR,如果在用户模式什么也不做。

指令周期:数据处理指令增加的周期数如下表4-6:
表4-6:增加的循环时间
注:S、N和I分别定义为顺序(S-周期)、非顺序(N-周期)和内部(I-周期)。

汇编程序句法
• MOV,MVN (单操作数指令).
<opcode>{cond}{S} Rd,<Op2>
• CMP,CMN,TEQ,TST (无结果指令).
<opcode>{cond} Rn,<Op2>
• AND,EOR,SUB,RSB,ADD,ADC,SBC,RSC,ORR,BIC
<opcode>{cond}{S} Rd,Rn,<Op2>
这里:
<Op2> Rm{,<shift>} 或,<#expression>
{cond} 双字母条件助记符,见表4-4
{S} 如果S表示(指CMP, CMN, TEQ, TST),置位条件码.
Rd, Rn 和Rm 寄存器号表达式
<#expression> 如果使用,汇编程序将会产生一个移位的立即8位域来匹配表达
式,如果不用会出错
<shift> <Shiftname> <register> 或<shiftname> #expression, 或
RRX (带扩展右移1位).
<shiftname>s ASL, LSL, LSR, ASR, ROR. (ASL与LSL意义相同,它们的汇编
码一样)
例:
ADDEQ R2,R4,R5 ;如果Z标志置位,使R2=R4+R5
TEQS R4,#3 ;测试R4等于3(S是多余的,由汇编程序自动插入) SUB R4,R5,R7,LSR R2 ;通过R2底部字节数逻辑右移R7,从R5中减去结果,并
;将答案放入R4
MOV PC,R14 ;从子程序返回
MOVS PC,R14 ;从中断返回,并从SPSR方式保存CPSR
★★4PSR转移(MRS、MSR):
该指令仅当条件为真时执行,参见表4-4。

MRS和MSR指令来自于数据处理操作的子集,并用TEQ、TST、CMN和CMP指令执行,不置位S标志,编码参见下图4-10。

这些指令允许对CPSR和SPSR寄存器存取。

MRS指令允许将CPSR或SPSR_<mode>的内容移入通用寄存器。

MSR指令允许将通用寄存器的内容移入CPSR或SPSR_<mode>寄存器。

MSR指令也允许将一个立即数或寄存器内容转移到CPSR或SPSR_<mode>寄存器的条件码标志(N、Z、C和V)而不改变控制位。

在这种情况下,指定的寄存器内容的高4位或32位立即数被写入相应PSR(程序状态寄存器)的高4位。

★操作数限制:
在用户模式,CPSR的控制位受保护,所以只有CPSR的条件码标志可以改变。

在其它(特许)模式,整个CPSR均可改变。

软件决不能改变CPSR中T位的状态。

如果出现这种情况,处理器将进入无法预料的状态。

存取的SPSR寄存器取决于执行时的方式。

例如,当处理器在FIQ模式时,只有SPSR_fiq是可存取的。

不能将R15指定为源或目的寄存器。

在用户模式下不能存取SPSR,因为该寄存器不存在(用户不能使用)。

图4-10:MRS、MSR指令格式
保留位:
ARM920T中只定义了PSR的12个位(N、Z、C、V、I、F、T和M[4:0]),其余位保留为将来的处理器使用。

为确保ARM920T和将来处理器之间的最大兼容性,应当遵守下列原则:
当改变PSR的值时,应当保护保留位;
当检查PSR状态时,程序不应当依赖保留位的特定值,因为将来的处理器可能会将它们认作1或0。

例:
下列顺序完成模式改变:
MRS R0,CPSR ;复制CPSR
BIC R0,R0,#0x1F ;模式位清零,即将CPSR.M[4:0]清零
ORR R0,R0,#new_mode ;选择新模式
MSR CPSR,R0 ;回写修改后的CPSR
当目的只是简单地改变PSR中的条件方式码时,可直接将值写入标志位而不必影响控制位。

下列指令对N、Z、C和V标志置位:
MSR CPSR_flg,#0xF0000000 ;对所有标志位置位,不考虑它们的过去
状态(不影响控制位)
不要试图向整个PSR写入8位立即数,因为这种操作不保护保留位。

★指令循环周期:
PSR转移占用1S增加的周期,这里S定义为顺序(S-周期)。

汇编语言句法:
MRS –将PSR内容转移到寄存器
MRS{cond} Rd,<psr>
MSR –将寄存器内容转移到PSR
MSR{cond} <psr>,Rm
MSR –只将寄存器内容转移到PSR标志位
MSR{cond} <psrf>,Rm
寄存器内容最重要的4位分别写入N、Z、C和V标志。

MSR –只将立即数转移到PSR标志位
MSR{cond} <psrf>,<#expression>
应当用符号表示分别写入N、Z、C和V标志的最重要4位的32位数值。

★关键:
{cond} 双字母条件助记符,见表4-4
Rd and Rm 除R15外的寄存器表达式
<psr> CPSR, CPSR_all, SPSR或SPSR_all. (CPSR和CPSR_all与SPSR和SPSR_all意义相同)
<psrf> CPSR_flg或SPSR_flg
<#expression> 如果使用,汇编程序将会产生一个移位的立即8位域来匹配表达式,如果不用会出错
例:
在用户模式,指令表现为:
MSR CPSR_all,Rm ; CPSR[31:28] <- Rm[31:28]
MSR CPSR_flg,Rm ; CPSR[31:28] <- Rm[31:28]
MSR CPSR_flg,#0xA0000000 ; CPSR[31:28] <- 0xA (set N,C; clear Z,V)
MRS Rd,CPSR ; Rd[31:0] <- CPSR[31:0] 在特许模式,指令表现为:
MSR CPSR_all,Rm ; CPSR[31:0] <- Rm[31:0]
MSR CPSR_flg,Rm ; CPSR[31:28] <- Rm[31:28]
MSR CPSR_flg,#0x50000000 ; CPSR[31:28] <- 0x5 (set Z,V; clear N,C)
MSR SPSR_all,Rm ; SPSR_<mode>[31:0]<- Rm[31:0]
MSR SPSR_flg,Rm ; SPSR_<mode>[31:28] <- Rm[31:28]
MSR SPSR_flg,#0xC0000000 ; SPSR_<mode>[31:28] <- 0xC (set N,Z;
clear C,V)
MRS Rd,SPSR ; Rd[31:0] <- SPSR_<mode>[31:0]
★★5乘和带累加的乘(MUL、MLA):
该指令仅当条件为真时执行,参见表4-4。

指令编码见下图4-11。

乘和带累加的乘指令使用8位布氏运算法则执行整形乘法。

图4-11:MUL、MLA指令格式
指令的乘法形式为Rd:=Rm*Rs,Rn不考虑,并被设置为零,以兼容将来可能升级的指令集。

带累加的乘法形式为Rd:=Rm*Rs+Rn,保存了在某些环境下的一个外在ADD指令。

两种指令形式均以有符号(两种独立)或无符号整数作操作数工作。

32位有符号乘法和无符号乘法的结果仅在高32位不同,低32位结果是一样的。

这些指令进产生乘法的低32位,既可用于有符号乘法,也可用于无符号乘法。

例如
操作数A 操作数B 结果
0xFFFFFFF6 0x00000014 0xFFFFFF38
1)如果操作数被当作有符号的
操作数A为-10,操作数B为20,结果-200被正确地表示为0xFFFFFF38。

2)如果操作数被当作无符号的
操作数A为4294967286,操作数B为20,结果为85899345720,即0x13FFFFFF38,所以最低32位为0xFFFFFF38。

★操作数限制:
目标寄存器Rd不一定与操作数寄存器Rm一样。

R15必须不能被当作操作数或目标寄存器。

所有其它寄存器的组合都会给出正确结果,当需要时Rd、Rn和Rs可用作同一个寄存器。

★CPSR标志:
可任意置位CPSR的标志位,它由指令中S位控制。

N(负)和Z(零)标志根据结果正确置位(N等于结果的bit31位,Z当且仅当结果为零时置位)。

C(进位)标志置位无意义的值V(溢出)标志不受影响。

★指令循环周期
MUL指令占用1S+mI周期,MLA指令占用1S+(m+1)I周期,这里S和I分别代表连续(S 周期)和内部(I周期)。

m 执行乘法所需的8位乘数阵列周期数,由Rs指定的乘数操作数控制。

其可能值如下:
1 如果乘数操作数[32:8]位为全0或全1
2 如果乘数操作数[32:16] 位为全0或全1
3 如果乘数操作数[32:24] 位为全0或全1
4 所有其它情况
★汇编语言句法
MUL {cond} {S} Rd, Rm, Rs
MLA {cond} {S} Rd, Rm, Rs, Rn
{cond} 双字母条件助记符,见表4-4
{S} 如果S出现,置位条件码
Rd, Rm, Rs and Rn 除R15外的寄存器表达式
例:
MUL R1,R2,R3 ; R1:=R2*R3
MLAEQS R1,R2,R3,R4 ;ConditionallyR1:=R2*R3+R4, Setting condition codes. ★★6长乘和带累加的长乘(MULL、MLAL)
该指令仅当条件为真时执行,参见表4-4。

指令编码见下图4-12。

长乘指令执行两个32位操作数整数乘法,并产生64位结果。

有符号和无符号乘法带可选的累加给出4种变化。

图4-12:MULL、MLAL指令格式
乘法形式(UMULL和SMULL)占用两个32位数,相乘后得出形式为RdHi,RdLo:=Rm*Rs 的结果。

64位结果的低32位写入RdLo,结果的高32位写入RdHi。

带累加乘法形式(UMLAL和SMLAL)占用两个32位数,相乘后再加一个64位数得出形式为RdHi,RdLo:=Rm*Rs+RdHi,RdLo的结果。

64位加数的低32从RdLo读取,64位加数的高32从RdHi读取,64位结果的低32位写入RdLo,结果的高32位写入RdHi。

★操作数限制
R15不能用作操作数或目标寄存器。

RdHi、RdLo和Rm必须指定不同的寄存器。

★CPSR标志
对CPSR中的标志置位是任意的,并受指令中S位控制。

N和Z标志根据结果来置位(N为结果的bit63,Z被置位当且仅当全部64位为0时)。

C和V置为无意义的值。

★指令循环周期
MULL占用1S+(m+1)I周期,MLAL占用1S+(m+2)周期,这里m是执行乘法所需的8位乘数阵列周期数,由Rs指定的乘数操作数控制。

其可能值如下:
对有符号指令SMULL、SMLAL
如果乘数操作数[31:8]位为全0或全1
如果乘数操作数[31:16] 位为全0或全1
如果乘数操作数[31:24] 位为全0或全1
所有其它情况
对无符号指令UMULL、UMLAL
如果乘数操作数[31:8]位为全0或全1
如果乘数操作数[31:16] 位为全0或全1
如果乘数操作数[31:24] 位为全0或全1
所有其它情况
S和I分别代表连续(S周期)和内部(I周期)。

汇编句法
表4-7. 汇编程序句法描述
这里:
{cond} 双字母条件助记符,见表4-4
{S} 如果S出现,置位条件码
RdLo, RdHi, Rm, Rs 除R15外的寄存器表达式

UMULL R1,R4,R2,R3 ; R4,R1:=R2*R3
UMLALS R1,R5,R2,R3 ; R5,R1:=R2*R3+R5
★★7单数据转移:
该指令仅当条件为真时执行参见表4-4。

指令编码见下图4-13。

单数据传输指令用于装载或存储单字节数据或字数据。

用于传输的“存储器地址”是由
增加或减少一个基址寄存器的偏移量而得到的。

如果需要自动索引,则该计算结果可以被回写到这个基址寄存器。

图4-13:单数据转移指令
★偏移量和自动索引
在指令中,基址寄存器的偏移量既可以是12 bit的无符号立即数,也可以是一个第二寄存器(可能被移位)。

当U=1时基址寄存器Rn加上偏移量,而U=0时基址寄存器Rn减去偏移量。

偏移量的修改可以在基址寄存器被用于传输地址之前(前索引P=1)或之后(后索引P=0)
关于寻址方式是增加还是减少模式,指令的W位(即D21)给出了可选项。

当W=1时,修改的基址寄存器值可以回写到基址寄存器中;而当W=0时,基址寄存器值不变。

在前索引的寻址方式的情况下,既然通过设置偏移量为零而使旧的基址寄存器值得以保留,那么W 位是多余的,并且总被设置为0。

因此前索引数据传输总是回写到已经修改的基址寄存器。

在后索引数据传输中W位的唯一用处是在特权模式编码中,其中设置W位使得在非特权模式
下传输数据,允许操作系统在系统中产生一个用户地址,这样存储器管理硬件将会获得硬件的更好应用。

★移位寄存器偏移量
8个移位控制位已在数据处理指令一节中介绍过。

但移位量指定的寄存器在本指令级别中是无效的,见图4-4。

★字节和字:
该指令级别可用于在ARM920T寄存器和存储器之间转移一个字节(B=1)或一个字(B=0)。

LDR(B)和STR(B)指令的功能受ARM920T内核BIGEND控制信号的影响。

两种可能的结果叙述如下。

★Little-Endian配置
如果提供的地址是以字为边界,则LDRB指期望数据总线上装入的数据是7~0这样的一个字节数据,如果一个字地址加1,则通过数据总线上装入15~8,以此类推。

这个被选字节被放入目标寄存器的底部8个位,并以0填充寄存器的其余位。

参见图2-2。

一个字节存储(STRB)是通过数据总线输出31~0将源寄存器底部8个位重复4次。

外部存储器系统应当激活适当字节子系统来存储数据。

一个字装入(LDR)通常使用一个字排列地址。

但一个字边界的地址偏置会引起数据被循环进入寄存器,所以地址字节占用0~7位。

这意味着来自字边界偏置0~2存取的半字将会被正确存入寄存器的0~15位。

然后需要两个移位操作来清除或增加符号扩展到高16位。

一个字存储(STR)应产生一个字排列地址。

如果地址不是字排列的,则出现在数据总线上的字不受影响,即存储到寄存器的bit31总是出现在数据总线的bit31。

图4-14. Little-Endian偏移寻址
★Big-Endian配置:
如果提供给地址的是以字为边界,则希望是通过数据总线输入31~24装入(LDRB)一个字节数据,如果一个字地址加上一个字节则通过数据总线输入23~16装入,以此类推。

这个。

相关文档
最新文档