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