arm汇编编程(示例)
8位中,Rd的高24位设置为0;
然后将寄存器op1的低8位数据存储到同一内存地址中。
例:SWPBR0,R1,[R2];将R2所表示的内存单元中的一个字节数据装载到R0的低8位,然后将R1中的低8位字节
数据保存到R2所表示的内存单元中
//^^^^^^^^^^^^^^^^^^^^^^^^^^下午^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(五)、协处理指令
1)CDP协处理器操作指令
格式:CDP{ , 功能:用于传递指令给协处理器p,要求其在寄存器CRn和CRm上,进行操作opcode1,并把结果存放到CRd中, 可以使用opcode2提供与操作有关的补充信息。指令中的所有寄存器均为协处理器的寄存器,操作由协处理器完成。 指令中: P为协处理器编号; CRd为目的寄存器的协处理器寄存器; CRm和CRn为存放操作数的协处理器寄存器; Opcode1和opcode2为协处理器即将执行的操作。 例:CDPp5,5,c0,c1,c2,9;该指令用于通知协处理器p5,在c1和c2上执行操作5和9,并将结果存放到c0中。 2)LDC协处理器数据读取指令 格式:LDC{ , 功能:将addr表示的内存地址中的连续数据传送到目的寄存器CRd中。 L表示指令为长读取操作,比如用于双精度数据的传输; 目的寄存器CRd为协处理器的寄存器; addr的寻址方式同LDR指令,其寄存器为ARM处理器的寄存器。 例:LDCp5,c1,[R1+5]:该指令用于将R1+5所对应的存储单元中的数据,传送到协处理器p5的寄存器c1中。 3)STC协处理器数据存储指令 格式:STC{ , 功能:将寄存器CRd的值传送到addr表示的内存地址中。指令中各参数用法同LDC。 例如:STCp5,c1,[R1+5];该指令用于将协处理器p5中寄存器c1的数据传送到R1+5所对应的存储单元中。 4)MCRARM寄存器到协处理器寄存器的数据传送指令 格式:MCR{ , 功能:将ARM处理器的寄存器Rd中的数据传送到协处理器p的寄存器CRn,CRm中;op1,op2为协处理器将要执行的操作。 例:MCRp5,5,R1,C1,C2,9;该指令将R1中的数据传送到协处理器p5的寄存器C1,C2中,协处理器执行操作5和9。 MRC协处理器寄存器到ARM寄存器的数据传送指令 格式:MRC{ , 功能:将协处理器p的寄存器CRn,CRm的数据传送到ARM处理器的寄存器Rd中;op1,op2为协处理器将要执行的操作。 例:MRCp5,5,R1,C1,C2,9;该指令将寄存器C1,C2中的数据传送到R1中,协处理器p5协处理器执行操作5和9。 (六)、异常中断指令 异常中断产生指令:用于系统调用和调试。 1)SWI软件中断指令 格式:SWI{ 功能:用于产生软件中断,以使用户程序调用操作系统的系统例程。 指令中24位的立即数指定用户程序调用系统例程的类型,其参数通过通用寄存器传递。当24位的立即数 被忽略时,系统例程类型由寄存器R0指定,其参数通过其他通用寄存器传递。 例:SWI0X05;调用编号为05的系统例程。 2)BKPT断点中断指令 格式:BKPT16位的立即数; 功能:用于产生软件断点中断,以便软件调试时使用。16位的立即数用于保存软件调试中额外的断点信息。 指令操作的伪代码: (七)、信号量操作指令 信号量操作指令:用于进程间的同步互斥,提供对信号量的原子操作。 (八)、ARM程序常见结构 1.子函数和主函数 使用BL指令进行调用,该指令会把返回的PC值保存在LR AREAExample,CODE,READONLY;声明代码段Example ENTRY;程序入口 Start MOVR0,#0;设置实参,将传递给子程骗子的实参存放在r0和r1内 MOVR1,#10 BLADD_SUM;调用子程序ADD_SUM BOVER;跳转到OVER标号处,进入结尾 ADD_SUM ADDR0,R0,R1;实现两数相加 MOVPC,LR;子程序返回,R0内为返回的结果 OVER END 运行过程 (1)程序从ENTRY后面指令处开始运行(即主函数) R0和R1先准备好数据令子函数运算时使用 (2)BL为跳转指令,用于调用子函数后面为函数标号。 在调用函数的过程中,自动将PC内的值保存到LR(R14)内备份,PC内当前的值为下一条要执行的指令地址 (即BOVER指令地址),在子函数结束前将该地址恢复到PC内 (3)B为跳转指令,用于跳转到指定的标号后,此处跳转到程序结尾 (4)MOVPC,LR是子函数内的最后一条语句,用于将LR内保存的地址恢复到PC内 PC(R15)程序计数器存储要执行的指令在内存中的地址 PC的值=当前正在执行指令在内存中的地址+8 2.条件跳转语句 AREAExample,CODE,READONLY;声明代码段Example ENTRY;程序入口 Start MOVR0,#2;将R0赋初值2 MOVR1,#5;将R1赋初值5 ADDR5,R0,R1;将R0和R1内的值相加并存入R5 CMPR5,#10 BEQDOEQUAL;若R5为10,则跳转到DOEQUAL标签处 WAIT CMPR0,R1 ADDHIR2,R0,#10;若R0>R1则R2=R0+10 ADDLSR2,R1,#5;若R1<=R2则R2=R1+5 DOEQUAL ANDSR1,R1,#0x80;R1=R1&0x80,并设置相应标志位 BNEWAIT;若R1的d7位为1则跳转到WAIT标签 OVER END 运行
arm汇编编 相关文章:
- ARM汇编编程基础之四-ARM汇编伪操作(11-27)
- ARM汇编编程基础之三-基本寻址方式与基本指令(11-27)
- ARM汇编编程基础之一-寄存器(11-27)
- ARM汇编编程基础之五-ADS开发环境的使用(11-27)
- ARM汇编编程基础之二-流水线对PC值的影响(11-27)
- ARM汇编编程基础之六-其它寻址模式与其它指令(11-27)