常用▲RM指令集及汇编 ver:10.12 位得到。 合法常量: 0x3FC、0、0xF0000000、200,0xF0000001 非法常量: 0xlFE、511、0 XFFFF、0x1010、0xF0000010 常数表达式应用举例如下: MOV RO.#1 RO=1 ANDR1,R2,#0xOF;R2与0xOF,结果保存在R LDRR0,[R1],#-4;读取R1地址上的存储器单元内容,且R=R1-4 Rm 寄存器方式,在寄存器方式下操作数即为寄存器的数值 寄存器方式应用举例 SUB RI, RI, R2: R1-R2=>RI MOV PC, RO ;PC=RO,程序跳转到指定地址 LDR RO,[R1],-R2;读取Rl地址上的存储器单元内容并存入R0,且Rl=R1-R2 Rm shift 寄存器移位方式。将寄存器的移位结果作为操作数,但M值保存不变,移位方法 如下 ASR#n算术右移n位(1≤n≤32) LSL#n逻辑左移n位(1≤n≤31) LSR#n逻辑左移n位(1≤n≤32) ROR#n循环右移n位(1≤n≤31) 带扩展的循环右移1位 type Rs其中,type为ASR,LSL,和ROR中的一种;Rs偏移量寄存器,低8 位有效,若其值大于或等于32,则第2个操作数的结果为0(ASR、ROR 例外)。 寄存器偏移方式应用举例 DD RI, RI, RI, LSL #3: R1=RI=9 %%嗡%嗡嗡嗡%%嗡%嗡嗡吼嗡%嗡嗡嗡哈嗡吼%哈嗡哈 By宛城布衣QQ:57523799emai:mcu8031@163cm 第8页
常用 ARM 指令集及汇编 Ver:1.0.12 位得到。 合法常量: 0x3FC、0、0xF0000000、200,0xF0000001 非法常量: 0x1FE、511、0xFFFF、0x1010、0xF0000010 常数表达式应用举例如下: MOV R0,#1 ;R0=1 AND R1,R2,#0x0F ;R2 与 0x0F,结果保存在 R1 LDR R0,[R1],#-4 ;读取 R1 地址上的存储器单元内容,且 R1=R1-4 Rm 寄存器方式,在寄存器方式下操作数即为寄存器的数值。 寄存器方式应用举例: SUB R1,R1,R2 ;R1-R2=>R1 MOV PC,R0 ;PC=R0,程序跳转到指定地址 LDR R0,[R1],-R2 ;读取 R1 地址上的存储器单元内容并存入 R0,且 R1=R1-R2 Rm,shift 寄存器移位方式。将寄存器的移位结果作为操作数,但 RM 值保存不变,移位方法 如下: ASR #n 算术右移 n 位(1≤n≤32) LSL #n 逻辑左移 n 位(1≤n≤31) LSR #n 逻辑左移 n 位(1≤n≤32) ROR #n 循环右移 n 位(1≤n≤31) RRX 带扩展的循环右移 1 位 type Rs 其中,type 为 ASR,LSL,和 ROR 中的一种;Rs 偏移量寄存器,低 8 位有效,若其值大于或等于 32,则第 2 个操作数的结果为 0(ASR、ROR 例外)。 寄存器偏移方式应用举例: ADD R1,R1,R1,LSL #3 ;R1=R1*9 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 8 页
常用▲RM指令集及汇编 ver:10.12 SUB RI, RI, R2, LSR#2: R1=Rl-R2:*4 R15为处理器的程序计数器PC,一般不要对其进行操作,而且有些指令是不允许使 用R15,如UMUL指令。 条件码 使用指令条件码,可实现高效的逻辑操作,提高代码效率。 条件码表 条件码助记符标志 含义 Z=1 NE Z=0 不相等 「cS/H 「无符号数大于或等于 CC/LO 无符号数小于 负数 N=0 正数或零 溢出 SHS 没有溢出 C=1,Z=0无符号数大于 C=0,Z=1无符号数小于或等于 带符号数大于或等于 LT N! =V 带符号数小于 GT Z=0, N=V 符号数大于 Z=1,N!=带符号数小于或等于 任何 无条件执行(指令默认条件) 对于 Thumb指令集,只有B指令具有条件码执行功能,此指令条件码同表2.1,但 如果为无条件执行时,条件码助记符“AL”不能在指令中书写。 条件码应用举例如下: 比较两个值大小,并进行相应加1处理,C代码为 if (a>b) a++: lse b++ 对应的AM指令如下。其R0为a,R1为b CMP RO, RI ;R0与R1比较 ADDHI R0,RO,#1:若R0>R1,则RO=R0+1 DDLS R1,R1,#1:若R0<=R1,则R1=R1+1 若两个条件均成立,则将这两个数值相加,C代码为 %%嗡%嗡嗡%嗡%嗡嗡吼嗡%嗡嗡嗡吼哈嗡嗡%嗡 By宛城布衣QQ:57523799emai:mcu8031@163cm 第9页
常用 ARM 指令集及汇编 Ver:1.0.12 SUB R1,R1,R2,LSR#2 ;R1=R1-R2*4 R15 为处理器的程序计数器 PC,一般不要对其进行操作,而且有些指令是不允许使 用 R15,如 UMULL 指令。 条件码 使用指令条件码,可实现高效的逻辑操作,提高代码效率。 条件码表 条件码助记符 标志 含义 EQ Z=1 相等 NE Z=0 不相等 CS/HS C=1 无符号数大于或等于 CC/LO C=0 无符号数小于 MI N=1 负数 PL N=0 正数或零 VS V=1 溢出 VC V=0 没有溢出 HI C=1,Z=0 无符号数大于 LS C=0,Z=1 无符号数小于或等于 GE N=V 带符号数大于或等于 LT N!=V 带符号数小于 GT Z=0,N=V 带符号数大于 LE Z=1,N!=V 带符号数小于或等于 AL 任何 无条件执行(指令默认条件) 对于 Thumb 指令集,只有 B 指令具有条件码执行功能,此指令条件码同表 2.1,但 如果为无条件执行时,条件码助记符“AL”不能在指令中书写。 条件码应用举例如下: 比较两个值大小,并进行相应加 1 处理,C 代码为 if(a>b)a++; else b++; 对应的 ARM 指令如下。其 R0 为 a,R1 为 b。 CMP R0,R1 ;R0 与 R1 比较 ADDHI R0,R0,#1 ;若 R0>R1,则 R0=R0+1 ADDLS R1,R1,#1 ;若 R0<=R1,则 R1=R1+1 若两个条件均成立,则将这两个数值相加,C 代码为 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 9 页
常用▲RM指令集及汇编 ver:10.12 If((a!=10)&&(b!=20))a=a+b 对应的ARM指令如下.其中RO为a,R1为b. CMP RO. #10 比较R0是否为10 CMPNE R1,#20;若R0不为10,则比较R1是否20 ADDNE RO,RO,R1;若R0不为10且R1不为20,指令执行,R0=RO+R1 %%嗡%嗡嗡%嗡%嗡嗡吼嗡%嗡嗡嗡吼哈嗡嗡%嗡 By宛城布衣QQ:57523799emai:mcu8031@163cm
常用 ARM 指令集及汇编 Ver:1.0.12 If((a!=10)&&(b!=20)) a=a+b; 对应的 ARM 指令如下.其中 R0 为 a,R1 为 b. CMP R0,#10 ;比较 R0 是否为 10 CMPNE R1,#20 ;若 R0 不为 10,则比较 R1 是否 20 ADDNE R0,R0,R1 ;若 R0 不为 10 且 R1 不为 20,指令执行,R0=R0+R1 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 10 页
常用▲RM指令集及汇编 ver:10.12 ARM存储器访问指令 ANM处理是加载/存储体系结构的典型的RISC处理器,对存储器的访问只能使用加 载和存储指令实现。ARM的加载/存储指令是可以实现字、半字、,无符/有符字节操作 批量加载/存储指令可实现一条指令加载/存储多个寄存器的内容,大大提高效率;SWP 指令是一条寄存器和存储器内容交换的指令,可用于信号量操作等。ARM处理器是冯 诺依曼存储结构,程序空间、RM空间及I0映射空间统一编址,除对对RM操作以外, 对外围I0、程序数据的访问均要通过加载/存储指令进行 RM存储访问指令表 助记符 说明 条件码位量 DR Rd, addressing 加载字数据 Rd←[ addressing, addressing索引| LDRIcond 加载无符字节数据 Rd← addressing, addressing索引| LDRIcond}B drt Rd, addressing以用户模式加载字数据 Rd←[ addressing], addressing索 DRBt Ro, addressing以用户模式加载无符号字数据Rd- Addressing, addressing索引 Ldh Rd, addressing加载无符半字数 rsb Rd, addressing|加载有符字节数据 Rd←[ addressing, addressing索引| LDRIcond)SB addressing加载有符半字数据 Ra- addressing, addressing索引| LDRIcond) SH addressing存储字数据 addressing],-Rd, addressing索引| STRIcondl sm Rd, addressing存储字节数据 [ addressing]←Rd, addressing索引 STRicond}B Rd, addressing以用户模式存储字数据 addressing←Rd, addressing索引| STRIcond}T srtbt Rd, addressing以用户模式存储字节数据 addressing←Rd, addressing索引| STRIcond}BT sTrH Rd, addressing存储半字数据 addressing←Rd, addressing索引 STRicond}H LDM{ modeRn{!}, reglist批量(寄存器)加载 reglist←[Rn…],Rn回存等 LDMcondl morel STM model}Rn{!}, rtglist批量(寄存器)存储 [Rn…]← reglist,Ra回存等 STM[cond)imore) SWP Rd Rm, Rn 寄存器和存储器字数据交换 Rd←[Rd],[Ran]-[Rm](Rn≠Rd或Rm)| SWPIcond SWPb Rd Rm. Rn 寄存器和存储器字节数据交换|Rd-[Ra],[R][Rm](R≠Rd或Rm)| SWPIcond) B ◆LDR和STR 加载/存储字和无符号字节指令.使用单一数据传送指令(STR和LDR)来装载和存储 单一字节或字的数据从/到内存.LDR指令用于从内存中读取数据放入寄存器中;STR指 令用于将寄存器中的数据保存到内存.指令格式如下 LDR{cond}(T}Rd,<地址>;加载指定地址上的数据(字),放入Rd中 STR{cond}T}Rd,<地址>存储数据(字)到指定地址的存储单元,要存储的数据在Rd中 cond}B{T}Rd,<地址>:加载字节数据,放入Rd中,即Rd最低字节有效,高24位清零 嗡嗡%%嗡嗡嗡嗡嗡吼嗡嗡嗡嗡%嗡嗡嗡%嗡嗡嗡吼嗡嗡嗡嗡嗡嗡 By宛城布衣QQ:57523799emai:mcu8031@163cm
常用 ARM 指令集及汇编 Ver:1.0.12 ARM 存储器访问指令 ARM 处理是加载/存储体系结构的典型的 RISC 处理器,对存储器的访问只能使用加 载和存储指令实现。ARM 的加载/存储指令是可以实现字、半字、,无符/有符字节操作; 批量加载/存储指令可实现一条指令加载/存储多个寄存器的内容,大大提高效率;SWP 指令是一条寄存器和存储器内容交换的指令,可用于信号量操作等。ARM 处理器是冯. 诺依曼存储结构,程序空间、RAM 空间及 IO 映射空间统一编址,除对对 RAM 操作以外, 对外围 IO、程序数据的访问均要通过加载/存储指令进行。 ARM 存储访问指令表 助记符 说明 操作 条件码位置 LDR Rd,addressing 加载字数据 Rd←[addressing],addressing 索引 LDR{cond} LDRB Rd,addressing 加载无符字节数据 Rd←[addressing],addressing 索引 LDR{cond}B LDRT Rd,addressing 以用户模式加载字数据 Rd←[addressing],addressing 索引 LDR{cond}T LDRBT Rd,addressing 以用户模式加载无符号字数据 Rd←[addressing],addressing 索引 LDR{cond}BT LDRH Rd,addressing 加载无符半字数据 Rd←[addressing],addressing 索引 LDR{cond}H LDRSB Rd,addressing 加载有符字节数据 Rd←[addressing],addressing 索引 LDR{cond}SB LDRSH Rd,addressing 加载有符半字数据 Rd←[addressing],addressing 索引 LDR{cond}SH STR Rd,addressing 存储字数据 [addressing]←Rd,addressing 索引 STR{cond} STRB Rd,addressing 存储字节数据 [addressing]←Rd,addressing 索引 STR{cond}B STRT Rd,addressing 以用户模式存储字数据 [addressing]←Rd,addressing 索引 STR{cond}T SRTBT Rd,addressing 以用户模式存储字节数据 [addressing]←Rd,addressing 索引 STR{cond}BT STRH Rd,addressing 存储半字数据 [addressing]←Rd,addressing 索引 STR{cond}H LDM{mode} Rn{!},reglist 批量(寄存器)加载 reglist←[Rn…],Rn 回存等 LDM{cond}{more} STM{mode} Rn{!},rtglist 批量(寄存器)存储 [Rn…]← reglist,Rn 回存等 STM{cond}{more} SWP Rd,Rm,Rn 寄存器和存储器字数据交换 Rd←[Rd],[Rn]←[Rm](Rn≠Rd 或 Rm) SWP{cond} SWPB Rd,Rm,Rn 寄存器和存储器字节数据交换 Rd←[Rd],[Rn]←[Rm](Rn≠Rd 或 Rm) SWP{cond}B LDR 和 STR 加载/存储字和无符号字节指令.使用单一数据传送指令(STR 和 LDR)来装载和存储 单一字节或字的数据从/到内存.LDR 指令用于从内存中读取数据放入寄存器中;STR 指 令用于将寄存器中的数据保存到内存.指令格式如下: LDR{cond}{T} Rd,<地址>;加载指定地址上的数据(字),放入 Rd 中 STR{cond}{T} Rd,<地址>;存储数据(字)到指定地址的存储单元,要存储的数据在 Rd 中 LDR{cond}B{T} Rd,<地址>;加载字节数据,放入 Rd 中,即 Rd 最低字节有效,高 24 位清零 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 11 页
常用▲RM指令集及汇编 ver:10.12 sTR{cond}BTRd,<地址冫;存储字节数据,要存储的数据在Rd,最低字节有效 其中,T为可选后缀,若指令有T,那么即使处理器是在特权模式下,存储系统也将访 问看成是处理器是在用户模式下.T在用户模式下无效,不能与前索引偏移一起使用T LDR/STR指令寻址是非常灵活的,由两部分组成,一部分为一个基址寄存器,可以为任 个通用寄存器,另一部分为一个地址偏移量.地址偏移量有以下3种格式: (1)立即数.立即数可以是一个无符号数值,这个数据可以加到基址寄存器,也可 以从基址寄存器中减去这个数值.指令举例如下 LDRR1,[RO,#0x12];将R0+0x12地址处的数据读出,保存到R1中(RO的值不变) LDRR1,[R0,#-0x12];将R0-0x12地址处的数据读出,保存到R1中(R0的值不变) LDR RI, [ ROT 将R0地址处的数据读出,保存到R1中(零偏移) 2)寄存器.寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这 个数值.指令举例值.指令举例如下: LDRR1,[RO,R2];将R0+R2地址的数据计读出,保存到R1中(RO的值不变) LDRR1,[RO,-R2];将R0R2地址处的数据计读出,保存到R1中(RO的值不变) 3)寄存器及移位常数寄存器移位后的值可以加到基址寄存器,也可以从基址寄 存器中减去这个数值.指令举例如下 LDRR1,[RO,R2,LSL#2];将R0+R2*4地址处的数据读出,保存到R中(RO,R2的值不变) LDRR1,[RO,-R2,LSL#2];将RO-R2*4地址处的数据计读出,保存到R1中(RO,R2的值不变) 从寻址方式的地址计算方法分,加载/存储指令有以下4种形式 (1)零偏移.Rn的值作为传送数据的地址,即地址偏移量为0.指令举例如下: LDR Rd, [Rn] 2)前索引偏移.在数据传送之前,将偏移量加到Rn中,其结果作为传送数据的存储 地址若使用后缀“!”,则结果写回到Rn中,且Rn值不允许为R15.指令举例如下 LDR Rd, [Rn, #0x04! LDR Rd, [Rn, #-0x04 (3)程序相对偏移.程序相对偏移是索引形式的另一个版本汇编器由PC寄存器计 算偏移量,并将PC寄存器作为R生成前索引指令.不能使用后缀“!”.指令举例如下: Ldr Rd, label;1abel为程序标号,labe必须是在当前指令的±4KB范围内 (4)后索引偏移.Ra的值用做传送数据的存储地址.在数据传送后,将偏移量与Rn %%嗡%%%嗡%嗡%嗡嗡吼嗡%嗡嗡嗡哈嗡嗡%%嗡哈 By宛城布衣QQ:57523799emai:mcu8031@163cm
常用 ARM 指令集及汇编 Ver:1.0.12 STR{cond}B{T} Rd,<地址>;存储字节数据,要存储的数据在 Rd,最低字节有效 其中,T 为可选后缀,若指令有 T,那么即使处理器是在特权模式下,存储系统也将访 问看成是处理器是在用户模式下.T 在用户模式下无效,不能与前索引偏移一起使用 T. LDR/STR 指令寻址是非常灵活的,由两部分组成,一部分为一个基址寄存器,可以为任一 个通用寄存器,另一部分为一个地址偏移量.地址偏移量有以下 3 种格式: (1) 立即数.立即数可以是一个无符号数值,这个数据可以加到基址寄存器,也可 以从基址寄存器中减去这个数值.指令举例如下: LDR R1,[R0,#0x12] ;将 R0+0x12 地址处的数据读出,保存到 R1 中(R0 的值不变) LDR R1,[R0,#-0x12];将 R0-0x12 地址处的数据读出,保存到 R1 中(R0 的值不变) LDR R1,[R0] ;将 R0 地址处的数据读出,保存到 R1 中(零偏移) (2)寄存器.寄存器中的数值可以加到基址寄存器,也可以从基址寄存器中减去这 个数值.指令举例值.指令举例如下: LDR R1,[R0,R2] ;将 R0+R2 地址的数据计读出,保存到 R1 中(R0 的值不变) LDR R1,[R0,-R2] ;将 R0-R2 地址处的数据计读出,保存到 R1 中(R0 的值不变) (3)寄存器及移位常数.寄存器移位后的值可以加到基址寄存器,也可以从基址寄 存器中减去这个数值.指令举例如下: LDR R1,[R0,R2,LSL #2] ;将 R0+R2*4 地址处的数据读出,保存到 R1 中(R0,R2 的值不变) LDR R1,[R0,-R2,LSL #2];将R0-R2*4地址处的数据计读出,保存到R1中(R0,R2的值不变) 从寻址方式的地址计算方法分,加载/存储指令有以下 4 种形式: (1)零偏移.Rn 的值作为传送数据的地址,即地址偏移量为 0.指令举例如下: LDR Rd,[Rn] (2)前索引偏移.在数据传送之前,将偏移量加到 Rn 中,其结果作为传送数据的存储 地址.若使用后缀“!”,则结果写回到 Rn 中,且 Rn 值不允许为 R15.指令举例如下: LDR Rd,[Rn,#0x04]! LDR Rd,[Rn,#-0x04] (3)程序相对偏移.程序相对偏移是索引形式的另一个版本.汇编器由 PC 寄存器计 算偏移量,并将 PC 寄存器作为 Rn 生成前索引指令.不能使用后缀“!”.指令举例如下: LDR Rd,label ;label 为程序标号,label 必须是在当前指令的±4KB 范围内 (4) 后索引偏移.Rn 的值用做传送数据的存储地址.在数据传送后,将偏移量与 Rn IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 12 页