您好,欢迎来到爱够旅游网。
搜索
您的当前位置:首页ARM汇编指令

ARM汇编指令

来源:爱够旅游网

ARM汇编指令

ARM处理器的指令集可以分为跳转指令、数据处理指令、程序状态寄存器(PSR)处理指令、加载/存储指令、协处理器指令和异常产生指令6大指令。

一、跳转指令

跳转指令用于实现程序流程的跳转,在ARM程序中有以下两种方法可以实现程序流程的跳转。
Ⅰ.使用专门的跳转指令;

下指令:

BL   Label         ;当程序无条件跳转到标号Label处执行时,同时将当前的 PC值保存到

R14LR)中
3BLX指令
BLX指令的格式为:


二、数据处理指令

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

MOV{条件}{S} 目的寄存器,源操作数
MOV指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S 时指令不更新CPSR中条件标志位的值。
指令示例:
MOV R1R0                    ;将寄存器R0的值传送到寄存器R1
MOV PCR14                  ;将寄存器R14的值传送到 PC,常用于子程序返回
MOV R1R0LSL3    ;将寄存器R0的值左移3位后传送到R1
2MVN指令(求反)
MVN指令的格式为:

MVN{条件}{S} 目的寄存器,源操作数
MVN指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV指令不同之处是在传送之前按位被取反了,即把一个被取反的值 传送到目的寄存器中。其中S决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
指令示例:
MVN R0,#0            ;将 立即数0取反传送到寄存器R0中,完成后R0=-1
3CMP指令(比较)
CMP指令的格式为:

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

;志位
CMP R1,#100   ;将寄存器R1的值与立即数100相减,并根 据结果设置CPSR的标志位
4CMN指令(负数比较)
CMN指令的格式为:
    CMN{条件} 操作数1,操作数2
CMN指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR中条件标志位的值。该指令实际完成操作数1和操作数2 加,并根据结果更改条件标志位。
指令示例:
CMN   R1R0     ;将寄存器R1的值与寄存器R0的值相加,并根据 结果设置CPSR

;的标志位
CMN R1,#100  ;将寄存器R1的值与立即数100相加,并根据 结果设置CPSR的标志位
5TST指令(测试)
TST指令的格式为:
    TST{条件} 操作数1,操作数2
TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的与运算,并根据运算结果更新CPSR中条件标志位的值。操作数1是要测试的数 据,而操作数2是一个位掩码,该指令一般用来检测是否设置了特定的位。
指令示例:
TST   R1,#%1            ;用于测试在寄存器R1中是否设置了最低位(%表 示二进制数)
TST R1,#0xffe           ;将寄存器R1的值与立即数0xffe按位与,并根据 结果设置CPSR

;的标志位
6TEQ指令(测试相等)
TEQ指令的格式为:
TEQ{条件} 操作数1,操作数2
TEQ指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的异或运算,并根据运算结果更新CPSR中条件标志位的值。该指令通常用于比较操作数1和操作数2是否相等。
指令示例:
TEQ   R1R2          ;将寄存器R1的值与寄存器R2的值按位异或,并根据结果 设置CPSR

;的标志位
7ADD指令(相加)
ADD指令的格式为:
     ADD{条件}{S} 目的寄存器,操作数1,操作数2
ADD指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
指令示例:
ADD     R0R1R2                  R0 = R1 + R2
ADD     R0R1#256                R0 = R1 + 256
ADD     R0R2R3LSL#1       R0 = R2 + (R3 << 1)
8ADC指令(带进位相加)
ADC指令的格式为:
ADC{条件}{S} 目的寄存器,操作数1,操作数2
ADC指令用于把两个操作数相加,再加上CPSR中的C条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比32位大的数 的加法,注意不要忘记设置S后缀来更改进位标志。操作数1应是一个寄存器,操作数2可以是一 个寄存器,被移位的寄存器,或一个立即数。
以下指令序列完成两个128位数的加法,第一个数由高到低存放在寄存器R7R4,第二个数由高到低存放在寄存器R11R8,运算结果由高到低存放在寄 存器R3R0
ADDS    R0R4R8          加低端的字
ADCS    R1R5R9          加第二个字,带进位
ADCS    R2R6R10        加第三个字,带进位
ADC      R3R7R11        加第四个字,带进位
9SUB指令(相减)
SUB指令的格式为:
SUB{条件}{S} 目的寄存器,操作数1,操作数2
SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即 数。该指令可用于有符号数或无符号数的减法运算。
指令示例:
SUB     R0R1R2                 R0 = R1 - R2
SUB     R0R1#256            R0 = R1 - 256
SUB     R0R2R3LSL#1      R0 = R2 - (R3 << 1)

10~~~~C指令
~~~~C指令的格式为:
~~~~C{条件}{S} 目的寄存器,操作数1,操作数2
~~~~C指令用于把操作数1减去操作数2,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以 是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。
指令示例:
SUBS    R0R1R2        R0 = R1 - R2 - C,并根据结果设置CPSR的进位标志位
11R~~~~指令
R~~~~指令的格式为:
R~~~~{条件}{S} 目的寄存器,操作数1,操作数2
R~~~~指令称为逆向减法指令,用于把操作数2减去操作数1,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位 的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。
指令示例:
R~~~~     R0R1R2                         R0 = R2 – R1
R~~~~     R0R1#256                     R0 = 256 – R1
R~~~~     R0R2R3LSL#1           R0 = (R3 << 1) - R2
12RSC指令(反向带进位减)
RSC指令的格式为:
RSC{条件}{S} 目的寄存器,操作数1,操作数2
RSC指令用于把 操作数2减去操作数1,再减去CPSR中的C条件标志位的反码,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位 的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32位的减法,注意不要忘记设置S后缀来更改进位标志。该指令可用于有符号数或 无符号数的减法运算。
指令示例:
RSC     R0R1R2           R0 = R2 – R1 - C
13AND指令(逻辑位 与)
AND指令的格式为:
     AND{条件}{S} 目的寄存器,操作数1,操作数2
AND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个 立即数。该指令常用于屏蔽操作数1的某些位。
指令示例:
AND R0R0,#3          ;该指令保持R001位,其余位清零。
14ORR指令(逻辑位 或)
ORR指令的格式为:
     ORR{条件}{S} 目的寄存器,操作数1,操作数2
ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个 立即数。该指令常用于设置操作数1的某些位。
指令示例:
ORR R0R0,#3        ;该指令设置R001位,其余位保持不变。
15EOR指令(逻辑位 异或)
EOR指令的格式为:
     EOR{条件}{S} 目的寄存器,操作数1,操作数2
EOR指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一 个立即数。该指令常用于反转操作数1的某些位。
指令示例:
EOR R0R0,#3        ;该指令反转R001位,其余位保持不变。
16BIC指令(位清零)
BIC指令的格式为:
     BIC{条件}{S} 目的寄存器,操作数1,操作数2
BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。 操作数232位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不 变。
指令示例:
BIC R0R0,#%1011    ;该指令清除R0中的位 01、和 3,其余的位保持不变。


三、乘法指令与乘加指令

ARM 微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器 必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。
乘法指令与乘加指令共有以下6条:
1MUL指令(相乘)
MUL指令的格式为:
     MUL{条件}{S} 目的寄存器,操作数1,操作数2
MUL指令完成将操作数1与操作数2的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操 作数2均为32位的有符号数或无符号数。
指令示例:
MUL R0R1R2            R0 = R1 × R2
MULS R0R1R2            R0 = R1 × R2,同时设置CPSR中的相关条件标志位
2MLA指令(带累加的相乘)
MLA指令的格式为:
     MLA{条件}{S} 目的寄存器,操作数1,操作数2,操作数3
MLA指令完成将操作数1与操作数2的乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志 位。其中,操作数1和操作数2均为32位的有符号数或无符号数。
指令示例:
MLA   R0R1R2R3            R0 = R1 × R2 + R3
MLAS R0R1R2R3            R0 = R1 × R2 + R3,同时设置CPSR中的相关条件标志位
3SMULL指令
SMULL指令的格式为:
     SMULL{条件}{S}   目的寄存器Low,目的寄存器High,操作数1,操作数2
SMULL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以 根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。
指令示例:
SMULL   R0R1R2R3     R0 = R2 × R3)的低32
                                                   R1 = R2 × R3)的高32
4SMLAL指令
SMLAL指令的格式为:
    SMLAL{条件}{S}   目的寄存器Low,目的寄存器High,操作数1,操作数2
SMLAL指令完成将操作数1与操作数2的乘法运算,并把结果的 32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High中,同 时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的有符号数。
对于目的寄存器Low,在指令执行前存放位加数的低32位,指令执行后存放结果的低32位;对于目的寄存器High,在指令执行前存放位加数的高32位,指令执行后存放结果的高32位。
指令示例:
SMLAL   R0R1R2R3       R0 = R2 × R3)的低32 R0
R1 = R2 × R3)的高32 R1
5UMULL指令
UMULL指令的格式为:
    UMULL{条件}{S}   目的寄存器Low,目的寄存器High,操作数1,操作数2
UMULL指令完成将操作数1与操作数2的乘法运算,并把结果的低32位放置到目的寄存器Low中,结果的高32位放置到目的寄存器High中,同时可以 根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。
指令示例:
UMULL   R0R1R2R3       R0 = R2 × R3)的低32
R1 = R2 × R3)的高32
6UMLAL指令
UMLAL指令的格式为:
    UMLAL{条件}{S}   目的寄存器Low,目的寄存器High,操作数1,操作数2
UMLAL指令完成将操作数1与操作数2的乘法运算,并把结果的 32位同目的寄存器Low中的值相加后又放置到目的寄存器Low中,结果的高32位同目的寄存器High中的值相加后又放置到目的寄存器High 中,同 时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1和操作数2均为32位的无符号数。
对于目的寄存器Low,在指令执行前存放位加数的低32位,指令执行后存放结果的低32位;对于目的寄存器High,在指令执行前存放位加数的高32位,指令执行后存放结果的高32位。
指令示例:
UMLAL   R0R1R2R3            R0 = R2 × R3)的低32 R0
                                                           R1 = R2 × R3)的高32 R1
四、程序状态寄存器访问指令

1MRS指令
MRS指令的格式为:
    MRS{条件}    通用寄存器 程序状态寄存器(CPSRSPSR
MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情况:
Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
Ⅱ.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
指令示例:
MRS R0CPSR                         ;传送CPSR的内容到R0
MRS R0SPSR                         ;传送 SPSR的内容到R0
2MSR指令
MSR指令的格式为:
     MSR{条件}    程序状态寄存器(CPSRSPSR_<>,操作数
MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<>用于设置程序状态寄存器中需要 操作的位,32位的程序状态寄存器可分为4个域:
[3124]为条件位域,用f表示;
[2316]为状态位域,用s表示;
[158] 为扩展位域,用x表示;
[70]    为控制位域,用c表示;
该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。
指令示例:
MSR CPSRR0        ;传送R0的内容到CPSR
MSR SPSRR0        ;传送R0的内容到SPSR
MSR CPSR_cR0     ;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域


六、批量数据加载/存储指令。ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令 用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。常用的加载存储指令如下:LDM(或STM)指令
      LDM(或STM)指令的格式为:


七、数据交换指令
1SWP指令
SWP指令的格式为:
SWP{条件} 目的寄存器,源寄存器1[源寄存器2]
SWP指令用于将源寄存器2所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器1中的字数据传送到源寄存器2所指向的存储器中。显然,当源寄存 1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。
指令示例:
SWP   R0R1[R2]     ;将R2所指向的存储器中的字数据传送到R0,同时将R1 中的字数据传送到R2所指向的存储单元。
SWP   R0R0[R1]     ;该指令完成将R1所指向的存储器中的字数 据与R0中的数据交换。
2SWPB指令
SWPB指令的格式为:
SWP{条件}B 目的寄存器,源寄存器1[源寄存器2]
SWPB指令用于将源寄存器2所指向的存储器中的字节数据传送到目的寄存器中,目的寄存器的高24清零,同时将源寄存 1中的字节数据传送到源寄存器2所指向的存储器中。显然,当源寄存器1和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。
指令示例:
SWPB   R0R1[R2]       ;将R2所指向的存储器中的字节数据传送到 R0R0的高24位清零,同时将R1中的低8位数据传送到R2所指向的存储单元。
SWPB   R0R0[R1]      ;该指令完成将R1所指向的存储器中的 字节数据与R0中的低8位数据交换。

八、移位指令

1LSL(或ASL
LSL(或ASL)的格式为:
通用寄存器,LSL(或ASL 操作数     
LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。 其中,操作数可以是通用寄存器,也可以是立即数(031)。
操作示例
MOV   R0, R1, LSL #2          ;将R1中的内容左移两位后传送到R0 中。
2LSR
LSR的格式为:
通用寄存器,LSR 操作数     
LSR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以 是通用寄存器,也可以是立即数(031)。
操作示例:
MOV   R0, R1, LSR #2         ;将R1中的内容右移两位后传送到R0 中,左端用零来填充。
3ASR
ASR的格式为:
通用寄存器,ASR 操作数     
ASR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用第31位的值来填充。其中,操作数可以是通用寄存器,也可以是立 即数(031)。
操作示例:
MOV    R0, R1, ASR #2        ;将R1中的内容右移两位后传送到R0 中,左端用第31位的值来填充。
4ROR
ROR的格式为:
通用寄存器,ROR 操作数     
ROR可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也 可以是立即数(031)。显然,当进行32位的循环右移操作时,通用寄存器中的值不改变。
操作示例:
MOV    R0, R1, ROR #2       ;将R1中的内容循环右移两位后传送到R0 中。
5RRX
RRX的格式为:
通用寄存器,RRX 操作数     
RRX可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位C来填充。其中,操作数可以是通用寄 存器,也可以是立即数(031)。
操作示例:
MOV   R0, R1, RRX #2         ;将R1中的内容进行带扩展的循环右移两位 后传送到R0中。

九、协处理器指令
1CDP指令
CDP指令的格式为:
CDP{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2
CDP指令用于ARM处理器通知ARM协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1和协处理 器操作码2为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM处理器的寄存器和存储器。
指令示例:
CDP   P32C12C10C34   ;该指令完成协处理器P3的初始化
2LDC指令
LDC指令的格式为:
LDC{条件}{L} 协处理器编码,目的寄存器,[源寄存器]
LDC指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指 令为长读取操作,如用于双精度数据的传输。
指令示例:
LDC   P3C4[R0]        ;将ARM处理器的寄存器R0所指向的存储器中的字数 据传送到协处理器P3的寄存器C4中。
3STC指令
STC指令的格式为:
STC{条件}{L} 协处理器编码,源寄存器,[目的寄存器]
STC指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指 令为长读取操作,如用于双精度数据的传输。
指令示例:
STC   P3C4[R0]     ;将协处理器P3的寄存器C4中的字数据传送到ARM处理 器的寄存器R0所指向的存储器中。
4MCR指令
MCR指令的格式为:
MCR{条件} 协处理器编码,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2
MCR指令用于将ARM处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理 器操作码2为协处理器将要执行的操作,源寄存器为ARM处理器的寄存器,目的寄存器1和目的寄存器2均为协处理器的寄 存器。
指令示例:
MCR   P33R0C4C56     ;将ARM处理器寄存器R0中的数据传送到协处 理器P3的寄存器C4C5中。
5MRC指令
MRC指令的格式为:
MRC{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2
MRC指令用于将协处理器寄存器中的数据传送到ARM处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1和协处理 器操作码2为协处理器将要执行的操作,目的寄存器为ARM处理器的寄存器,源寄存器1和源寄存器2均为协处理器的寄存器。
指令示例:
MRC   P33R0C4C56     ;该指令将协处理器P3的寄存器中的数据传送到 ARM处理器寄存器中。

十、异常产生指令
1SWI指令
SWI指令的格式为:
SWI{条件} 24位的立即数
SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在SWI的异常处理程序中提供相应的系统服务,指令中24位的立即数指定用 户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0的内容决定,同 时,参数通过其他通用寄存器传递。
指令示例:
SWI   0x02                ;该指令调用操作系统编号位02的系统例程。
2BKPT指令
BKPT指令的格式为:
BKPT   16位的立即数
BKPT指令产生软件断点中断,可用于程序的调试。

ARM汇编伪指令

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

一、符号定义(Symbol Definition)伪指令   
符号定义伪指令用于定义ARM 汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。   
常见的符号定义伪指令有如下几种:   
    — 用于定义全局变量的GBLA GBLL GBLS    
    — 用于定义局部变量的LCLA LCLL LCLS    
    — 用于对变量赋值的SETA SETL SETS    
    — 为通用寄存器列表定义名称的RLIST    
1GBLAGBLL GBLS   
    语法格式:   
    GBLA GBLL GBLS )全局变量名   
    GBLA GBLL GBLS 伪指令用于定义一个ARM 程序中的全局变量,并将其初始化。其中:   
    GBLA 伪指令用于定义一个全局的数字变量,并初始化为0    
    GBLL 伪指令用于定义一个全局的逻辑变量,并初始化为F(假);   
    GBLS 伪指令用于定义一个全局的字符串变量,并初始化为空;   
    由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。   
    使用示例:   
    GBLA Test1            定义一个全局的数字变量,变量名为 Test1   
    Test1 SETA 0xaa    将该变量赋值为0xaa   
    GBLL Test2             定义一个全局的逻辑变量,变量名为 Test2   
    Test2 SETL {TRUE} ;将该变量赋值为真。   
    GBLS Test3              定义一个全局的字符串变量,变量名为 Test3   
    Test3 SETS “Testing” ;将该变量赋值为"Testing” 

2LCLALCLL LCLS   
    语法格式:   
    LCLA LCLL LCLS )局部变量名   
    LCLA LCLL LCLS 伪指令用于定义一个ARM 程序中的局部变量,并将其初始化。其中:   
    LCLA伪指令用于定义一个局部的数字变量,并初始化为0    
    LCLL伪指令用于定义一个局部的逻辑变量,并初始化为F(假);   
    LCLS伪指令用于定义一个局部的字符串变量,并初始化为空;   
    以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。   
    使用示例:   
    LCLA Test4             声明一个局部的数字变 量,变量名为Test4 
    Test3 SETA 0xaa    将该变量赋值为0xaa  

   LCLL Test5              声明一个局部的逻辑变 量,变量名为Test5   
    Test4 SETL {TRUE} ;将该变量赋值为真。   
    LCLS Test6              定义一个局部的字 符串变量,变量名为Test6   
    Test6 SETS “Testing” ;将该变量赋值为 "Testing”  

3SETASETL SETS   
    语法格式:   
    变量名 SETA SETL SETS )表达式   
    伪指令 SETA SETL SETS 用于给一个已经定义的全局变量或局部变量赋值。   
    SETA伪指令用于给一个数学变量赋值;   
    SETL伪指令用于给一个逻辑变量赋值;   
    SETS伪指令用于给一个字符串变量赋值;   
    其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。   
    使用示例:   
    LCLA Test3              声明一个局部的数字变量,变量名为 Test3   
    Test3 SETA 0xaa     将该变量赋值为0xaa   
    LCLL Test4              声明一个局部的逻辑变量,变量名为 Test4   
    Test4 SETL {TRUE} ;将该变量赋值为真。  

4 RLIST   
    语法格式:   
    名称 RLIST { 寄存器列表 }   
    RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM 指令 LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。   
    使用示例:   
    RegList RLIST {R0-R5 R8 R10} ;将寄存器列表名称定义为 RegList ,可在ARM指令LDM/STM中通过该名称访问寄存器列表。  

三、汇编控制(Assembly Control)伪指令   
汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:   
    — IF ELSE ENDIF   
    — WHILE WEND   
    — MACRO MEND   
    — MEXIT
1IFELSEENDIF   
    语法格式:   
    IF 逻辑表达式   
    指令序列 1   
    ELSE   
    指令序列 2   
    ENDIF   
    IF ELSE ENDIF伪指令能根据条件的成立与否决定是否执行某个指令序列。当IF后面的逻辑表达式为真,则执行指令序列1 ,否则执行指令序列2 。其中,ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行指令序列1 ,否则继续执行后面的指令。   
    IF ELSE ENDIF伪指令可以嵌套使用。   
    使用示例:   
    GBLL Test ;声明一个全局的逻辑变量,变量名为Test  
    IF Test = TRUE   
    指令序列 1   
    ELSE   
    指令序列 2   
    ENDIF   

2WHILEWEND   
    语法格式:   
    WHILE 逻辑表达式   
    指令序列   
    WEND   
    WHILE WEND伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断 逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。   
    WHILE WEND伪指令可以嵌套使用。   
    使用示例:   
    GBLA Counter    声明一个全局的数学变量,变量名为Counter   
    Counter SETA 3 ;由变量Counter 控制循环次数   
    ……   
    WHILE Counter &lt; 10   
    指令序列   
    WEND   

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

4MEXIT   
    语法格式:   
    MEXIT   
    MEXIT用于从宏定义中跳转出去。 

四、其他常用的伪指令   
还有一些其他的伪指令,在汇编程序中经常会被使用,包括以下几条:   
    — AREA
    — ALIGN   
    — CODE16 CODE32   
    — ENTRY   
    — END   
    — EQU   
    — EXPORT(或GLOBAL    
    — IMPORT   
    — EXTERN   
    — GET(或INCLUDE    
    — INCBIN   
    — RN   
    — ROUT   
1AREA   
    语法格式:   
    AREA 段名 属性1 ,属性2 ……   
    AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用“|”括起来,如:|1_test|    
    属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:   
    — CODE 属性:用于定义代码段,默认为READONLY    
    — DATA 属性:用于定义数据段,默认为READWRITE    
    — READONLY 属性:指定本段为只读,代码段默认为READONLY    
    — READWRITE 属性:指定本段为可读可写,数据段的默认属性为READWRITE    
    — ALIGN 属性:使用方式为ALIGN表达式。在默认时,ELF(可执行连接文件)的代码段和数据段是按字对齐的,表达式的取值范围为031,相应的对齐方式为2 表达式次方。   
    — COMMON 属性:该属性定义一个通用的段,不包含任何的用户代码和数据。各源文件中同名的COMMON段共享同一段存储单元。
    一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据段。   
    使用示例:   

5END   
    语法格式:   
    END   
    END伪指令用于通知编译器已经到了源程序的结尾。   
    使用示例:   
    AREA Init CODE READONLY   
    …… 
    END ;指定应用程序的结尾  

6EQU   
    语法格式:   
    名称 EQU 表达式 { ,类型 }   
    EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define 。其中EQU可用“*”代替。名称为EQU伪指令定义的字符名称,当表达式为32位的常量时,可以指定 表达式的数据类型,可以有以下三种类型:   
    CODE16 CODE32 DATA   
    使用示例:   
    Test EQU 50                        定义标号Test 的值为50   
    Addr EQU 0x55 CODE32 定义Addr的值为0x55 ,且该处为32位的ARM指令。   

7EXPORT(或GLOBAL   
    语法格式:   
    EXPORT 标号 {[WEAK]}   
    EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。EXPORT 可用GLOBAL代替。标号在程序中区分大小写,[WEAK] 选项声明其他的同名标号优先于该标号被引用。   
    使用示例:   
    AREA Init CODE READONLY   
    EXPORT Stest ;声明一个可全局引用的标号Stest  
    END   

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

9EXTERN   
    语法格式:   
    EXTERN 标号 {[WEAK]}   
    EXTERN伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该 标号就不会被加入到当前源文件的符号表中。标号在程序中区分大小写, [WEAK] 选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0 ,若该标号为BBL指令引用,则将BBL指令置为NOP操作。   
    使用示例:   
    AREA Init CODE READONLY   
    EXTERN Main ;通知编译器当前文件要引用标号Main,但Main在其他源文件中定 义。  
    END   

10GET(或INCLUDE   
    语法格式:   
    GET 文件名   
    GET伪指令用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可 以使用INCLUDE代替GET   
    汇编程序中常用的方法是在某源文件中定义一些宏指令,用EQU定义常量的符号名称,用MAPFIELD定义结构化的数据类型,然后用GET伪指令将这个 源文件包含到其他的源文件中。使用方法与C 语言中的"include” 相似。   
    GET伪指令只能用于包含源文件,包含目标文件需要使用INCBIN伪指令   
    使用示例:   
    AREA Init CODE READONLY   
    GET a1.s         通知编译器当前源文件包含源文件a1.s   
    GET C\a2.s 通知编译器当前源文件包含源文件C\a2.s
    END   

11INCBIN   
    语法格式:   
    INCBIN 文件名   
    INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理。   
    使用示例:   
    AREA Init CODE READONLY   
    INCBIN a1.dat      通知编译器当前源文件包含文件a1.dat   
    INCBIN C\a2.txt ;通知编译器当前源文件包含文件C\a2.txt 
    END   

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

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

3. BNE   BEQ

TST     R0, #0X8
BNE    SuspendUp BNE指令是不相等(或不为0)跳转指令

LDR   R1,#0x00000000

先进行and运算,如果R0的第四位不为1,则结果为零,则设置zero=1(继续下面的LDR指令);

否则,如果R0的第四位为1zero=0(跳到SuspendUp处执行)。

tst bne连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果不为0,则跳到bne紧跟着的标记(如bne sleep,则跳到sleep处)。

tst beq连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果为0,则跳到beq紧跟着的标记(如bne AAAA,则跳到AAAA处)。

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

Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务