arm的汇编指令精选合辑
的条件码如表3--6所示。
表3—6 Thumb B指令
条件代码含义标志位状态显示
EQNECS/HSCC/LOMIPLVSVCHILSGELTGTLE相等/是否为0不等进位置/大于进位清零/小于结果为负结果为正溢出无溢出大于小于大于等于小于等于大于小于等于 Z置位Z清零C置位C清零N置位N清零V置位V清零C置位且Z清零C清零或Z置位N等于VN不等于VZ清零或N等于VZ置位或N不等于V
注释:
若条件码满足或不使用条件码,则B指令引起处理器转移到Label.
例:
B dloop
BEQ sectB
2 BL,BLX指令
格式:
BL{X} 《Label》
其中:
Label 程序相对转移表达式。
注释:
BL指令将下一条指令的地址拷贝到R14(LR链接寄存器),并引起处理器转移到Label。机器级指令不能转移到当前正负4MB指令以外的地址。必要时,ARM链接器插入代码(veneer)以允许更长的转移。
BL指令实际上分为2条指令,1条指令H=0,它把11位偏移量左移12位,加上现行PC,写入中R14(LR),另一条指令H=1,它把LR加上11位偏移量乘2写入PC,同时把下一条指令写入R14中。
BLX指令可用于:
拷贝下一条指令的地址到R14(LR链接寄存器)。
引起处理器转移到Label或Rm存储的地址
如果Rm的位[0]清零,或使用"BLX Label"形式,则指令集切换到ARM状态。BLX指令适用于ARM v5T指令系统及以上版本。
例:
B extract
3 BX,BLX指令
格式:
B{L}X Rm
其中:
Rm 装有目的地址的ARM寄存器,m=0~15。Rm的位[0]I不用于地址部分。若Rm位清零。则
位[1]也必须清零;
指令清零CPSR中的标志T,目的地址的代码被解释为ARM代码。
注释:
BX指令引起处理器转移到Rm存储的地址。若Rm的位[0]置位,则指令集切换到Hhnmb状态。
BLX指令用来在Thumb程序中调用ARM或者子程序,地址由Rm指定。从子程序返回,用BX R14指令。
例:
BX R5
BLX R6
3.3.4 Thumb软件中断和断点指令
1 Thumb软件中断指令
功能:Thumb的SWI指令类似于ARM SWI指令。该指令执行后的操作是:
(1)将下一条Thumb指令地址保存进R14_svc。
(2)PSR的内容保存进SPSR_svc;
(3)禁止IRQ中断,清除Thumb位,进入SVC模式;
(4)PC指向0x08。
返回指令恢复Thumb执行的状态。
格式:SWI 《immed_8》
其中:
immed_8 符号表达式,其取值范围为的整数。
SWI指令引起SWI异常。这意味着处理器状态切换到ARM态,处理器模式切换到管理模式的,CPSR保存到管理模式中,执行转移SWI到向量地址。
处理器忽略immed_8,但immed_8出现在指令操作码的位[7:0]中。而异常处理程序用它来确定正在请求何种服务。
注释:
这条指令不影响条件码标志。
例:
SWI 12
2 Thumb断点指令
格式:
BRKT immed_8
其中:
immed_8 符号表达式,取值范围为0~255的整数。
注释:
BKPT(BreakPoinT)指令引起处理器进入调试模式。调试工具利用这一特点调查到达特定地址的指令时的系统状态。
尽管immed_8出现在指令操作码的位[7:8]中,处理器忽略immed_8。调试器用它来存储有关断点的附加消息。
BKPT指令适用于ARM v5T指令系统及以上版本。
例:
BKPT 67
BKPT 2_10110
3.3.5 Thumb指令示例
1 从Thumb状态到ARM状态
ADR R1,oct of Thumb
MOV R11,R1
BX R11
……
ALIGN
CODE32
Out of Thumb ……
2 ARM和Thumb指令编写的比较
本节最后通过比较ARM和Thumb指令编写"Hello Word"程序,示例Thumb指令的编写。从下面的例子中可以看到,指令Thumb的执行必须由ARM状态转向Thumb状态,通常BX指令完成。另外在Thumb指令前必须有CODE16伪指令指示汇编器以下指令为Thumb指令。
(1) ARM指令编写的"Hello Word"程序
AREA HelloW,CODE,READONLY
SWI_WriteC EQU &0; SWI中断入口
SWI_Exit EQU &11
ENTRY
START ADR R1,TEXT
LOOP LDRB R0,[R1],#1
CMP R0,#0
SWINE SWI_WriteC;参数&0完成显示成输出
BNE LOOP
SWI SWI_Exit;参数&11返回
TEXT = "Hello Word";&0a,&0d,0
END
(2) Thumb指令编写的"Hello Word"程序
AREA HelloW_Thumb,CODE,READONLY
SWI_WriteC EQU&0
SWI_Exit EQU&11
ENTRY
CODE32 ;指示以下为ARM指令
ADR R0,START+1
BX R0 ;转向Thumb程序
CODE16 ;指示以下指令为Thumb指令
START ADR R1,TEXT
LOOP LDRB R0,[R1]
ADD R1,R1,#1
CMP R0,#0
BEQ
- 什么是LED驱动时序?LCD背光驱动程序设计(04-26)
- LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码(04-25)
- wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点(04-26)
- ARM微处理器助记符指令及其功能描述(04-30)
- 布线工程师如何充分“掌控”时钟信号?(02-21)
- FPGA组成、工作原理和开发流程(10-13)