博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
arm 汇编小练习
阅读量:5367 次
发布时间:2019-06-15

本文共 2727 字,大约阅读时间需要 9 分钟。

熟悉各种指令用途。。

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

 

 

转载于:https://www.cnblogs.com/mathzzz/archive/2012/07/18/2597020.html

你可能感兴趣的文章
BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
查看>>
WCF(一) 简单的认知
查看>>
[MFC][DShow]简单例子
查看>>
js onclick事件传参
查看>>
WiCloud 商业Wi-Fi管理平台
查看>>
团队项目--未完待续
查看>>
python中的网页标签等字符处理
查看>>
Linux常用命令(十二)
查看>>
Linux常用命令(十五)
查看>>
Linux常用命令(十四)
查看>>
Linux常用命令(十七)
查看>>
Linux常用命令(十六)
查看>>
day 3 修改haproxy.cfg 作业
查看>>
sim usim Uim 区别
查看>>
网页中插入透明Flash的方法和技巧
查看>>
动态内存申请函数选择(realloc、malloc 、alloca、 calloc)
查看>>
获取元素属性get_attribute
查看>>
Python/jquery
查看>>
【BZOJ】【2132】圈地计划
查看>>
Java有没有goto?
查看>>