第3章ARM9指令系统
本章介绍ARM处理器的寻址方式、ARM指令集和Thumb指令集。通过对本章的阅读,希望读者能了解ARM微处理器所支持的指令集及具体的使用方法。
3.1ARM处理器的寻址方式
所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。目前ARM指令系统支持如下几种常见的寻址方式。
3.1.1寄存器寻址
寄存器寻址就是利用寄存器中的内容作为操作数,寄存器本身就是操作数地址。这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。例如以下指令:
MOVR2,R3;R2←R3R3中的内容赋给R2
ADDR2,R3,R4;R2←R3+R4R3和R4中的内容相加,结果赋给R2
3.1.2立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数没有存储在寄存器或存储器中,而是包含在指令的操作码中,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即寻址。例如以下指令:
ADDR1,R1,#1234;R1←R1+1234
ADDR1,R1,#0x7f;R1←R1+0x7f
在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”。
3.1.3寄存器间接寻址
寄存器间接寻址就是以寄存器中的内容作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:
LDRR1,[R2];R1←[R2]
STRR1,[R2];[R2]←R1
*条指令以R2中的内容为地址,将该地址中的数据传送到R1中。
第二条指令将R1中的内容传送到以R2中的内容为地址的存储器中。
3.1.4变址寻址
变址寻址就是将寄存器(该寄存器一般称为基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令有以下几种常见形式,如下所示。
LDRR0,[R1,#8];R0←[R1+8]
LDRR0,[R1,#8]!;R0←[R1+8],R1←R1+8
LDRR0,[R1],#2;R0←[R1],R1←R1+2
LDRR0,[R1,R2];R0←[R1+R2]
在*条指令中,将寄存器R1的内容加上8形成操作数的有效地址,从而取得操作数存入寄存器R0中。
在第二条指令中,将寄存器R1的内容加上8形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增8个字节。
在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增8个字节。
在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。
3.1.5寄存器移位寻址
寄存器移位寻址是ARM指令集独有的寻址方式,操作数由寄存器的数值进行相应移位而得到;移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。
ARM微处理器内嵌的桶型移位器(barrelshifter),移位操作在ARM指令集中不作为单独的指令使用,它只能作为指令格式中的一个字段,在汇编语言中表示为指令中的选项。例如,数据处理指令的第2个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下6种类型,ASL和LSL是等价的,可以自由互换。
1.LSL(或ASL)操作
LSL(或ASL)操作的格式为:
通用寄存器,LSL(或ASL)操作数
LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充,*后一个左移出的位放在状态寄存器的C位CPSR[29]中,如图31所示。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
图31逻辑(或算术)左移
操作示例:
MOVR0,R1,LSL#4;将R1中的内容左移4位后传送到R0中
;其中把*后移出的位赋给程序状态寄存器的C位CPSR[29]
2.LSR操作
LSR操作的格式为:
通用寄存器,LSR操作数
LSR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充,*后一个右移出的位放在状态寄存器的C位CPSR[29]中,如图32所示。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
图32逻辑(或算术)右移
操作示例:
MOVR0,R1,LSR#4;将R1中的内容右移4位后传送到R0中
;其中把*后移出的位赋给程序状态寄存器的C位CPSR[29]
3.ROR操作
ROR操作的格式为:
通用寄存器,ROR操作数
ROR可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,右端移出的位填充在左侧的空位处,*后一个右移出的位同时也放在状态寄存器的C位CPSR[29]中,如图33所示。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
图33循环右移
操作示例:
MOVR0,R1,ROR#4;将R1中的内容循环右移4位后传送到R0中
;其中把*后移出的位赋给程序状态寄存器的C位CPSR[29]
4.ASR操作
ASR操作的格式为:
通用寄存器,ASR操作数
ASR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,*左端的位保持不变,*后一个右移出的位放在状态寄存器的C位CPSR[29]中,如图34所示。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
图34算术右移
……