常用▲RM指令集及汇编 ver:10.12 LSR:逻辑右移( Logical Shift Right),寄存器中字的高端空出的位补0 ASR:算术右移( Arithmetic Shift Right),移位过程中保持符号位不变,即如 果源操作数为正数,则字的高端空出的位补0,否则补1 ROR:循环右移( Rotate Right),由字的低端移出的位填入字的高端空出的位 RR:带扩展的循环右移( Rotate Right eXtended by lplace),操作数右移一位, 高端空出的位用原C标志值填充 各移位操作如下图所示。 0LSL移位操作 LSR移位操作 ASR移位操作 ROR移位操作 RRX移位操作 寄存器间接寻址 寄存器间接寻址指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保 存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。 寄存器间接寻址指令举例如下: LDRR1,[R2];将R2中的数值作为地址,取出此地址中的数据保存在R1中 SWPR,R1,[R2];将如中的数值作为地址,取出此地址中的数值与R1中的值交换 基址寻址 基址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地 %%嗡%嗡嗡嗡%%嗡%嗡嗡吼嗡%嗡嗡嗡哈嗡吼%哈嗡哈 By宛城布衣QQ:57523799emai:mcu8031@163cm 第3页
常用 ARM 指令集及汇编 Ver:1.0.12 LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补 0 ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如 果源操作数为正数,则字的高端空出的位补 0,否则补 1 ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位 RRX:带扩展的循环右移(Rotate Right eXtended by 1place),操作数右移一位, 高端空出的位用原 C 标志值填充。 各移位操作如下图所示。 0 LSL 移位操作 0 LSR 移位操作 ASR 移位操作 ROR 移位操作 C RRX 移位操作 寄存器间接寻址 寄存器间接寻址指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保 存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。 寄存器间接寻址指令举例如下: LDR R1,[R2] ;将 R2 中的数值作为地址,取出此地址中的数据保存在 R1 中 SWP R1,R1,[R2];将如中的数值作为地址,取出此地址中的数值与 R1 中的值交换 基址寻址 基址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 3 页
常用▲RM指令集及汇编 ver:10.12 址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器 访问等。 基址寻址指令举例如下 LDRR2,[R3,#0xOF];将R3中的数值加0x0F作为地址,取出此地址的数值保存在R2中 STRR1,[RO,#-2];将RO中的数值减2作为地址,把R1中的内容保存到此地址位置 多寄存器寻址 多寄存器寻址就是一次可以传送几个寄存器值,允许一条指令传送16个寄存器的 任何子集或所有寄存器。 多寄存器寻址指令举例如下: LDMIA R1!,{R2-R7,R12};将R1单元中的数据读出到R2一R7,R12,R1自动加1 STMIA R0!,{R3-R6,R10};将R3-R6,R10中的数据保存到R0指向的地址,R0自动加1 使用多寄存器寻址指令时,寄存器子集的顺序时由小到大的顺序排列,连续的寄存 器可用“一”连接,否则,用“,”分隔书写。 堆栈寻址 堆栈是特定顺序进行存取的存储区,操作顺序分为“后进先出”和“先进后出”, 堆栈寻址时隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈), 指针所指向的存储单元就是堆栈的栈顶。存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈 堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个要 放入的空位置,称为空堆栈。这样就有4中类型的堆栈表示递增和递减的满堆栈和空堆 栈的各种组合 满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的 最高地址。指令如 LDMFA, STMFA等。 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空 位置。指令如 LDMEA, STMEA等。 %%嗡%嗡嗡嗡%%嗡%嗡嗡吼嗡%嗡嗡嗡哈嗡吼%哈嗡哈 By宛城布衣QQ:57523799emai:mcu8031@163cm
常用 ARM 指令集及汇编 Ver:1.0.12 址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器 访问等。 基址寻址指令举例如下: LDR R2,[R3,#0x0F] ;将 R3 中的数值加 0x0F 作为地址,取出此地址的数值保存在 R2 中 STR R1,[R0,#-2] ;将 R0 中的数值减 2 作为地址,把 R1 中的内容保存到此地址位置 多寄存器寻址 多寄存器寻址就是一次可以传送几个寄存器值,允许一条指令传送 16 个寄存器的 任何子集或所有寄存器。 多寄存器寻址指令举例如下: LDMIA R1!,{R2-R7,R12} ;将 R1 单元中的数据读出到 R2-R7,R12,R1 自动加 1 STMIA R0!,{R3-R6,R10};将 R3-R6,R10 中的数据保存到 R0 指向的地址,R0 自动加 1 使用多寄存器寻址指令时,寄存器子集的顺序时由小到大的顺序排列,连续的寄存 器可用“-”连接,否则,用“,”分隔书写。 堆栈寻址 堆栈是特定顺序进行存取的存储区,操作顺序分为“后进先出”和“先进后出”, 堆栈寻址时隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈), 指针所指向的存储单元就是堆栈的栈顶。存储器堆栈可分为两种: 向上生长:向高地址方向生长,称为递增堆栈 向下生长:向低地址方向生长,称为递减堆栈 堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个要 放入的空位置,称为空堆栈。这样就有 4 中类型的堆栈表示递增和递减的满堆栈和空堆 栈的各种组合。 满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的 最高地址。指令如 LDMFA,STMFA 等。 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空 位置。指令如 LDMEA,STMEA 等。 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 4 页
常用▲RM指令集及汇编 ver:10.12 满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最 低地址。指令如 LDMFD, STMFD等。 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空 位置。指令如 LDMED, STMED等 堆栈寻址指令举例如下: STMFD SP!,{R1-R7,LR};将R1~R7,LR入栈。满递减堆栈。 LDMFD SP!,{R1-R7,LR};数据出栈,放入R1~R7,LR寄存器。满递减堆栈 块拷贝寻址 多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置。 块拷贝寻址指令举例如下: STMIA RO!,{R1-R7};将RⅠ~R7的数据保存到存储器中,存储器指针在保存第 个值之后增加,增长方向为向上增长 STMIB RO!,{R1-R7};将R1~R7的数据保存到存储器中,存储器指针在保存第 个值之前增加,增长方向为向上增长。 STMDA RO!,巛R1-R7};将R1~R7的数据保存到存储器中,存储器指针在保存第 个值之后增加,增长方向为向下增长 STMDB RO!,R1-R};将R1~R7的数据保存到存储器中,存储器指针在保存第一 ;个值之前增加,增长方向为向下增长 相对寻址 相对寻址是基址寻址的一种变通,由程序计数器PC提供基准地址,指令中的地址 码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。 相对寻址指令举例如下: BL ROUTEl 调用到 ROUTE1子程序 BEQ LOOP 条件跳转到L0P标号处 LOOP MOV R2. #2 %%嗡%嗡嗡%嗡%嗡嗡吼嗡%嗡嗡嗡吼哈嗡嗡%嗡 By宛城布衣QQ:57523799emai:mcu8031@163cm 第5页
常用 ARM 指令集及汇编 Ver:1.0.12 满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最 低地址。指令如 LDMFD,STMFD 等。 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空 位置。指令如 LDMED,STMED 等。 堆栈寻址指令举例如下: STMFD SP!,{R1-R7,LR} ; 将 R1~R7,LR 入栈。满递减堆栈。 LDMFD SP!,{R1-R7,LR} ;数据出栈,放入 R1~R7,LR 寄存器。满递减堆栈。 块拷贝寻址 多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置。 块拷贝寻址指令举例如下: STMIA R0!,{R1-R7} ;将 R1~R7 的数据保存到存储器中,存储器指针在保存第一 ;个值之后增加,增长方向为向上增长。 STMIB R0!,{R1-R7} ;将 R1~R7 的数据保存到存储器中,存储器指针在保存第一 ;个值之前增加,增长方向为向上增长。 STMDA R0!,{R1-R7} ;将 R1~R7 的数据保存到存储器中,存储器指针在保存第一 ;个值之后增加,增长方向为向下增长。 STMDB R0!,{R1-R7} ;将 R1~R7 的数据保存到存储器中,存储器指针在保存第一 ;个值之前增加,增长方向为向下增长。 相对寻址 相对寻址是基址寻址的一种变通,由程序计数器 PC 提供基准地址,指令中的地址 码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。 相对寻址指令举例如下: BL ROUTE1 ;调用到 ROUTE1 子程序 BEQ LOOP ;条件跳转到 LOOP 标号处 … LOOP MOV R2,#2 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 5 页
常用▲RM指令集及汇编 ver:10.12 ROUTEl %%嗡%嗡嗡%嗡%嗡嗡吼嗡%嗡嗡嗡吼哈嗡嗡%嗡 By宛城布衣QQ:57523799emai:mcu8031@163cm 第6页
常用 ARM 指令集及汇编 Ver:1.0.12 … ROUTE1 … IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 6 页
常用▲RM指令集及汇编 ver:10.12 指令集介绍 ARM指令集 指令格式 基本格式 Opcode><cond>I[S <Rd>, <Rn>f, opcode 2>1 其中,<内的项是必须的,仆内的项是可选的,如< opcode>是指令助记符,是必须 的,而{<cond》}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行) 指令助记符,如LDR,STR等 cont 执行条件,如EQ,NE等 是否影响CPSR寄存器的值,书写时影响CPSR,否则不影响 目标寄存器 第一个操作数的寄存器 operand2 第二个操作数 指令格式举例如下: RQO,[R1];读取R1地址上的存储器单元内容,执行条件AL BEQ DATAEVEN;跳转指令,执行条件EQ,即相等跳转到 DATAEVEN ADSR1,R1,#1;加法指令,R1+1=R1影响CPSR寄存器,带有S SUBNES R1,R1,#0xD;条件执行减法运算^NE),R1-0xD=>R1,影响CPSR寄存器,带有S 第2个操作数 在ARM指令中,灵活的使用第2个操作数能提高代码效率,第2个操作数的形式如 下 #t immed 8r 常数表达式,该常数必须对应8位位图,即常数是由一个8位的常数循环移位偶数 %%嗡%嗡嗡%嗡%嗡嗡吼嗡%嗡嗡嗡吼哈嗡嗡%嗡 By宛城布衣QQ:57523799emai:mcu8031@163cm 第7页
常用 ARM 指令集及汇编 Ver:1.0.12 指令集介绍 ARM 指令集 指令格式 基本格式 <opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>} 其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须 的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件 AL(无条件执行)。 opcode 指令助记符,如 LDR,STR 等 cond 执行条件,如 EQ,NE 等 S 是否影响 CPSR 寄存器的值,书写时影响 CPSR,否则不影响 Rd 目标寄存器 Rn 第一个操作数的寄存器 operand2 第二个操作数 指令格式举例如下: LDR R0,[R1] ;读取 R1 地址上的存储器单元内容,执行条件 AL BEQ DATAEVEN ;跳转指令,执行条件 EQ,即相等跳转到 DATAEVEN ADDS R1,R1,#1 ;加法指令,R1+1=R1 影响 CPSR 寄存器,带有 S SUBNES R1,R1,#0xD;条件执行减法运算(NE),R1-0xD=>R1,影响 CPSR 寄存器,带有 S 第 2 个操作数 在 ARM 指令中,灵活的使用第 2 个操作数能提高代码效率,第 2 个操作数的形式如 下: #immed_8r 常数表达式,该常数必须对应 8 位位图,即常数是由一个 8 位的常数循环移位偶数 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII By 宛城布衣 QQ:57523799 email: mcu8031@163.com 第 7 页