资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,河南理工大学通信工程,1,5.2.5 ARM,汇编程序实例,例,1.,数据块复制,例,2.,数据简单运算,(,1,)计算,1+2+3+.+100,的结果。,程序清单:,AREA,sum,CODE,READONLY,MOV R0,#0 ;,初始化,R0=0,MOV R2,#1 ;,设置,R2=0;R2,控制循环次数,FOR CMP R2,#100 ;,判断,R2100?,BHS FOR_E ;,若条件失败,退出循环,ADD R0,R0,R2 ;,循环体,R0=R0+R2,ADD R2,R2,#1 ;R2=R2+1,B FOR,FOR_E,LDR R1,#0X40000000;,STR R2,R1 ;,保存结果到数组第,9,项,END,程序清单:,AREA,Buf,DATA,READWRITE,;,定义数据段,Buf,Array DCD 0 x11,0 x22,0 x33,0 x44 ;,定义,12,个字的数组,Array,DCD 0 x55,0 x66,0 x77,0 x88,DCD 0 x00,0 x00,0 x00,0 x00,AREA,Example,CODE,READONLY,ENTRY,CODE32,LDR R0,=Array ;,取得数组,Array,首地址,LDR R2,R0 ;,装载数组第,1,项字数据给,R2,MOV R1,#4,LDR R3,R0,R1,LSL#2 ;,装载数组第,5,项字数据给,R3,ADD R2,R2,R3 ;R2+R3R2,MOV R1,#8 ;R1=8,STRR2,R0,R1,LSL#2 ;,保存结果到数组第,9,项,END,*,河南理工大学通信工程,4,数据块复制,例,1,:程序将数据从源数据区,src,复制到目标数据区,dst,复制时,以,8,个字为单位进行。对于最后所剩不足,8,个字的数据,以字为单位进行复制,这时程序跳转到,copywords,处执行。在进行以,8,个字为单位的数据复制时,保存了所用的,8,个工作寄存器。,在,ADS,编译环境下,程序如下:,*,河南理工大学通信工程,5,数据块复制汇编程序实例,AREAB1ock,CODE,READONLY;,设置本段程序的名称及属性,NUMEQU 20 ;,设置将要复制的字数,ENTRY ;,标识程序人口点,LDR R0,=,src,;R0,寄存器指向源数据区,src,LDR R1,=,dst,;,Rl,寄存器指向目标数据区,dst,MOV R2,#NUM ;R2,指定将要复制的宇数,MOV SP,#,设置数据栈指针,用于保存工作寄存器数值,Bcopy,MOVS R3,R2,LSR#3;,需要进行的以,8,个字为单位的复制次数,BEQ,Cword,;,不足,8,个字的数据,跳转到,Cword,以字为单位复制,STMFD SP!,R4-R11 ;,保存工作寄存器,Ocopy,LDMIA R0!,R4-R11 ;,从源数据区读取,8,个字的数据,放到,8,个寄,;,存器中,并更新目标数据区指针,R0,STMIA R1!,R4-R11;,将这,8,个字数据写入到目标数据区中并更新,;,目标数据区指针,R1,SUBS R3,R3,#1 ;,将块复制次数减,l,BNE,Ocopy,;,循环,直到完成以,8,个字为单位的块复制,LDMFD SP!,R4-R11 ;,恢复工作寄存器值,*,河南理工大学通信工程,6,数据块复制汇编程序实例,Cword,ANDS R2,R2,#7 ;,剩下不足,8,个字的数据的字数,BEQ Stop ;,数据复制完成,Wcopy,LDR R3,R0,#4 ;,读取剩下的数据放到,R3,并更新目标数据区指针,R0,STR R3,R1,#4 ;,将这,R3,中数据写入到目标数据区中,;,并更新目标数据区指针,R1,SUBS R2,R2,#1 ;,将字数减,l,BNE,Wcopy,;,循环,直到完成以字为单位的数据复制,Stop ;,程序结束处理,MOV R0,#0 x18 ;,本条与下条指令的作用是参数传递,LDR R1,=&20026,SWI 0 x123456 ;,将,CPU,的控制权交给调试器,AREA,Bdata,DATA,READWRITE,;,定义数据区,Bdata,src,DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,dst,DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,;,这里的,DCD,定义源数据区,src,及目标数据区,dst,END ;,结束汇编,*,河南理工大学通信工程,7,数据简单运算,例,2,:编写程序循环对,R4-R11,进行累加,8,次起始值,R4-R11,起始值分别为,1,8,每次累加操作后把,R4-R11,的内容放入,SP,堆栈中,SP,初始设置为,0 x40000000,。最后把,R4-R11,用,LDMFD,指令清空赋值为,0,。,*,河南理工大学通信工程,8,数据简单运算汇编程序实例,AREAB1ock,CODE,READONLY;,设置本段程序的名称及属性,ENTRY ;,标识程序人口点,Start,ldr,r0,=,src,ldr,r1,=reset,mov,sp,#0 x40000000,ldmia,r0!,r4-r11,mov,r2,#7,DoAdd,addr4,r4,#1,addr5,r5,#2,addr6,r6,#3,addr7,r7,#4,addr8,r8,#5,addr9,r9,#6,addr10,r10,#7,addr11,r11,#8,stmia,sp!,r4-r11,subr2,r2,#1,cmp,r2,#0,bne,DoAdd,ldmfd,r1!,r4-r11,stop,bstop,AREA,Bdata,DATA,READWRITE,;,定义数据区,Bdata,src,DCD1,2,3,4,5,6,7,8,resetDCD0,0,0,0,0,0,0,0,end,
展开阅读全文