• 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
  • 相关阅读:
    已知用经纬度表示的两点,求两点之间的直线距离
    linux 管道--转
    Five ways to maximize Java NIO and NIO.2--reference
    java获取当前方法
    事务策略: 了解事务陷阱--转
    实例详解 EJB 中的六大事务传播属性--转
    全面分析 Spring 的编程式事务管理及声明式事务管理--转
    Spring 事务管理高级应用难点剖析--转
    Java NIO——Selector机制源码分析---转
    Java NIO类库Selector机制解析--转
  • 原文地址:https://www.cnblogs.com/mathzzz/p/2597020.html
Copyright © 2020-2023  润新知