5.2.5 ARM汇编程序实例
例1.数据块复制 1.数据块复制 例2.数据简单运算 2.数据简单运算
17:57
河南理工大学通信工程
(1)计算1+2+3+...+100的结果。 程序清单: AREA sum,CODE,READONLY MOV R0, #0 ;初始化R0=0 MOV R2, #1 ;设置R2=0;R2控制循环次数 FOR CMP R2, #100 ;判断R2<100? 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 0x11,0x22,0x33,0x44 ;定义12个字的数组Array DCD 0x55,0x66,0x77,0x88 DCD 0x00,0x00,0x00,0x00 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 + R3→R2 MOV R1,#8 ;R1=8 STR R2,[R0,R1,LSL #2] ;保存结果到数组第9项 END
数据块复制
例1:程序将数据从源数据区src复制到目标数据区dst复 程序将数据从源数据区src复制到目标数据区dst复 src复制到目标数据区dst 制时, 制时,以8个字为单位进行。对于最后所剩不足8个字的数据, 个字为单位进行。对于最后所剩不足8个字的数据, 以字为单位进行复制,这时程序跳转到copywords处执行。 以字为单位进行复制,这时程序跳转到copywords处执行。 copywords处执行 在进行以8个字为单位的数据复制时,保存了所用的8 在进行以8个字为单位的数据复制时,保存了所用的8个工作 寄存器。 寄存器。 在ADS编译环境下,程序如下: ADS编译环境下,程序如下: 编译环境下
17:57
河南理工大学通信工程
数据块复制汇编程序实例AREA NUM EQU ENTRY LDR LDR MOV MOV Bcopy MOVS BEQ STMFD Ocopy LDMIA B1ock,CODE,READONLY ;设置本段程序的名称及属性 20 ;设置将要复制的字数 ;标识程序人口点 寄存器指向源数据区src R0,=src ;R0寄存器指向源数据区src R1,=dst ;Rl寄存器指向目标数据区dst Rl寄存器指向目标数据区dst 寄存器指向目标数据区 R2,#NUM ;R2指定将要复制的宇数 SP,#&400 设置数据栈指针, SP,#&400 ;设置数据栈指针,用于保存工作寄存器数值 ,R2 需要进行的以8 R3,R2,LSR #3 ;需要进行的以8个字为单位的复制次数 Cword ;不足8个字的数据,跳转到Cword以字为单位复制 不足8个字的数据,跳转到Cword以字为单位复制 Cword SP!,{R4 11} SP!,{R4-R11} ;保存工作寄存器 !,{R4 11} 从源数据区读取8个字的数据,放到8 R0!,{R4-R11} ;从源数据区读取8个字的数据,放到8个寄 存器中,并更新目标数据区指针R ;存器中,并更新目标数据区指针R0 !,{R4 11} 将这8 STMIA R1!,{R4-R11} ;将这8个字数据写入到目标数据区中并
更新 目标数据区指针R ;目标数据区指针R1 ,R3,#1 将块复制次数减l SUBS R3,R3,#1 ;将块复制次数减l 循环,直到完成以8 BNE Ocopy ;循环,直到完成以8个字为单位的块复制 LDMFD SP!,{R4-R11} ;恢复工作寄存器值 SP!,{R4 11}河南理工大学通信工程 5
17:57
数据块复制汇编程序实例R2,R2,#7 ,R2,#7 ;剩下不足8个字的数据的字数 剩下不足8 Stop ;数据复制完成 ,[R0],#4 读取剩下的数据放到R 并更新目标数据区指针R R3,[R0],#4 ;读取剩下的数据放到R3 ,并更新目标数据区指针R0 ,[R1],#4 将这R R3,[R1],#4 ;将这R3中数据写入到目标数据区中 并更新目标数据区指针R ;并更新目标数据区指针R1 ,R2,#1 将字数减l SUBS R2,R2,#1 ;将字数减l BNE Wcopy ;循环,直到完成以字为单位的数据复制 循环, Stop ;程序结束处理 ,#0 MOV R0,#0x18 ;本条与下条指令的作用是参数传递 ,=&20026 LDR R1,=&20026 CPU的控制权交给调试器 SWI 0x123456 ;将CPU的控制权交给调试器 定义数据区Bdata 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 DCD定义源数据区src及目标数据区 ;这里的DCD定义源数据区src及目标数据区dst END ;结束汇编17:57 河南理工大学通信工程 6
Cword ANDS BEQ Wcopy LDR STR
数据简单运算
例2:编写程序循环对R4-R11进行累加8次起始值,R4-R11 编写程序循环对R4-R11进行累加8次起始值,R4R4 进行累加 ,R4 起始值分别为1~8,每次累加操作后把R4-R11的内容放入 起始值分别为1 8,每次累加操作后把R4-R11的内容放入 每次累加操作后把R4 SP堆栈中,SP初始设置为0x40000000。最后把R4-R11用 SP堆栈中,SP初始设置为0x40000000。最后把R4-R11用 堆栈中,SP初始设置为0x40000000 R4 LDMFD指令清空赋值为0 LDMFD指令清空赋值为0。 指令清空赋值为
17:57
河南理工大学通信工程
AREA ENTRY Start ldr ldr mov ldmia mov DoAdd add add add add add add add add stmia sub cmp bne ldmfd stop b AREA src DCD reset DCD 17:57 end
数据简单运算汇编程序实例
B1ock,CODE,READONLY ;设置本段程序的名称及属性 ;标识程序人口点 r0,=src r1,=reset sp,#0x40000000 r0!,{r4-r11} r2,#7 r4,r4,#1 r5,r5,#2 r6,r6,#3 r7,r7,#4 r8,r8,#5 r9,r9,#6 r10,r10,#7 r11,r11,#8 sp!,{r4-r11} r2,r2,#1 r2,#0 DoAdd r1!,{r4-r11} stop 定义数据区Bdata Bdata,DATA,READWRITE ;定义数据区Bdata 1,2,3,4,5,6,7,8 0,0,0,0,0,0,0,0河南理工大学通信工程 8