Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631731
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 11:13:25

原文地址:ARM汇编—编程练习 作者:luozhiyong131

 

;

;      64位数相加

;

 

              ; 定义数据段

              AREA Data, DATA

NUM1    DCD       0x12345678, 0x90ABCDEF

NUM2    DCD       0x45678912, 0x08765123    

NUM             DCD 0

;             ALIGN = 4

 

              ; 定义代码段

              AREA Code, CODE  

              ENTRY   

 

START

              ; 第一个64位数

             LDR R1, =NUM1

             LDR R2, [R1]                      ; 取第一个数低32

             LDR R3, [R1, #4]                ; 取第一个数高32

            

             ; 取第二个64位数

             LDR R4, =NUM2

             LDR R5, [R4]

             LDR R6, [R4, #4]

            

             ADDS R7, R2, R5                       ; 32位相加,修改进位标志

             ADC R8, R3, R6                         ; 32位相加,加进位标志

            

           LDR R0, =NUM

           STR R7, [R0]                      ; 保存低32

           STR R8, [R0, #4]                 ; 保存高32

 

STOP

              MOV R0, #0X18  

              LDR R1, =0X20026  

              SWI 0X123456 

               

           END

 

 

;

;      字符串拷贝

;

 

              ; 定义数据段

              AREA Data, DATA

str1  DCB       "AJKOIQOJLIQLFNDFL", 0        ; 定义原字符串

str2  SPACE 256                                        ; SPACE 分配256个字节空间

;             ALIGN = 4    

 

              ; 定义代码段

              AREA Code, CODE  

              ENTRY    

 

START

              ; 取地址

              LDR R1, =str1                                  

              LDR R2, =str2

             

LOOP

              ; 字符复制

              LDRB R0, [R1], #1                    

              STRB R0, [R2], #1

             

              CMP R0, #0

              BNE LOOP    

 

STOP

              MOV R0, #0X18  

              LDR R1, =0X20026  

              SWI 0X123456 

               

           END

 

 

;

;      多寄存器加载与存储指令练习

;

 

DATA_NUL EQU 105

 

              ; 定义数据段

              AREA Data, DATA

buf1 SPACE DATA_NUL

              ALIGN    4                          ; 地址对齐

buf2 SPACE DATA_NUL

 

 

              ; 定义代码段

              AREA Code, CODE  

              ENTRY   

 

START

              ; 初始化

              MOV R0, #5                        ; 初始化填充值

              LDR R1, =buf1                   

              MOV R2, #DATA_NUL         ; 计数缓冲区大小

LOOP1

              STRB R0, [R1], #1              ; 初始化缓冲区

              SUBS R2, R2, #1                 ; 计数减一

              BNE LOOP1

             

              LDR R0, =buf1                    ; 加载第一个缓冲区地址

              LDR R1, =buf2                    ; 加载第二个缓冲区地址

              MOV R3, #DATA_NUL/4/8   ; 计数缓冲区有多少个32个字节

             

LOOP2         

              LDMIA R0!, {R4-R11}         ; 多寄存器加载

              STMIA R1!, {R4-R11}         ; 多寄存器存储

              SUBS R3, R3, #1                 ; 计数减一

              BNE LOOP2

             

              MOV R3, #DATA_NUL-DATA_NUL/4/8*32+1           ; 计数剩下的字节数          

LOOP3

              ; 按字节复制

              LDRB R4, [R0], #1             

              STRB R4, [R1], #1

              SUBS R3, R3, #1

              BNE LOOP3

             

 

STOP

              MOV R0, #0X18  

              LDR R1, =0X20026  

              SWI 0X123456 

               

           END

 

 

;

;      堆栈操作

;

 

DATA_NUL EQU 1024

 

              ; 定义数据段

              AREA Data, DATA

stack       SPACE DATA_NUL

 

              ; 定义代码段

              AREA Code, CODE  

              ENTRY   

 

START

              MOV R0, #7

              MOV R1, #1

              MOV R2, #2

              MOV R3, #3

              MOV R4, #4

              MOV R5, #5

              MOV R6, #6

 

              LDR SP, =stack

             

              STMEA SP!, {R0-R6}

              LDMEA SP!, {R0-R2}

              LDMEA SP!, {R5}

              LDMEA SP!, {R3,R4,R6}

 

STOP

              MOV R0, #0X18  

              LDR R1, =0X20026  

              SWI 0X123456 

               

           END

 

 

;

;      ARM汇编编程

;      快速排序把数组分成两部分,一侧保存奇数,另一侧保存偶数

;

 

DATA_NUL EQU 100

 

              ; 定义数据段

              AREA Data, DATA

data SPACE DATA_NUL

 

              ; 定义代码段

              AREA Code, CODE  

              ENTRY   

 

START

              MOV R1, #DATA_NUL

              LDR R0, =data

 

LOOP    

              ; 初始化

              STR R1, [R0], #4

              SUBS R1, R1, #1

              BNE LOOP

             

              LDR R1, =data                     ; 数据首地址

              MOV R2, #0                        ; 左指针,数组首元素下标

              MOV R3, #(DATA_NUL-1)*4       ; 右指针,数组最后一个元素下标

             

              ; 快速排序方法把数组分成两部分,左边保奇数,别一边保存偶数

LOOP1         

              CMP R2, R3                        ; 判断左右指针是否相等,相等则退出

              BEQ STOP

             

              ; 从左扫描直到找到不是奇数

              LDR R0, [R1, R2]         ; 从左扫描   

              TST R0, #1          

              ADDNE R2, R2, #4              ; 左指针加四

              MOVEQ R5, R0                   ; 保存找到的偶数

              BNE LOOP1

             

LOOP2         

              CMP R2, R3                        ; 判断左右指针是否相等,相等则退出

              BEQ STOP

             

              ; 从右边找奇数元素

              LDR R0, [R1, R3]         ; 从右扫描   

              TST R0, #1

              SUBEQ R3, R3, #4        ; 右指针减四

              MOVNE R6, R0                   ; 保存找到的奇数

              BEQ LOOP2

             

              ; 数据交换

              STR R5, [R1, R3]         ; 偶数保存到右边

              STR R6, [R1, R2]         ; 奇数保存到左边

             

              CMP R2, R3

              BNE LOOP1  

 

STOP

              MOV R0, #0X18  

              LDR R1, =0X20026  

              SWI 0X123456 

               

           END

 

 

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