加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

ARM汇编语言写的选择排序程序

(2008-10-13 19:09:18)
标签:

arm

汇编

it

分类: ARM汇编语言
    好久没有写点什么了,因为心情总比较烦躁不安,没有安静的时刻来好好看会儿书。几个月前有次在书城无聊,看到一本ARM程序设计的书,拿起来看得比较有意思,因为好像是第一次看到这种比较浅显易懂的讲ARM的书,于是就买下来了。几个月的时间里,断断续续地看了一百页多一点,照着书上的示例写了些代码,总算对嵌入式开发中常用到的ARM处理器结构有了点了解。ARM是不同于在学校时学习微机原理时的Intel x86的一种精简指令集结构的处理器,然而,寄存器、栈、中断、返回地址等基本概念还是相同的。前段时间自己写了个做选择排序的ARM汇编程序,算是对这段时间学习的一个小结吧。
   
    程序使用ADS进行汇编链接的命令为:
        armasm -g  chap03_7_567.s -o chap03_7_567.o
        armlink -o chap03_7_567.axf chap03_7_567.o

     PRESERVE8
    AREA param,CODE,READONLY
    EXPORT main
    IMPORT __main
    IMPORT printf
    IMPORT ||Lib$$Request$$armlib||,WEAK
main
    ;# int data[]={10,9,8,7,6,5,4,3};
    ;# int x,y,len,t,temp;
    ;# len = sizeof(data)  / sizeof(data[0]);
    ;# for(x = 0; x < len - 1; x++)
    ;# {
    ;#  t = x;
    ;#  for(y = x + 1; y < len; y++)
    ;#  {
    ;#      if (data[y] < data[t])
    ;#          t = y;
    ;#  }
    ;#  if (t != x)
    ;#  {
    ;#      temp = data[x];
    ;#      data[x] = data[t];
    ;#      data[t] = temp;
    ;#  }
    ;#  else break;
    ;# }
    ;#
    ;** r0 = len   r1 = len - 1
    ;** r2 = data
    ;** r3 = x r4 = y r5 = t
    ;** r6,r7

    STMFD sp!,{r4,lr}
   
    LDR r0,len
    SUB r1,r0,#1
    LDR r2,=data
   
    MOV r3,#0
loop_out
    MOV r5,r3
   
    ADD r4,r3,#1
loop_in
    LDR r6,[r2,r4,LSL #2]
    LDR r7,[r2,r5,LSL #2]
    CMP r6,r7
    BGE next_y
    MOV r5,r4
next_y
    ADD r4,r4,#1
    CMP r4,r0
    BNE loop_in

    CMP  r3,r5
    BEQ  sort_ok
   
    LDR  r6,[r2,r3,LSL #2]
    LDR  r7,[r2,r5,LSL #2]
    STR  r6,[r2,r5,LSL #2]
    STR  r7,[r2,r3,LSL #2]

    ADD r3,r3,#1
    CMP r3,r0
    BNE loop_out

sort_ok
   
    ADR r0,format
    LDR r2,=data
    LDR r4,len
   
    MOV r3,#0
print_next
    STMDA sp!,{r0-r4}
    LDR r1,[r2,r3,LSL #2]
    BL  printf
    LDMIB sp!,{r0-r4}

    ADD r3,r3,#1
    CMP r3,r4
    BNE print_next

    ADR r0,line_end
    BL  printf 
   
    LDMFD sp!,{r4,pc}

data
    DCD 10,9,8,7,6,5,4,3,2,1
data_end
    DCD 0
len
    DCD 10
format
    DCB "%d,\0"
line_end
    DCB "\n\0"

    END

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有