arm 汇编小练习

熟悉各种指令用途。。

View Code
    AREA abc123, code, readonly    ;告诉连接器 abc123 是程序的名字
    entry 
    code32


aaaaa
    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, lr
cccc
    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        ; 循环计数器r5
loop    
    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 loop
endloop
    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=0
17     ldr r2, [r0,r1]    ; 把max ~ r2,
18     add r1,r1,#4
19     mov r4, #len/4        ; 循环计数器r4
20 loop    
21     sub r4,r4,#1    ; 每进入一次循环 循环计数器-1
22     cmp r4, #0        ; 判断是否循环次数已到
23     beq end_loop
24     
25     ldr r3,[r0,r1]    ; tmp ~ r3 = r0[r1++]
26     add r1, r1, #4     ; r1++
27     cmp r2, r3         ; if r2 < r3
28     movlt r2,r3        ; r2 = r3
29     b loop
30 end_loop
31     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, readwrite
35 src dcd 3,2,1,9,8,7    ; src[] = {3,2,1,9,8,7}
36 len equ 6*4            ; src长度 = 6*4
37 
38     end

 

 

posted @ 2012-07-18 10:52  庄庄庄  阅读(727)  评论(0编辑  收藏  举报