您的当前位置:首页ARM汇编指令集

ARM汇编指令集

2022-05-12 来源:小侦探旅游网
1ARM汇编指令集一、跳转指令

跳转指令用于实现程序流程的跳转,在ARM程序中

有两种方法可以实现程序流程的跳转:Ⅰ.使用专门的跳转指令。

Ⅱ.直接向程序计数器PC写入跳转地址值。

通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV,LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:1、

B指令

B指令的格式为:B{条件}

目标地址

B指令是最简单的跳转指令。一旦遇到一个B指令,ARM处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是24位有符号数,左移两位后有符号扩展为32位,表示的有效偏移为26位(前后32MB的地址空间)。以下指令:B

Label

;程序无条件跳转到标号Label处执行;当CPSR寄存器中的Z条件码置位时,程

CMPR1,#0

序跳转到标号Label处执行

本页已使用福昕阅读器进行编辑。福昕软件(C)2005-2009,版权所有,仅供试用。

BEQLabel2、

BL指令

BL指令的格式为:BL{条件}目标地址

BL是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。以下指令:BL

Label

;当程序无条件跳转到标号Label处执行时,同

时将当前的PC值保存到R14中3、

BLX指令

BLX指令的格式为:BLX

目标地址

BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器R14值复制到PC中来完成。4、

BX指令

BX指令的格式为:BX{条件}

目标地址

BX指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM指令,也可以是Thumb指令。二、数据处理指令

数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据传送指令用于在寄存器和存储器之间进行数据的双向传输。算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。比较指令不保存运算结果,只更新CPSR中相应的条件标志位。数据处理指令共以下16条。1、

MOV指令

MOV指令的格式为:

MOV{条件}{S}目的寄存器,源操作数

MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。指令示例:MOVR1,R0MOVPC,R1

;将寄存器R0的值传送到寄存器R1

;将寄存器R14的值传送到PC,常用于子程序返回

;将寄存器R0的值左移3

MOVR1,R0,LSL#3位后传送到R12、

MVN指令

MVN指令的格式为:

本页已使用福昕阅读器进行编辑。福昕软件(C)2005-2009,版权所有,仅供试用。

MVN{条件}{S}目的寄存器,源操作数

MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。指令示例:MVN3、

R0,#0CMP指令

将立即数0取反传送到寄存器R0中,完成后R0=-1

CMP指令的格式为:

CMP{条件}操作数1,操作数2

CMP指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后的有GT后缀的指令将可以执行。指令示例:CMP

R1,R0;将寄存器R1的值与寄存器R0的值相减,并根据

结果设置CPSR的标志位CMP

R1,#100

;将寄存器R1的值与立即数100

相减,并根据结果设置CPSR的标志位4、

CMN指令

CMN指令的格式为:

CMN{条件}操作数1,操作数2

CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2相加,并根据结果更改条件标志位。指令示例:CMN

R1,R0

;将寄存器R1的值与寄存器R0的值相加,并根

据结果设置CPSR的标志位CMN

R1,#100

;将寄存器R1的值与立即数100

相加,并根据结果设置CPSR的标志位5、

TST指令

TST指令的格式为:

TST{条件}操作数1,操作数2

TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。指令示例:TST

R1,#%1

;用于测试在寄存器R1中是否设

置了最低位(%表示二进制数)TSTR1,#0xffe

与,并根据结果设置CPSR

;将寄存器R1的值与立即数0xffe按位

的标志位6、

TEQ指令

TEQ指令的格式为:

TEQ{条件}操作数1,操作数2

TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。指令示例:TEQ

R1,R2

;将寄存器R1的值与寄存器R2

的值按位异或,并根据结果设置CPSR的标志位7、

ADD指令

ADD指令的格式为:

ADD{条件}{S}目的寄存器,操作数1,操作数2

ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。指令示例:ADDADDADD8、

R0,R1,R2R0,R1,#256R0,R2,R3,LSL#1ADC指令

;R0=R1+R2;R0=R1+256;R0=R2+(R3<<1)

ADC指令的格式为:

ADC{条件}{S}目的寄存器,操作数1,操作数2

ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比32位大的数的加法,注意不要忘记设置S后缀来更改进位标志。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。

以下指令序列完成两个128位数的加法,第一个数由高到低存放在寄存器R7~R4,第二个数由高到低存放在寄存器R11~R8,运算结果由高到低存放在寄存器R3~R0:ADDSADCSADCSADC9、

R0,R4,R8R1,R5,R9R2,R6,R10R3,R7,R11SUB指令

;加低端的字

;加第二个字,带进位;加第三个字,带进位

;加第四个字,带进位

SUB指令的格式为:

SUB{条件}{S}目的寄存器,操作数1,操作数2

SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。指令示例:SUB

R0,R1,R2

;R0=R1-R2

SUBSUB

R0,R1,#256R0,R2,R3,LSL#1

;R0=R1-256;R0=R2-(R3<<1)

10、~~~~C指令~~~~C指令的格式为:

~~~~C{条件}{S}目的寄存器,操作数1,操作数2

~~~~C指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。指令示例:SUBS

R0,R1,R2

;R0=R1-R2

-!C,并根据结果设置CPSR的进位标志位11、R~~~~指令R~~~~指令的格式为:

R~~~~{条件}{S}目的寄存器,操作数1,操作数2

R~~~~指令称为逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。指令示例:

R~~~~R2–R1R~~~~256–R1R~~~~

R0,R1,R2;R0=

R0,R1,#256;R0=

R0,R2,R3,LSL#1;R0

=(R3<<1)-R212、RSC指令RSC指令的格式为:

RSC{条件}{S}目的寄存器,操作数1,操作数2

RSC指令用于把操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。指令示例:RSC

R0,R1,R2

;R0=R2–R1-!C

13、AND指令AND指令的格式为:

AND{条件}{S}目的寄存器,操作数1,操作数2

AND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,

被移位的寄存器,或一个立即数。该指令常用于屏蔽操作数1的某些位。指令示例:ANDR0,R0,#3的0、1位,其余位清零。14、ORR指令ORR指令的格式为:

ORR{条件}{S}目的寄存器,操作数1,操作数2

ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1的某些位。指令示例:ORRR0,R0,#3保持不变。15、EOR指令EOR指令的格式为:

EOR{条件}{S}目的寄存器,操作数1,操作数2

EOR指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于反转操作数1的某些位。指令示例:EORR0,R0,#3持不变。

;该指令反转R0的0、1位,其余位保;该指令设置R0的0、1位,其余位

;该指令保持R0

16、BIC指令BIC指令的格式为:

BIC{条件}{S}目的寄存器,操作数1,操作数2

BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2为32位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。指令示例:

BICR0,R0,#%1011其余的位保持不变。三、加法指令与乘加指令

ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为64位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。

乘法指令与乘加指令共有以下6条:1、

MUL指令

;该指令清除R0中的位0、1、和3,

MUL指令的格式为:

MUL{条件}{S}目的寄存器,操作数1,操作数2

MUL指令完成将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。

其中,操作数1和操作数2均为32位的有符号数或无符号数。指令示例:MULR0,R1,R2MULSR0,R1,R2中的相关条件标志位2、

MLA指令

;R0=R1×R2

;R0=R1×R2,同时设置CPSR

MLA指令的格式为:

MLA{条件}{S}目的寄存器,操作数1,操作数2,操作数3MLA指令完成将操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数或无符号数。指令示例:

MLAR0,R1,R2,R3MLAS

R0,R1,R2,R3

;R0=R1×R2+R3;R0=R1×R2+R3,同

时设置CPSR中的相关条件标志位3、

SMULL指令

SMULL指令的格式为:SMULL{条件}{S}1,操作数2

SMULL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器

目的寄存器Low,目的寄存器低High,操作数

High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。指令示例:SMULL

R0,R1,R2,R3

;R0=(R2×R3)的低32位;R1=(R2×R3)的高32位

4、

SMLAL指令

SMLAL指令的格式为:SMLAL{条件}{S}1,操作数2

SMLAL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位。对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结果的高32位。指令示例:SMLAL

R0,R1,R2,R3;R0=(R2×R3)的低32位+R0

;R1=(R2×R3)的高32位+R1

5、

UMULL指令

目的寄存器Low,目的寄存器低High,操作数

UMULL指令的格式为:

UMULL{条件}{S}1,操作数2

目的寄存器Low,目的寄存器低High,操作数

UMULL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。指令示例:UMULL

R0,R1,R2,R3

;R0=(R2×R3)的低32位;R1=(R2×R3)的高32位

6、

UMLAL指令

UMLAL指令的格式为:UMLAL{条件}{S}1,操作数2

UMLAL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。

对于目的寄存器Low,在指令执行前存放64位加数的低32位,指令执行后存放结果的低32位。

对于目的寄存器High,在指令执行前存放64位加数的高32位,指令执行后存放结果的高32位。

目的寄存器Low,目的寄存器低High,操作数

指令示例:UMLAL

R0,R1,R2,R3;R0=(R2×R3)的低32位+R0

;R1=(R2×R3)的高32位+R1

四、程序状态寄存器访问指令1、

MRS指令

MRS指令的格式为:MRS{条件}

通用寄存器,程序状态寄存器(CPSR或SPSR)

MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情况:

Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。

Ⅱ.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。指令示例:MRSR0,CPSRMRSR0,SPSR2、

MSR指令

;传送CPSR的内容到R0;传送SPSR的内容到R0

MSR指令的格式为:MSR{条件}

程序状态寄存器(CPSR或SPSR)_<域>,操作数

MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:

位[31:24]为条件标志位域,用f表示;位[23:16]为状态位域,用s表示;位[15:8]为扩展位域,用x表示;位[7:0]为控制位域,用c表示;

该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。指令示例:MSRCPSR,R0MSRSPSR,R0MSRCPSR_c,R0中的控制位域五、加载/存储指令

ARM微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。常用的加载存储指令如下:1、LDR指令LDR指令的格式为:

LDR{条件}目的寄存器,<存储器地址>

LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令

;传送R0的内容到CPSR;传送R0的内容到SPSR

;传送R0的内容到SPSR,但仅仅修改CPSR

本页已使用福昕阅读器进行编辑。福昕软件(C)2005-2009,版权所有,仅供试用。

在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。指令示例:LDRR0,[R1]R0。

LDRR0,[R1,R2]存器R0。

LDRR0,[R1,#8]存器R0。LDR

R0,[R1,R2]!

;将存储器地址为R1+R2的字数据读入;将存储器地址为R1+8的字数据读入寄;将存储器地址为R1+R2的字数据读入寄;将存储器地址为R1的字数据读入寄存器

寄存器R0,并将新地址R1+R2写入R1。LDRR0,[R1,#8]!

;将存储器地址为R1+8的字数据读

入寄存器R0,并将新地址R1+8写入R1。LDR

R0,[R1],R2

;将存储器地址为R1的字数据读入寄

存器R0,并将新地址R1+R2写入R1。LDR

R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字

数据读入寄存器R0,并将新地址R1+R2×4写入R1。LDRR0,[R1],R2,LSL#2

;将存储器地址为R1的字数据读入

寄存器R0,并将新地址R1+R2×4写入R1。2、LDRB指令LDRB指令的格式为:

LDR{条件}B目的寄存器,<存储器地址>

LDRB指令用于从存储器中将一个8位的字节数据传送到目的寄存器

中,同时将寄存器的高24位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。指令示例:LDRB

R0,[R1]

;将存储器地址为R1

的字节数据读入寄存器R0,并将R0的高24位清零。LDRBR0,[R1,#8]+8的字节数据读入寄存器

R0,并将R0的高24

位清零。3、LDRH指令LDRH指令的格式为:

LDR{条件}H目的寄存器,<存储器地址>

LDRH指令用于从存储器中将一个16位的半字数据传送到目的寄存器中,同时将寄存器的高16位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。指令示例:LDRH

R0,[R1]

;将存储器地址为R1的半字数

;将存储器地址为R1

据读入寄存器R0,并

将R0的高16位清零。

LDRH

R0,[R1,#8]

;将存储器地址为R1+8的半字

数据读入寄存器R0,

并将R0的高16位清零。

LDRHR0,[R1,R2]字数据读入寄存器

R0,并将R0的高16位清零。

4、STR指令STR指令的格式为:

STR{条件}源寄存器,<存储器地址>

STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。指令示例:

STRR0,[R1],#8址的存储器中,并

将新地址R1+8写入R1。

STRR0,[R1,#8]为地址的存储器中。5、STRB指令STRB指令的格式为:

;将R0中的字数据写入以R1+8;将R0中的字数据写入以R1为地;将存储器地址为R1+R2的半

STR{条件}B源寄存器,<存储器地址>

STRB指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。指令示例:STRB

R0,[R1]

;将寄存器R0中的字节数据写入

以R1为地址的存储

器中。

STRB

R0,[R1,#8]

;将寄存器R0中的字节数据写入

以R1+8为地址的

存储器中。

6、STRH指令STRH指令的格式为:

STR{条件}H源寄存器,<存储器地址>

STRH指令用于从源寄存器中将一个16位的半字数据传送到存储器中。该半字数据为源寄存器中的低16位。指令示例:

STRH

R0,[R1]

;将寄存器R0中的半字数据写

入以R1为地址的存储器中。STRH

R0,[R1,#8]

;将寄存器R0中的半字数据写入

以R1+8为地址的存储器中。

六、批量数据加载/存储指令ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批

量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。常用的加载存储指令如下:LDM(或STM)指令

LDM(或STM)指令的格式为:

LDM(或STM){条件}{类型}基址寄存器{!},寄存器列表{∧}LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,{类型}为以下几种情况:IAIBDADBFDEDFAEA

每次传送后地址加1;每次传送前地址加1;每次传送后地址减1;每次传送前地址减1;满递减堆栈;空递减堆栈;满递增堆栈;空递增堆栈;

{!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。

基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下

的寄存器。指令示例:STMFD

R13!,{R0,R4-R12,LR}

;将寄存器列表中的

寄存器(R0,R4到

R12,LR)存入堆栈。

LDMFD

R13!,{R0,R4-R12,PC}

;将堆栈内容恢复到

寄存器(R0,R4到

R12,LR)。

七、数据交换指令1、SWP指令SWP指令的格式为:

SWP{条件}目的寄存器,源寄存器1,[源寄存器2]

SWP指令用于将源寄存器2所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器1中的字数据传送到源寄存器2所指向的存储器中。显然,当源寄存器1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。指令示例:SWP器

R0,R1,[R2]的

;将R2所指向的存储R0

将R1中的字数据传送到R2所指向的存储单元。SWP

R0,R0,[R1]

;该指令完成将R1所指向的存

储器中的字数据与R0中的数据交换。

2、SWPB指令SWPB指令的格式为:

SWP{条件}B目的寄存器,源寄存器1,[源寄存器2]

SWPB指令用于将源寄存器2所指向的存储器中的字节数据传送到目的寄存器中,目的寄存器的高24清零,同时将源寄存器1中的字节数据传送到源寄存器2所指向的存储器中。显然,当源寄存器1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。指令示例:SWPB

R0,R1,[R2]

;将R2所指向的存储器中的字

节数据传送到R0,R0的高24

位清零,同时将R1中的低8位数据传送到R2所指向的存储单元。SWPB

R0,R0,[R1]

;该指令完成将R1所指向的存

储器中的字节数据与

R0中的低8位数据交换。

八、移位指令(操作)1、LSL(或ASL)操作LSL(或ASL)操作的格式为:通用寄存器,LSL(或ASL)操作数

LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。操作示例MOV

R0,R1,LSL#2

;将R1中的内容左移两位

后传送到R0中。2、LSR操作LSR操作的格式为:通用寄存器,LSR操作数

LSR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。操作示例:MOV

R0,R1,LSR#2

;将R1中的内容右移两位后传

送到R0中,左端用

零来填充。

3、ASR操作ASR操作的格式为:通用寄存器,ASR操作数

ASR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用第31位的值来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。操作示例:MOV

R0,R1,ASR#2

;将R1中的内容右移两位后传

送到R0中,左端用

第31位的值来填

充。

4、ROR操作ROR操作的格式为:通用寄存器,ROR操作数

ROR可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。显然,当进行32位的循环右移操作时,通用寄存器中的值不改变。操作示例:MOV

R0,R1,ROR#2

;将R1中的内容循环右移两

位后传送到R0中。5、RRX操作RRX操作的格式为:通用寄存器,RRX操作数

RRX可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位C来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。操作示例:MOV

R0,R1,RRX#2

;将R1中的内容进行带扩展

的循环右移两位后传送到R0中。九、协处理器指令1、CDP指令CDP指令的格式为:

CDP{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存

器1,源寄存器2,协处理器操作码2。

CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。指令示例:CDP的初始化2、LDC指令LDC指令的格式为:

LDC{条件}{L}协处理器编码,目的寄存器,[源寄存器]

LDC指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。指令示例:

LDC

P3,C4,[R0]

;将ARM处理器的寄存

P3,2,C12,C10,C3,4

;该指令完成协处理器P3

器R0所指向的存储器中

的字数据传送到协处理

器P3的寄存器C4中。3、STC指令STC指令的格式为:

STC{条件}{L}协处理器编码,源寄存器,[目的寄存器]

STC指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。指令示例:STC

P3,C4,[R0]

;将协处理器P3的寄存器C4

中的字数据传送到

ARM处理器的寄存器R0

所指向的存储器中。4、MCR指令MCR指令的格式为:

MCR{条件}协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2。

MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,源寄存器为ARM处理器的寄存器,目的寄存器1和目的寄存器2均为协处理器的寄存器。指令示例:

MCR

P3,3,R0,C4,C5,6

;该指令将ARM处理器

寄存器R0中的数据传送到协处理器P3的寄存器C4和C5中。

5、MRC指令MRC指令的格式为:

MRC{条件}协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2。

MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理器操作码2为协处理器将要执行的操作,目的寄存器为ARM处理器的寄存器,源寄存器1和源寄存器2均为协处理器的寄存器。指令示例:MRC

P3,3,R0,C4,C5,6

;该指令将协处理器P3

的寄存器中的数据传

送到ARM处理器寄存

器中。

十、异常产生指令1、SWI指令SWI指令的格式为:SWI{条件}24位的立即数

SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0的内容决定,同时,参数通过其他通用寄存

器传递。指令示例:

SWI

0x02

;该指令调用操作系统编

号位02的系统例程。2、BKPT指令BKPT指令的格式为:BKPT

16位的立即数

BKPT指令产生软件断点中断,可用于程序的调试。

2ARM汇编器所支持的伪指令

在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。

在ARM的汇编程序中,有如下4种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。一、符号定义(SymbolDefinition)伪指令

符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪指令有如下4种:1、

GBLA、GBLL和GBLS

语法格式:

GBLA(GBLL或GBLS)全局变量名

GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并将其初始化。其中:

GBLA伪指令用于定义一个全局的数字变量,并初始化为0;GBLL伪指令用于定义一个全局的逻辑变量,并初始化为F(假);GBLS伪指令用于定义一个全局的字符串变量,并初始化为空;由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。使用示例:GBLATest1GBLLTest2GBLSTest32、

Test1SETATest2SETLTest3SETS

0xaa

;定义一个全局的数字变量,变量名为Test1

;将该变量赋值为0xaa

;定义一个全局的逻辑变量,变量名为Test2

{TRUE}

;将该变量赋值为真

;定义一个全局的字符串变量,变量名为Test3“Testing”

;将该变量赋值为“Testing”

LCLA、LCLL和LCLS

语法格式:

LCLA(LCLL或LCLS)

局部变量名

LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量,并将其初始化。其中:

LCLA伪指令用于定义一个局部的数字变量,并初始化为0;LCLL伪指令用于定义个局部的逻辑变量,并初始化为F(假);

LCLS伪指令用于定义一个局部的字符串变量,并初始化为空;以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。使用示例:LCLATest3LCLLTest4LCLSTest63、

Test4SETATest5SETLTest6SETS

0xaa

;声明一个局部的数字变量,变量名为Test4

;将该变量赋值为0xaa

;声明一个局部的逻辑变量,变量名为Test5{TRUE}

;将该变量赋值为真

;定义一个局部的字符串变量,变量名为Test6“Testing”

;将该变量赋值为“Testing”

SETA、SETL和SETS

语法格式:变量名

SETA(SETL或SETS)表达式

伪指令SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。

SETA伪指令用于给一个数学变量赋值;SETL伪指令用于给一个逻辑变量赋值;SETS伪指令用于给一个字符串变量赋值;

其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。使用示例:LCLATest3

Test3SETA

0xaa

;声明一个局部的数字变量,变量名为Test3

;将该变量赋值为0xaa

LCLLTest44、

Test4SETL

;声明一个局部的逻辑变量,变量名为Test4

{TRUE}

;将该变量赋值为真

RLIST

语法格式:名称RLIST

{寄存器列表}

RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。使用示例:RegListRLISTRegList,可

在ARM指令LDM/STM中通过该名称访问寄存器列表。二、数据定义(DataDefinition)伪指令

数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下9种:1、

DCB

DCB表达式

{R0-R5,R8,R10};将寄存器列表名称定义为

语法格式:标号

DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为0~255的数字或字符串。DCB也可用“=”代替。使用示例:

Str始化。2、

DCB“Thisisatest!”;分配一片连续的字节存储单元并初

DCW(或DCWU)

DCW(或DCWU)

表达式

语法格式:标号

DCW(或DCWU)伪指令用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐。使用示例:DataTest初始化。3、

DCD(或DCDU)

DCD(或DCDU)

表达式

DCW

1,2,3

;分配一片连续的半字存储单元并

语法格式:标号

DCD(或DCDU)伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“&”代替。用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格字对齐。使用示例:DataTest始化。4、

DCFD(或DCFDU)

DCD

4,5,6

;分配一片连续的字存储单元并初

语法格式:

标号DCFD(或DCFDU)表达式

DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。用DCFD分配的字存储单元是字对齐的,而用DCFDU分配的字存储单元并不严格字对齐。使用示例:FDataTest

DCFD

2E115,-5E7;分配一片连续的字存储单

元并初始化为指定的双精度数。5、

DCFS(或DCFSU)

DCFS(或DCFSU)表达式

语法格式:标号

DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据一个字单元。用DCFS分配的字存储单元是字对齐的,而用DCFSU分配的字存储单元并不严格字对齐。使用示例:FDataTest

DCFS

2E5,-5E-7

;分配一片连续的字存储单

元并初始化为指定的单精度数。6、

DCQ(或DCQU)

DCQ(或DCQU)

表达式

语法格式:标号

DCQ(或DCQU)伪指令用于分配一片以8个字节为单位的连续存储区域并用伪指令中指定的表达式初始化。用DCQ分配的存储单元是字对齐的,而用DCQU分配的存储单元并不严格字对齐。

使用示例:DataTest

DCQ

100

;分配一片连续的存储单元并

初始化为指定的值。7、

SPACE

SPACE

表达式

语法格式:标号

SPACE伪指令用于分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。SPACE也可用“%”代替。使用示例:DataSpace化为0。8、

MAP

表达式{,基址寄存器}

SPACE

100;分配连续100字节的存储单元并初始

语法格式:MAP

MAP伪指令用于定义一个结构化的内存表的首地址。MAP也可用“^”代替。表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。使用示例:MAP0x100,R09、

FILED

;定义结构化内存表首地址的值为0x100+R0。

语法格式:标号

FIELD

表达式

FIELD伪指令用于定义一个结构化内存表中的数据域。FILED也可用“#”代替。表达式的值为当前数据域在内存表中所占的字节数。FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表。MAP伪指令定义内存表的首地址,FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。注意MAP和FIELD伪指令仅用于定义数据结构,并不实际分配存储单元。使用示例:MAPABS

0x100FIELDFIELDFIELD

1632256

;定义结构化内存表首地址的值为0x100。;定义A的长度为16字节,位置为0x100;定义B的长度为32字节,位置为0x110;定义S的长度为256字节,位置为0x130

三、汇编控制(AssemblyControl)伪指令

汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下4条:1、

IF、ELSE、ENDIF

语法格式:IF

逻辑表达式指令序列1ELSE

指令序列2ENDIF

IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执行某个指

令序列。当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。其中,ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令。IF、ELSE、ENDIF伪指令可以嵌套使用。使用示例:GBLL……IF

Test=TRUE

Test

;声明一个全局的逻辑变量,变量名为Test

指令序列1ELSE指令序列2ENDIF2、

WHILE、WEND

语法格式:WHILE

逻辑表达式

指令序列WEND

WHILE、WEND伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。

WHILE、WEND伪指令可以嵌套使用。

使用示例:GBLACounter……WHILE指令序列WEND3、

MACRO、MEND

Counter<10CounterSETA

;声明一个全局的数学变量,变量名为Counter

3

;由变量Counter控制循环次数

语法格式:$标号指令序列MEND

MACRO、MEND伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码。其中,$标号在宏指令被展开时,标号会被替换为用户定义的符号,宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。宏指令的使用方式和功能与子程序有些相似,子程序可以提供模块化的程序设计、节省存储空间并提高运行速度。但在使用子程序结构时需要保护现场,从而增加了系统的开销,因此,在代码较短且需要传递的参数较多时,可以使用宏指令代替子程序。包含在MACRO和MEND之间的指令序列称为宏定义体,在宏定义体的第一行应声明宏的原型(包含宏名、所需的参数),然后就可以在汇编程序中通过宏名来调用该指令序列。

宏名

$参数1,$参数2,……

在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数。MACRO、MEND伪指令可以嵌套使用。4、

MEXIT

语法格式:MEXIT

MEXIT用于从宏定义中跳转出去。四、其他常用的伪指令

还有一些其他的伪指令,在汇编程序中经常会被使用,包括以下13条:1、

AREA

语法格式:AREA段名

属性1,属性2,……

AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,如|1_test|。属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:●CODE属性:用于定义代码段,默认为READONLY。●DATA属性:用于定义数据段,默认为READWRITE。

●READONLY属性:指定本段为只读,代码段默认为READONLY。●READWRITE属性:指定本段为可读可写,数据段的默认属性为READWRITE。

●ALIGN属性:使用方式为ALIGN表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为0~

31,相应的对齐方式为2表达式次方。

●COMMON属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。使用示例:AREA指令序列

;该伪指令定义了一个代码段,段名为Init,属性为只读2、

ALIGN

Init,CODE,READONLY

语法格式:ALIGN

{表达式{,偏移量}}

ALIGN伪指令可通过添加填充字节的方式,使当前位置满足一定的对其方式。其中,表达式的值用于指定对齐方式,可能的取值为2的幂,如1、2、4、8、16等。若未指定表达式,则将当前位置对齐到下一个字的位置。偏移量也为一个数字表达式,若使用该字段,则当前位置的对齐方式为:2的表达式次幂+偏移量。使用示例:AREA

Init,CODE,READONLY,ALIEN=3

;指定后面的指

令为8字节对齐。指令序列END

3、CODE16、CODE32

语法格式:

CODE16(或CODE32)

CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令。CODE32伪指令通知编译器,其后的指令序列为32位的ARM指令。若在汇编源程序中同时包含ARM指令和Thumb指令时,可用CODE16伪指令通知编译器其后的指令序列为16位的Thumb指令,CODE32伪指令通知编译器其后的指令序列为32位的ARM指令。因此,在使用ARM指令和Thumb指令混合编程的代码里,可用这两条伪指令进行切换,但注意他们只通知编译器其后指令的类型,并不能对处理器进行状态的切换。使用示例:AREA……CODE32

LDRR0,=NEXT+1BX

R0

;通知编译器其后的指令为32位的ARM指令

;将跳转地址放入寄存器R0

;程序跳转到新的位置执行,并将处理器切换

Init,CODE,READONLY

到Thumb工作状态……CODE16NEXT……

;通知编译器其后的指令为16位的Thumb指令

LDRR3,=0x3FF

END4、

ENTRY

;程序结束

语法格式:ENTRY

ENTRY伪指令用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。使用示例:AREAENTRY……5、

END

Init,CODE,READONLY

;指定应用程序的入口点

语法格式:END

END伪指令用于通知编译器已经到了源程序的结尾。使用示例:AREA……END6、

EQU

;指定应用程序的结尾

Init,CODE,READONLY

语法格式:

名称EQU表达式{,类型}

EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define。其中EQU可用“*”代替。

名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定表达式的数据类型,可以有以下三种类型:CODE16、CODE32和DATA使用示例:Test

EQU50

;定义标号Test的值为50

AddrEQU0x55,CODE32定义Addr的值为0x55,且该处为32位的ARM指令。7、

EXPORT(或GLOBAL)

语法格式:EXPORT

标号{[WEAK]}

EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL代替。标号在程序中区分大小写,[WEAK]选项声明其他的同名标号优先于该标号被引用。使用示例:AREAEXPORTStest……END

Init,CODE,READONLY

Stest

;声明一个可全局引用的标号

8、IMPORT

语法格式:IMPORT

标号{[WEAK]}

IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。标号在程序中区分大小写,[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。使用示例:AREAIMPORT

Init,CODE,READONLY

Main

;通知编译器当前文件要引用

标号Main,但Main在其他源文件中定义……END9、

EXTERN

语法格式:EXTERN

标号{[WEAK]}

EXTERN伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号就不会被加入到当前源文件的符号表中。标号在程序中区分大小写,[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器

也不给出错误信息,在多数情况下将该标号置为0,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。使用示例:AREAEXTERN

Init,CODE,READONLY

Main

;通知编译器当前文件要引用标号Main,

但Main在其他源文件中定义……END

10、GET(或INCLUDE)语法格式:GET

文件名

GET伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。汇编程序中常用的方法是在某源文件中定义一些宏指令,用EQU定义常量的符号名称,用MAP和FIELD定义结构化的数据类型,然后用GET伪指令将这个源文件包含到其他的源文件中。使用方法与C语言中的“include”相似。GET伪指令只能用于包含源文件,包含目标文件需要使用INCBIN伪指令使用示例:AREAGETGET

Init,CODE,READONLYa1.sC:\\a2.s

;通知编译器当前源文件包含源文件a1.s;通知编译器当前源文件包含源文件C:\\a2.s

……END11、INCBIN语法格式:INCBIN

文件名

INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。使用示例:AREAINCBIN

Init,CODE,READONLY

a1.dat

;通知编译器当前源文件包含文件a1.dat;通知编译器当前源文件包含文件C:\\a2.txt

INCBINC:\\a2.txt……END12、RN语法格式:名称

RN

表达式

RN伪指令用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。使用示例:Temp

RN

R0

;将R0定义一个别名Temp

13、ROUT语法格式:{名称}

ROUT

ROUT伪指令用于给一个局部变量定义作用范围。在程序中未使用该伪指令时,局部变量的作用范围为所在的AREA,而使用ROUT后,局部变量的作为范围为当前ROUT和下一个ROUT之间。

因篇幅问题不能全部显示,请点此查看更多更全内容