2012年(1008)
分类:
2012-08-01 11:13:03
原文地址: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 R1,R1,R2 ;R1中为累加和
SUBS R2,R2,#1 ;R2控制循环
BNE LOOP
4、 编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。
解:
MOV R0,#0x400000
LDR R1,[R0] ;取第1个数
LDR R2,[R0,#4] ;取第2个数
CMP R1,R2 ;两个数相比较
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 R1,R1,R2 ;取反
STR R1,[R0] ;存低32位反码
ADDS R1,R1,#1 ;又加1为求补
STR R1,[R0,#8] ;存低32位补码
LDR R1,[R0,#4] ;取高32位数
EOR R1,R1,R2 ;取反
STR R1,[R0,#4] ;存高32位反码
ADC R1,R1,#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代码运行