熟悉各种指令用途。。
View Code
AREA abc123, code, readonly ;告诉连接器 abc123 是程序的名字 entry code32aaaaa mov r1, #5 mov r2, #2 add r0, r1, r2 bic r1, r1, r0 ldr r3, =0x9000 str r1, [r3] ldr r2, [r3], #4 stmfd r13!, {r0-r2} ldmfd r13!, {r5,r6,r7} mov r4, pc bl cccc bl bbbb b . ; 原地跳转 bbbb mov r0, #0x1 mov r1, #0xFFFFFFFC adds r2, r0, r1 mov pc, lrcccc mov r0, #0x1 orr r0, r0, #0x7 mov pc, lr end
获取内存中 若干个数中 的最大者
View Code
area getmax, code, readonly ; 获取数组中最大的数放在r2中 entry code32 AAA ldr r1, =0x8000 ; r1 位数组地址 0x8000[] = {3,2,1,9,8, 7} mov r2, #0 ; r2 位下标索引,初始值为0 mov r3, #3 ; r3 用于产生立即数 0x8000[0] = 3 str r3, [r1,r2] ; add r2, r2, #4 ; mov r3, #2 ; 0x8000[1] = 2 str r3, [r1,r2] ; add r2, r2, #4 ; mov r3, #1 ; 0x8000[2] = 1 str r3, [r1,r2] add r2, r2, #4 mov r3, #9 ; 0x8000[3] = 9 str r3, [r1,r2] add r2, r2, #4 mov r3, #8 ; 0x8000[4] = 8 str r3, [r1,r2] add r2, r2, #4 mov r3, #7 ; 0x8000[5] = 7 str r3, [r1,r2] add r2, r2, #4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov r2, #0 ; 下标索引r2=0 ldr r3, [r1,r2] ; 把max ~ r3, 把r4作为存放数组元素的临时变量 add r2,r2,#4 mov r5, #6 ; 循环计数器r5loop sub r5,r5,#1 ; 每进入一次循环 循环计数器-1 ldr r4,[r1,r2] ; tmp ~ r4 = r1[r2++] add r2, r2, #4 ; r2++ cmp r3, r4 ; if r3 < r4 movlt r3,r4 ; r3 = r4 cmp r5, #0 ; 判断是否循环次数已到 beq endloop b loopendloop mov r2, r3 end
把数组中生产立即数的部分 用 dcd 伪指令 去做:
1 area mysort, code, readonly 2 entry 3 code32 4 5 mov r13, #0x10000 6 ldr r0, =src 7 mov r1, #len/4 8 bl get_max ; 调用get_max;并保存返回地址到lr中 9 b . ; 原地跳转 调试用10 11 12 13 get_max ; r0:数组地址,r1:元素个数; r2:返回的最大元素值14 stmfd r13!, {r0,r1,r3,r4} ; 把r0,r1, r2,r3,r4 压栈15 16 mov r1, #0 ; 下标索引r1=017 ldr r2, [r0,r1] ; 把max ~ r2,18 add r1,r1,#419 mov r4, #len/4 ; 循环计数器r420 loop 21 sub r4,r4,#1 ; 每进入一次循环 循环计数器-122 cmp r4, #0 ; 判断是否循环次数已到23 beq end_loop24 25 ldr r3,[r0,r1] ; tmp ~ r3 = r0[r1++]26 add r1, r1, #4 ; r1++27 cmp r2, r3 ; if r2 < r328 movlt r2,r3 ; r2 = r329 b loop30 end_loop31 ldmfd r13!, {r0,r1,r3,r4} ; 还原r0, r1,r3,r4 的值;32 mov pc, lr ; r15 = r14(pc ~ r15, lr~r14)33 34 area array, data, readwrite35 src dcd 3,2,1,9,8,7 ; src[] = {3,2,1,9,8,7}36 len equ 6*4 ; src长度 = 6*437 38 end