Chinaunix首页 | 论坛 | 博客
  • 博客访问: 836929
  • 博文数量: 489
  • 博客积分: 475
  • 博客等级: 下士
  • 技术积分: 3087
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 16:28
文章分类

全部博文(489)

文章存档

2013年(7)

2012年(301)

2011年(181)

分类:

2011-12-22 21:44:27

原文地址:ARM汇编编程实例 作者:luozhiyong131

;

;      ARM汇编编程-实现双层for循环

;

 

       AREA     Block,     CODE                  ; 声明代码段

       ENTRY

 

       ;      for(i = 0; i < 10; i++)

       ;             for(j = i+1; j<=10; j++)

       ;                    z +=1

      

START

       MOV R1, #0         ; i = 0

       MOV R0, #0         ; Z

      

LOOP

       CMP R1, #10               ; i < 10

       BEQ STOP

      

       ADD R2, R1, #1           ; j = i+1

LOOP1  

       CMP R2, #10+1                  ; j<=10

       ADDNE R0, R0, #1      ; z +=1

       ADDNE R2, R2, #1      ; j++

       BNE LOOP1

       ADD R1, R1, #1           ;  i++

       B LOOP

      

STOP

       MOV R0, #0x18

       LDR R1, =0x20026

       SWI 0x123456      

       END

      

      

 

;

;      数据块拷贝,利用LDR/STR指令

;

 

num EQU      10

 

       AREA     BlockData,      DATA            ; 声明数据段

src   DCD      0,1,2,3,4,5,6,7,8,9                  ; 定义十个数

dst   SPACE    10*4

 

       AREA     Block,     CODE                  ; 声明代码段

       ENTRY

 

START

       LDR       R1, =src                      

       LDR R2, =dst

       MOV R3, #num

      

LOOP

       LDR R0, [R1], #4

       STR R0, [R2], #4

       SUBS R3, R3, #1

       BNE LOOP

      

STOP

       MOV R0, #0x18

       LDR R1, =0x20026

       SWI 0x123456      

       END

 

 

 

;例五:利用跳转表实现程序跳转

;项目名:Example5.mcp,文件名:Example5.s

———————————————————————————————————————

              AREA     Jump,      CODE,   READONLY

num EQU       2

              ENTRY 

             

start

              MOV      R0,  #0

              MOV      R1,  #3

              MOV      R2, #2

              BL          arithfunc

              B            .

             

arithfunc

              CMP       R0,  #num

              MOVHS  PC,  LR

              ADR       R3,  JumpTable

              LDR       PC,  [R3,R0,LSL #2]

 

JumpTable

              DCD      DoAdd

              DCD      DoSub

 

DoAdd

              ADD      R0,  R1,  R2

              MOV      PC,  LR

             

DoSub

              SUB R0,  R1,  R2

              MOV      PC,  LR

             

              END

 

3  存储器从0x400000开始的100个单元中存放着ASCII码,编写程序,将其所有的小写字母转换成大写字母,对其它的ASCII码不做变换。

       解:

              MOV             R0#0x400000

              MOV             R1#0

LP

              LDRB            R2[R0,R1]

              CMP              R2#0x61

              BLO              NEXT

              CMP              R2#0x7B    ;0x61---0x7A为小写字母的ASC

              SUBLO   R2 R2#0x20

              STRBLO R2[R0,R1]

NEXT

              ADD             R1 R1#1

              CMP              R1#100

              BNE              LP

8  编写一简单ARM汇编程序段,实现1+2++100的运算。

       解:

              MOV             R2#100

              MOV             R1#0

LOOP

              ADD             R1R1R2  R1中为累加和

              SUBS             R2R2#1  R2控制循环

              BNE              LOOP

4  编写程序,比较存储器中0x4000000x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1

       解:

              MOV             R0#0x400000

              LDR              R1[R0]        ;取第1个数

              LDR              R2[R0#4]      ;取第2个数

              CMP              R1R2          ;两个数相比较

              MOVHI  R1#1          R1

              MOVLO R1# -1        R1

              MOVEQ R1#0          ;两个数相等

              STR        R1[R0#8]

7  编写一程序,存储器中从0x400200开始有一个64位数。(1)将取反,再存回原处;(2)求其补码,存放到0x400208处 。

       解:

              LDR              R0=0x400200

              LDR              R2=0xFFFFFFFF

              LDR              R1[R0]        ;取低32位数

             EOR              R1R1R2         ;取反

              STR        R1[R0]        ;存低32位反码

             ADDS            R1R1#1         ;又加1为求补

              STR        R1[R0#8]      ;存低32位补码

              LDR              R1[R0#4]      ;取高32位数

             EOR              R1R1R2         ;取反

              STR        R1[R0#4]      ;存高32位反码

             ADC              R1R1#0         ;高32位求补

              STR        R1[R0#12]     ;存高32位补码

 

Example7Example7.OC

例七:汇编语言与C/C++的混和编程

项目名:Example7.mcp

文件名:Example7_asm.s

文件名:Example7_c.c

———————————————————————————————————————

Example7_asm.s

AREA     Asm_C,   CODE,   READONLY

              ENTRY

             

              LDR              SP,=0x4000

              IMPORT __main

              BL          __main

              B            .

              END

 

———————————————————————————————————————

#include

int main()

{

       printf("Hello world\n");

       return 0;

}

 

系统的初始化过程

u     初始化代码直接对ARM微处理器内核及硬件控制器编程,多采用汇编语言编程,初始化代码一般应包含如下典型任务:

 

l       定义程序入口点

l       设置异常向量;

l       初始化存储器系统;

l       初始化堆栈指针寄存器;

l       初始化临界I/O设备;

l       初始化C代码的运行环境;

l       改变处理器的运行模式和状态;

l       使能中断;

l       进入C代码运行

阅读(953) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~