| |
/*----------------------------------------------------
*寄存器使用说明:
* R0:存放地址值
* R2:递减计数器
* R9:64位递加结果高32位
* R8:64位递加结果低32位
*----------------------------------------------------*/
.global
_start
.text
.arm
_start:
MOV R0,#0XB000 @初始化寄存器
MOV R1,#0X10000001
MOV R2,#100
loop_1: @第一次循环,给内存单元赋值
STR R1,[R0],#4
ADD R1,R1,#1
SUBS R2,R2,#1
BNE loop_1
MOV R0,#0XB000
MOV R2,#100
MOV R9,#0
MOV R8,#0
loop_2: @第二次循环累加
LDR R1,[R0],#4
ADDS R8,R1,R8 @R8=R8+R1,进位影响标志位
ADC R9,R9,#0 @R9=R9+C,C为进位
SUBS R2,R2,#1
BNE loop_2
Stop:
B Stop
.end @文件结束
2、初始化ARM处理器各模式下的堆栈指针SP(R13)
/*---------------------------------------------------- * 寄存器使用说明: * SP_usr:用户模式下的SP * SP_svc:管理模式下的SP * SP_und:未定义模式下的SP * SP_abt:中止模式下的SP * SP_irq:IRQ模式下的SP * SP_fiq:FIQ模式下的SP *----------------------------------------------------*/ .equ _ISR_STARTADDRESS, 0xC7FF000 @设置栈的内存基地址 .equ UserStack, _ISR_STARTADDRESS @用户模式堆栈地址0xc7ff000 .equ SVCStack, _ISR_STARTADDRESS+256 @管理模式堆栈地址0xc7ff100 .equ UndefStack, _ISR_STARTADDRESS+256*2 @未定义模式下的堆栈地址0xc7ff200 .equ AbortStack, _ISR_STARTADDRESS+256*3 @中止模式下的堆栈地址0xc7ff300 .equ IRQStack, _ISR_STARTADDRESS+256*4 @IRQ模式下的堆栈地址0xc7ff400 .equ FIQStack, _ISR_STARTADDRESS+256*2 @FIQ模式下的堆栈地址0xc7ff500 .equ USERMODE, 0x10 @用户模式 .equ FIQMODE, 0x11 @FIQ模式 .equ IRQMODE, 0x12 @IRQ模式 .equ SVCMODE, 0x13 @管理模式 .equ ABORTMODE, 0x17 @中止模式 .equ UNDEFMODE, 0x1b @未定义模式 .equ SYSMODE, 0x1F @系统模式 .equ MODEMASK, 0x1f @模式位掩码 .global _start .text .arm _start: MRS R0,CPSR @读取当前CPSR BIC R0,R0,#MODEMASK @清除模式位 #设置系统模式下的SP ORR R1,R0,#SYSMODE MSR CPSR_c,R1 LDR SP,=UserStack #设置未定义模式下的SP ORR R1,R0,#UNDEFMODE MSR CPSR_c,R1 LDR SP,=UndefStack #设置中止模式下的SP ORR R1,R0,#ABORTMODE MSR CPSR_c,R1 LDR SP,=AbortStack #设置管理模式下的SP ORR R1,R0,#SVCMODE MSR CPSR_c,R1 LDR SP,=SVCStack #设置IRQ模式下的SP ORR R1,R0,#IRQMODE MSR CPSR_c,R1 LDR SP,=IRQStack #设置FIQ模式下的SP ORR R1,R0,#FIQMODE MSR CPSR_c,R1 LDR SP,=FIQStack Stop: B Stop .end @文件结束 /*---------------------------------------------------- * 寄存器使用说明: * R0:源数据区指针 * R1:目标数据区指针 * R2:单字拷贝次数 * R3:块拷贝次数 * R5-R10:批量拷贝使用的寄存器组 * SP:栈指针 *----------------------------------------------------*/ #除法宏定义 .macro
DIV dividend,divisor MOV R2,\dividend MOV R0,\divisor MOV R3,#0 _md: ADD R3,R3,#1 SUBS R2,R2,R0 BPL _md ADD R2,R2,R0 SUB R3,R3,#1 .endm .global
_start .equ NUM,
32 .equ
SIZE, 6 .text .arm _start: MOV R2,#NUM MOV R0,#SIZE DIV r2,r0 @宏调用计算块数和字数 r2中存放字数,r3中存放块数 LDR
R0,=Src @R0=源数据区指针 LDR
R1,=Dst @R1=目标数据区指针 MOV SP,#0X9000 MOVS R3,R3 BEQ Copy_Words STMFD SP!,{R5-R10} @保存寄存器内容 #进行块拷贝,每次6个字 Copy_4Words: LDMIA R0!,{R5-R10} STMIA R1!,{R5-R10} SUBS
R3,R3,#1 BNE Copy_4Words LDMFD SP!,{R5-R10} @恢复寄存器内容 #将剩余的数据以字为单位进行拷贝 Copy_Words: MOVS R2,R2 BEQ
Stop Copy_Word: LDR R3,[R0],#4 STR R3,[R1],#4 SUBS R2,R2,#1 BNE Copy_Word Stop: B Stop .ltorg Src: .long
1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10 .long
1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF,0x10 Src_num: .long
32 Dst: .long
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.long
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.end @文件结束