1、04:00,河南理工大学通信工程,1,5.2.5 ARM汇编程序实例,例1.数据块复制 例2.数据简单运算,(1)计算1+2+3+.+100的结果。 程序清单:AREA sum,CODE,READONLYMOV R0, #0 ;初始化R0=0MOV R2, #1 ;设置R2=0;R2控制循环次数FOR CMP R2, #100 ;判断R2100?BHS FOR_E ;若条件失败,退出循环ADD R0,R0,R2 ;循环体,R0=R0 + R2ADD R2,R2,#1 ;R2=R2 + 1B FOR FOR_E LDR R1, #0X40000000;STR R2, R1 ;保存结果到数组第9项
2、END,程序清单:AREA Buf,DATA,READWRITE ;定义数据段Buf Array DCD 0x11,0x22,0x33,0x44 ;定义12个字的数组ArrayDCD 0x55,0x66,0x77,0x88DCD 0x00,0x00,0x00,0x00AREA Example,CODE,READONLYENTRYCODE32LDR R0,=Array ;取得数组Array首地址LDR R2,R0 ;装载数组第1项字数据给R2MOV R1,#4LDR R3,R0,R1,LSL #2 ;装载数组第5项字数据给R3ADD R2,R2,R3 ;R2 + R3R2MOV R1,#8 ;R
3、1=8STR R2,R0,R1,LSL #2 ;保存结果到数组第9项END,04:00,河南理工大学通信工程,4,数据块复制,例1:程序将数据从源数据区src复制到目标数据区dst复制时,以8个字为单位进行。对于最后所剩不足8个字的数据,以字为单位进行复制,这时程序跳转到copywords处执行。在进行以8个字为单位的数据复制时,保存了所用的8个工作寄存器。在ADS编译环境下,程序如下:,04:00,河南理工大学通信工程,5,数据块复制汇编程序实例,AREA B1ock,CODE,READONLY ;设置本段程序的名称及属性 NUM EQU 20 ;设置将要复制的字数ENTRY ;标识程序人口
4、点LDR R0,=src ;R0寄存器指向源数据区srcLDR R1,=dst ;Rl寄存器指向目标数据区dstMOV R2,#NUM ;R2指定将要复制的宇数MOV SP,#恢复工作寄存器值,04:00,河南理工大学通信工程,6,数据块复制汇编程序实例,Cword ANDS R2,R2,#7 ;剩下不足8个字的数据的字数BEQ Stop ;数据复制完成 Wcopy LDR R3,R0,#4 ;读取剩下的数据放到R3 ,并更新目标数据区指针R0STR R3,R1,#4 ;将这R3中数据写入到目标数据区中;并更新目标数据区指针R1SUBS R2,R2,#1 ;将字数减lBNE Wcopy ;循环
5、,直到完成以字为单位的数据复制 Stop ;程序结束处理MOV R0,#0x18 ;本条与下条指令的作用是参数传递LDR R1,=结束汇编,04:00,河南理工大学通信工程,7,数据简单运算,例2:编写程序循环对R4-R11进行累加8次起始值,R4-R11起始值分别为18,每次累加操作后把R4-R11的内容放入SP堆栈中,SP初始设置为0x40000000。最后把R4-R11用LDMFD指令清空赋值为0。,04:00,河南理工大学通信工程,8,数据简单运算汇编程序实例,AREA B1ock,CODE,READONLY ;设置本段程序的名称及属性ENTRY ;标识程序人口点 Start ldr
6、r0,=srcldr r1,=resetmov sp,#0x40000000ldmia r0!,r4-r11mov r2,#7 DoAdd add r4,r4,#1add r5,r5,#2 add r6,r6,#3add r7,r7,#4add r8,r8,#5add r9,r9,#6add r10,r10,#7add r11,r11,#8 stmia sp!,r4-r11sub r2,r2,#1cmp r2,#0bne DoAddldmfd r1!,r4-r11 stop b stopAREA Bdata,DATA,READWRITE ;定义数据区Bdata src DCD 1,2,3,4,5,6,7,8 reset DCD 0,0,0,0,0,0,0,0end,