当前位置:文档之家› 实验一 ARM汇编程序的编写以及启动代码的分析

实验一 ARM汇编程序的编写以及启动代码的分析

实验一 ARM汇编程序的编写以及启动代码的分析
实验一 ARM汇编程序的编写以及启动代码的分析

实验ARM汇编程序的编写以及启动代码的分析

一、实验目的:

练习ARM汇编程序的编写,对提供的程序的启动代码进行分析,了解S3C2410初始化过程, 初始化代码主要是包含在start.s中。

二、实验原理:

启动程序要完成的任务包括:硬件初始化,系统存储系统的配置,复制二级中断向量表。

启动程序过程

●系统硬件初始化

系统上电或复位后,程序从位于地址0x0的Reset Exception Vector处开始执行,因此需要在这里放置Bootloader的第一条指令:b ResetHandler,跳转到标号为ResetHandler处进行第一阶段的硬件初始化,执行完,系统进行堆栈和存储器的初始化。使用了外设,则需要设置相关的寄存器,确定其刷新频率、总线宽度等信息。

●代码段复制到RAM中运行

需要把系统的代码复制到RAM中运行。映像文件内部共有三种输出段:RO段、RW段和ZI段。ARMLink同时还产生了这三种输出段的起始和终止定位信息:Image$$RO$$Base、Image$$RO$$Limit、Image$$RW$$Base、Image$RW$Limit、Image$ZI$Base和Image$$ZI$$Limit。可以在程序中使用这些定位信息。将ROM中的代码和数据搬移到RAM中。

●建立二级中断向量表

在ARM系统中,中断向量表位于0X0开始的地址处,意味着无论运行什么样的上层软件,一旦发生中断,程序就得到Flash存储器中的中断向量表里去,降低系统的运行效率。因此在RAM中建立自己的二级中断向量表,当中断发生后,程序直接从RAM中取中断向量进入中断子程序。尤其是在中断频繁发生的系统里,这种方法可以大大提高系统的运行效率。

三、实验内容:

1.运行一个简单的串口程序,单步执行初始化代码,观察寄存器变化。

2.分析系统上电后的初始化工作包括哪些内容。

3.分析中断的处理过程,包括中断向量表的建立、中断源的识别及中断IRQ 服务程序是如何进入的。

4.分析应用程序的结构。

四、实验代码:

在系统上电后,初始化部分的工作注意包含以下部分:

1、关看门狗定时器

2、屏蔽所有中断

3、设置CPU时钟频率。

4、设置存储器控制寄存器,对外部存储器的参数进行设置。

5、初始化各模式下的堆栈

6、建立IRQ中断的总的入口地址

7、初始化应用程序的执行环境

8、跳入Main函数,进入C程序

;=========================================

; NAME: 2410INIT.S

; DESC: C start up codes

; Configure memory, ISR ,stacks

; Initialize C-variables

; HISTORY:

; 2002.02.25:kwtark: ver 0.0

; 2002.03.20:purnnamu: Add some functions for testing STOP,POWER_OFF mode

;=========================================

GET option.s ;GET相当INCLUDE 将一个源文件包含到当前源文件,这里表示包含option.s,并在当前位置进行汇编

GET memcfg.s

GET 2410addr.s

BIT_SELFREFRESH EQU (1<<22) ;定义了一些符号常量

;ARM异常模式的定义

;SDRAM/DRAM 刷新控制器bit22 REFMD位0:CBR/AUTO REFRESH 1:SHIF REFRESH ;下面是对arm处理器模式寄存器对应值的常数定义,arm处理器中有一个CPSR程序状;态寄存器,CPSR后五位决定目前的处理器模式。

;Pre-defined constants

USERMODE EQU 0x10 ;用户模式

FIQMODE EQU 0x11 ;FIQ快速中断模式

IRQMODE EQU 0x12 ;中断模式

SVCMODE EQU 0x13 ;管理模式

ABORTMODE EQU 0x17 ;中止模式

UNDEFMODE EQU 0x1b ;未定义指令模式

MODEMASK EQU 0x1f ;系统模式

NOINT EQU 0xc0 ;禁止IRQ和FIQ中断

;ARM各异常模式堆栈,定义各模式堆栈地址

;_STACK_BASEADDRESS在option.s中,

;The location of stacks

_STACK_BASEADDRESS EQU (SDRAM_END-0x8000) ;0x33ff8000

UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ ; 用户模式堆栈

SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 ~0x3ff47ff ; 管理模式堆栈4k

UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 ~0x3ff57ff ; 未定义指令模式堆栈1k

AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 ~0x3ff5bff ; 中止模式堆栈1k

IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 ~0x3ff5fff ; 中断模式堆栈4k

FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 ~0x33ff6fff ; 快速中断模式堆栈4k

;arm处理器有两种工作状态

;1.arm:32位这种工作状态下执行字对齐的arm指令

;2.Thumb:16位这种工作状;态执行半字对齐的Thumb指令

;因为处理器分为16位32位两种工作状态程序的编译器也是分16位和32两种编译方式;所以下面的程序用于根据处理器工作状态确定编译器编译方式

;code16伪指令指示汇编编译器,后面的指令为16位的thumb指令

;code32伪指令指示汇编编译器,后面的指令为32位的arm指令

;这段是为了统一目前的处理器工作状态和软件编译方式(16位编译环境使用tasm.exe编译);Check if tasm.exe(armasm -16 ...@ADS 1.0) is used. 检查是否是用tasm.exe进行16位编译GBLL THUMBCODE ;声明一个全局变量并初始化为{FALSE}

[ {CONFIG} = 16 ;if config=16这里表示用16位编译方式THUMBCODE SETL {TRUE} ;SETL 给全局变量赋值,设置THUMBCODE 为true CODE32 ;CODE32表明一下操作都在ARM状态,转入32位编译模式

| ; |=ELSE | 等同ELSE

THUMBCODE SETL {FALSE} ;设置THUMBCODE 为false,THUMBCODE=FALSE ] ;endif ] 等同ENDIF

;宏定义MOV_PC_LR

MACRO ;MACRO 定义宏,宏定义开始

MOV_PC_LR ;宏将被下面定义部分展开,宏名MOV_PC_LR [ THUMBCODE ;if THUMBCODE=true

bx lr ;THUMBCODE 模式上返回ARM状态

| ;else

mov pc,lr ;ARM状态下返回

] ;end if

MEND ;宏结束

MACRO ;宏定义开始

MOVEQ_PC_LR ;宏名为MOVEQ_PC_LR,与上面部分相同[ THUMBCODE ;if THUMBCODE=true

bxeq lr ;EQ 相等则跳转回ARM状态

| ;else

moveq pc,lr ;同上位置相同部分,不同的是如果相等才跳回ARM状态] ;end if

MEND ;宏结束

;宏定义-进入异常流程

;HANDLER-宏的名称

;$HandleLabel-宏的参数

;这个宏的作用是把各个中断程序的地址装入当前的PC,2410有两种装断模式:一种是没有

;中断向量表,一种是使用中断向量表的

;使用中断向量表只能是IRQ方式,当使用中断向量表的时候,中断发生时由2410的中断控;制器自动跳转到

;相应的位置。

;注意下面这段宏定义程序

;下面包含的HandlerXXX HANDLER HandleXXX将都被下面这段程序展开

;本初始化程序定义了一个数据区(在文件最后),34个字空间,存放相应中断服务程序的首;地址。每个字,即4字节

;空间都有一个标号,以Handle***命名。

;在向量中断模式下使用“加载程序”来执行中断服务程序。

;向量中断模式和非向量中断模式的区别是: 向量中断模式是当cpu读取位于0x18处的IR ;Q中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令,;通过跳转指令系统就直接跳转到对应地址

;函数中节省了中断处理时间提高了中断处理速度标例如ADC中断的向量地址为0xC0,

;在0xC0处放如下代码:

;ldr PC,=HandlerADC 当ADC中断产生的时候系统会自动跳转到HandlerADC函数中

;非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将int ;errupt pending寄存器中对应标志位置位

;然后跳转到位于0x18处的统一中断;函数中

;该函数通过读取interrupt pending寄存器中对应标志位来判断中断源,并根据优先级关系;再跳到;对应中断源的处理代码中

;大致作用是把宏的第一个参数$HandlerLabel转变为一个标号,然后让程序跳转到第二个参;数$HandleLabel(为一个地址)对应的值的地址去。

;所以,通过上面的分析可以看出,$HandlerLabel HANDLER $HandleLabel是让PC跳转到$H ;andleLabel中存放的地址执行。

MACRO ;宏定义

$HandlerLabel HANDLER $HandleLabel ;宏名字叫HANDLER,$HandleLabel是;行参,定义了一个标号$HandlerLabel,展开时可替换成相应的符号

$HandlerLabel

sub sp,sp,#4 ;sp-sp-4,空出的空间用于存放跳转地址

stmfd sp!,{r0} ;sp=sp-4,并将r0入栈

ldr r0,=$HandleLabel ;获取存放跳转地址的标号HandleLabel到r0

ldr r0,[r0] ;将HandleLabel中存放的跳转地址送给r0

str r0,[sp,#4] ;将r0存放到sp+4的地方,

ldmfd sp!,{r0,pc} ;弹出栈顶2个字,分别保存到r0和pc中,系统将跳

;转到对应中断处理函数,由上r0和pc都没变,但程序已跳转

MEND ;宏定义结束

;连接器生成的输出段相关的符号

;引入连接器生成的映象文件的各个部分地址。

;OR-只读区域、RW-读写区域、ZI-初始化为0的区域。

IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data) ,RO结束;地址+1

IMPORT |Image$$RW$$Base| ; Base of RAM to initialise,RW起始

IMPORT |Image$$ZI$$Base| ; Base and limit of area,RW段结束+1

IMPORT |Image$$ZI$$Limit| ; to zero initialise,ZI段起始地址

; 引入外部函数Main,进入C程序。

IMPORT Main ; The main entry of mon program

;IMPORT LEDTEST

;定义ARM汇编程序段,段名为SelfBoot,程序段为只读的代码段。

AREA SelfBoot,CODE,READONLY ;Selfboot初始化程序

;板子上电和复位后程序开始从位于0x0处开始执行,硬件刚刚上电复位后程序从这里开始;执行跳转到标为ResetHandler处执行

;DCD用于分配一段字内存单片,并用后面的伪指令初始化,分配字节由expr 个数决定

;程序入口地址

ENTRY

ResetEntry

;1)The code, which converts to Big-endian, should be in little endian code.

;2)The following little endian code will be compiled in Big-Endian mode. The code byte order should be changed as the memory bus width.

;3)The pseudo instruction,DCD can't be used here because the linker generates error.

ASSERT :DEF:ENDIAN_CHANGE ;ASSERT 断言错误伪指令,这里表示是否定义过ENDIAN_CHANGE

[ ENDIAN_CHANGE ;如果定义了ENDIAN_CHANGE

ASSERT :DEF:ENTRY_BUS_WIDTH ;这里表示是否定义过ENTRY_BUS_WIDTH

[ ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH=32

b ChangeBigEndian ;DCD 0xea000007,跳转到ChangeBigEndian,;执行DCD 0xea000007 改变大小端数据模式

] ;end if

[ ENTRY_BUS_WIDTH=16 ;if ENTRY_BUS_WIDTH=16

andeq r14,r7,r0,lsl #20 ; DCD 0x0007ea00,标志状态寄存器CPSR的Z ;=1时,r14=r7+r0逻辑左移20位,执行DCD 0x0007ea00改变大小端模式

] ;end if

[ ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8

streq r0,[r0,-r10,ror #1] ; DCD 0x070000e,当标志状态寄存器CPSR的Z ;=1时…,执行DCD 0x070000ea 改变大小端模式

] ;end if

| ;ELSE 即如果没定义ENDIAN_CHANGE

b ResetHandler ;复位处理模式

]

b HandlerUndef ;handler for Undefined mode 处理为定义模式

b HandlerSWI ;handler for SWI interrupt 处理软中断模式

b HandlerPabort ;handler for PAbort 处理终止程序访问终止模式

b HandlerDabort ;handler for DAbort 处理数据访问终止模式

b . ;reserved 保留,"."代表指令的地址,即表示进行死循环

b HandlerIRQ ;handler for IRQ interrupt 处理中断模式

b HandlerFIQ ;handler for FIQ interrupt 处理快速中断模式

;@0x20 "@" 存储区位置计数器的当前值

b EnterPWDN ;进入掉电模式,见下面的标号

ChangeBigEndian ;上面提到的ChangeBigEndian,改变大小端数据模式

;@0x24

[ ENTRY_BUS_WIDTH=32 ;if ENTRY_BUS_WIDTH=32

DCD 0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0

DCD 0xe3800080 ;0xe3800080 => orr r0,r0,#0x80; //Big-endian

DCD 0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0

]

[ ENTRY_BUS_WIDTH=16 ;if ENTRY_BUS_WIDTH=16

DCD 0x0f10ee11

DCD 0x0080e380

DCD 0x0f10ee01

]

[ ENTRY_BUS_WIDTH=8 ;if ENTRY_BUS_WIDTH=8

DCD 0x100f11ee

DCD 0x800080e3

DCD 0x100f01ee

]

DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode.

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

b ResetHandler ;复位处理程式

;Function for entering power down mode

; 1. SDRAM should be in self-refresh mode.

; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.

; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.

; 4. The I-cache may have to be turned on.

; 5. The location of the following code may have not to be changed.

;进入掉电模式功能

; 1. SDRAM 必须在自刷新模式.

; 2. 所有中断必须屏蔽for SDRAM/DRAM self-refresh.

; 3. LCD 关闭for SDRAM/DRAM self-refresh.

; 4. The I-cache 可能需要开启.

; 5. The location of the following code may have not to be changed.

;void EnterPWDN(int CLKCON); ;进入掉电模式

EnterPWDN

mov r2,r0 ;r2=rCLKCON CLKCON[3]掉电模式控制位0:关闭1:进入掉电模式tst r0,#0x8 ; POWER_OFF mode?判断POWER_OFF 是否为0 。r0和

#0X8相与,更新CPSR位

bne ENTER_POWER_OFF ;NE 不相等(则表示power_off不为O) 标志位Z=0

ENTER_STOP ;不进入掉电模式

ldr r0,=REFRESH ;0x48000024 ;DRAM/SDRAM refresh DRAM/SDRAM 刷新控制器,刷新DRAM/SDRAM

ldr r3,[r0] ;r3=rREFRESH

mov r1, r3 ;r1=r3

orr r1, r1, #BIT_SELFREFRESH ;BIT_SELFREFRESH EQU (1<<22) bit22 TREFMD位

0:CBR/AUTO REFRESH 1:SHIF REFRESH

str r1, [r0] ;R1->[R0] Enable SDRAM self-refresh

;%B是向后搜索局部标号,%F是向前搜索局部标号。

mov r1,#16 ;延时wait until self-refresh is issued. may not be needed.

0 subs r1,r1,#1 ;0为局部标号(延时)

bne %B0

ldr r0,=CLKCON ;enter STOP mode. CLKCON ;Clock generator control

str r2,[r0]

mov r1,#32

0 subs r1,r1,#1 ;1)延时wait until the STOP mode is in effect.

bne %B0 ;2) Or wait here until the CPU&Peripherals will be turned-off ; Entering POWER_OFF mode, only the reset by wake-up is available.

ldr r0,=REFRESH ;exit from SDRAM self refresh mode.

str r3,[r0]

MOV_PC_LR ;调用宏MOV_PC_LR

ENTER_POWER_OFF ;进入掉电模式

;NOTE.

;1) rGSTATUS3 should have the return address after wake-up from POWER_OFF mode.

ldr r0,=REFRESH

ldr r1,[r0] ;r1=rREFRESH

orr r1, r1, #BIT_SELFREFRESH

str r1, [r0] ;Enable SDRAM self-refresh

mov r1,#16 ;Wait until self-refresh is issued,which may not be needed.

0 subs r1,r1,#1 ;延时

bne %B0

ldr r1,=MISCCR ; ;Miscellaneous control,混杂控制模式

ldr r0,[r1]

orr r0,r0,#(7<<17) ;Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during ;boot-up

str r0,[r1]

ldr r0,=CLKCON

str r2,[r0]

b . ;CPU will die here. "."当前指令的地址CPU死在这

WAKEUP_POWER_OFF ;掉电唤醒

;Release SCLKn after wake-up from the POWER_OFF mode.

ldr r1,=MISCCR ;Miscellaneous control,混杂模式

ldr r0,[r1]

bic r0,r0,#(7<<17) ;SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->H

str r0,[r1]

;Set memory control registers

ldr r0,=SMRDATA

ldr r1,=BWSCON ;BWSCON Address 起始位置依次为BANKCON0 BANKCON1 BANKCON2 ........

add r2, r0, #52 ;End address of SMRDATA

ldr r3, [r0], #4 ;读取R0地址的数据到R3 R0=R0+4 读取SMRDATA 数组(BWSCON BANKCON0 ....)的值

str r3, [r1], #4 ;读取R3的数据到R1地址内存中R1=R1+4 赋给BWSON BANKCON0 ....寄存器

cmp r2, r0

bne %B0 ;判断是否赋完值

mov r1,#256

0 subs r1,r1,#1 ;1) wait until the SelfRefresh is released.

bne %B0 ;延时

ldr r1,=GSTATUS3 ;GSTATUS3 has the start address just after POWER_OFF wake-up

ldr r0,[r1] ;Saved data0(32-bit) before entering POWER_OFF mode,在进;入掉电模式之前(POWER=OFFMODE),保存data0

mov pc,r0

LTORG ;文字池, 声明一个数据缓冲池的开始

;下面是具体的中断处理函数跳转的宏,通过上面的$HandlerLabel的宏定义展开后跳转到对;应的中断处理;函数(对于向量中断)

HandlerFIQ HANDLER HandleFIQ ;调用宏HANDLER

HandlerIRQ HANDLER HandleIRQ ;HandlerIRQ 行号HANDLER 宏名

;HandleIRQ 导入的形参

HandlerUndef HANDLER HandleUndef

HandlerSWI HANDLER HandleSWI

HandlerDabort HANDLER HandleDabort

HandlerPabort HANDLER HandlePabort

;下面这段程序是用来处理非向量中断,具体判断I_ISPR中各位是否置1 ,置1表示目前此;中断等待响应(每次只能有一位置1),

;从最高优先级中断位开始判断,检测到等待服务中断就将pc置为中断服务函数首地址

IsrIRQ ;IRQ模式中断(片内外设中断引脚中断)sub sp,sp,#4 ; reserved for PC,中断分发例程入口地址预留栈空间,预留;pc返回指针的存储位置

stmfd sp!,{r8-r9} ;将R8~R9 放入堆栈

;INTOFFSET寄存器各位表明发生了应该调用那个中断子程序。

;不过这个寄存器只能用在IRQ中断模式。

ldr r9,=INTOFFSET ;中断请求源偏移寄存器

ldr r9,[r9] ;r9中存放INTOFFSET的内容

ldr r8,=HandleEINT0 ; 取EINT0的地址,即IRQ 中断首址

add r8,r8,r9,lsl #2 ;r8=r8+ r9<<2 r9<<2(乘4),4字节对齐

ldr r8,[r8] ;取[r8]地址的数据放入R8,加载中断服务函数地址到r8 str r8,[sp,#8] ;将R8中的数据放入[sp+8]的地址中,保存到sp,作为新的;PC

ldmfd sp!,{r8-r9,pc} ;将堆栈内空恢复到R8 R9 PC,跳转到新的PC运行

;===================================

; ENTRY

;===================================

;板子上电和复位后程序开始从位于0x0执行,b ResetHandler 程序从跳转到这;里执行

;板子上电复位后执行几个步骤。

;1.禁止看门狗屏蔽所有中断

;初始化程序入口指令

ResetHandler ;复位处理程式

ldr r0,=WTCON ; watch dog disable 关闭看门狗

ldr r1,=0x0

str r1,[r0] ;r1->[r0] 禁止看门狗

;1 ldr r0, =0x300

; ldr r1, [r0]

; b %B1

ldr r0,=INTMSK

ldr r1,=0xffffffff ;all interrupt disable,关中断,全部置1

str r1,[r0] ;r1->[r0] 禁止所有中断

ldr r0,=INTSUBMSK

ldr r1,=0x7ff ;all sub interrupt disable, 关所有子中断

str r1,[r0]

;测试外部LED等

[ {FALSE} ;if

; rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);

; Led_Display

ldr r0,=GPFCON ;F口控制寄存器

ldr r1,=0x5500

str r1,[r0]

ldr r0,=GPFDAT ;F口数据寄存器

ldr r1,=0x10

str r1,[r0]

]

;2.根据工作频率设置pll ,设置ARM主时钟频率

;计算公式

;Fpllo=(m*Fin)/(p*2^s)

;m=MDIV+8,p=PDIV+2,s=SDIV

;Fpllo必须大于20Mhz小于66Mhz

;Fpllo*2^s必须小于170Mhz

;To reduce PLL lock time, adjust the LOCKTIME register.

ldr r0,=LOCKTIME

ldr r1,=0xffffff

str r1,[r0]

[ PLL_ON_START

;Configure MPLL

ldr r0,=MPLLCON

ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin=12MHz,Fout=50MHz str r1,[r0]

]

;Check if the boot is caused by the wake-up from POWER_OFF mode.

ldr r1,=GSTATUS2 ; GSTATUS2 复位状态寄存器

ldr r0,[r1]

tst r0,#0x2 ;判断R0 的第二位是否为0

;In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP

;handler.

nop;bne WAKEUP_POWER_OFF

EXPORT StartPointAfterPowerOffWakeUp ;声明全局函数StartPointAfterPowerOffWakeUp

;3.置存储相关寄存器的程序

;设置存储器控制寄存器。

;是设置SDRAM,flash ROM 存储器连接和工作时序的程序,片选定义的程序

;SMRDATA map在下面的程序中定义

;Set memory control registers

ldr r0,=SMRDATA

ldr r1,=BWSCON ;BWSCON Address ;BWSCON Address 起始位置依次为BANKCON0

;BANKCON1 BANKCON2 ........

add r2, r0, #52 ;End address of SMRDATA 一共13个寄存器

ldr r3, [r0], #4 ;读取R0地址的数据到R3,R0=R0+4 读取SMRDATA 数组(BWSCON BANKCON0 ....)的值

str r3, [r1], #4 ;读取R3的数据到R1地址内存中R1=R1+4 赋给BWSON BANKCON0 ....寄存器

cmp r2, r0

bne %B0

;禁止Icache和Dcache,禁止MMU

;IMPORT MMU_DisableICache

;bl MMU_DisableICache ;

;IMPORT MMU_DisableDCache

;bl MMU_DisableDCache ;

;IMPORT MMU_InvalidateICache

;bl MMU_InvalidateICache ;

;IMPORT MMU_DisableMMU

;bl MMU_DisableMMU ;

;初始化堆栈

;Initialize stacks

bl InitStacks

; Setup IRQ handler

ldr r0,=HandleIRQ ;This routine is needed

ldr r1,=IsrIRQ ;if there isn't 'subs pc,lr,#4' at 0x18, 0x1c

str r1,[r0]

adr r0, ResetEntry ;adr也是取值,但这时程序在哪运行就取那时的地址

ldr r2, BaseOfROM

cmp r0, r2

ldreq r0, TopOfROM

beq InitRam

ldr r3, TopOfROM

;将RO区域的代码copy到RW域中并且将ZI区域初始化为0。

;6.将数据段拷贝到ram中将零初始化数据段清零,跳入C语言的main函数执行到这步结束bootloader初步引导结束

ldmia r0!, {r4-r7}

stmia r2!, {r4-r7}

cmp r2, r3

bcc %B0

sub r2, r2, r3

sub r0, r0, r2

InitRam ;将RW内容从FLASH拷贝到SDRAM ldr r2, BaseOfBSS

ldr r3, BaseOfZero

cmp r2, r3 ;copy 初始化代码

ldrcc r1, [r0], #4 ;没有设置C标志位的时候执行,即无符号数小于

strcc r1, [r2], #4

bcc %B0

;ZI段全部清零

mov r0, #0 ;初始化ZI区域为0

ldr r3, EndOfBSS

1

cmp r2, r3

strcc r0, [r2], #4

bcc %B1

[ :LNOT:THUMBCODE ;将THUMBCODE 做逻辑非操作bl Main ; Don't use main() because ...... 转入C程序

;bl LEDTEST

b . ;死循环

]

[ THUMBCODE ;for start-up code for Thumb mode

orr lr,pc,#1

bx lr

CODE16

bl Main ; Don't use main() because ...... 转入C程序

b .

CODE32

]

;堆栈初始化

;这是上面提到的对存储寄存器初始化的数据map

;function initializing stacks

InitStacks

;Don't use DRAM,such as stmfd,ldmfd......

;SVCstack is initialized before

;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'

mrs r0,cpsr ;r0<-cpsr

bic r0,r0,#MODEMASK ;MODEMASK=0x1f 清除CPSR中的PSR位(5bit) orr r1,r0,#UNDEFMODE|NOINT ;NOINT=0XC0 禁止IRQ和FIQ中断

msr cpsr_cxsf,r1 ;UndefMode cpsr_cxsf<-r1

ldr sp,=UndefStack

orr r1,r0,#ABORTMODE|NOINT

msr cpsr_cxsf,r1 ;AbortMode

ldr sp,=AbortStack

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1 ;IRQMode

ldr sp,=IRQStack

orr r1,r0,#FIQMODE|NOINT

msr cpsr_cxsf,r1 ;FIQMode

ldr sp,=FIQStack

bic r0,r0,#MODEMASK|NOINT

orr r1,r0,#SVCMODE

msr cpsr_cxsf,r1 ;SVCMode

ldr sp,=SVCStack

;USER mode has not be initialized. 用户模式不初始化堆栈

mov pc,lr

;The LR register won't be valid if the current mode is not SVC mode.

LTORG ;声明一个数据缓冲池的开始。声明一个缓冲池常放在无条件

;跳转指令后,或子程序返回后,

;这样处理器就不会将文字池中的数据当指令来处理

SMRDATA DATA ;定义存储器控制器

; Memory configuration should be optimized for best performance

; The following parameter is not optimized.

; Memory access cycle parameter strategy

; 1) The memory settings is safe parameters even at HCLK=75Mhz.

; 2) SDRAM refresh period is for HCLK=75Mhz.

DCD

(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON <<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28)) ; BWSCON=0x2211D110定义BWSCON DCD

((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_P MC)) ;GCS0 BANK0CON=0x0700定义BANKCON0,下同

DCD

((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_P MC)) ;GCS1 BANKCON1=0x7FFC

DCD

((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_P MC)) ;GCS2 BANKCON2=0x0700

DCD

((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_P MC)) ;GCS3 BANKCON3=0x0700

DCD

((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_P MC)) ;GCS4 BANKCON4=0x0700

DCD

((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_P MC)) ;GCS5 BANKCON5=0x0700

DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN)) ;GCS6 BANKCON6=0x18005

DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN)) ;GCS7 BANKCON7=0x18005

DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) ;REFR ESH ;REFRESH=0x008E0459 DRAM/SDRAM refresh 设置刷新周期

DCD 0x32 ;SCLK power saving mode, BANKSIZE 128M/128M

DCD 0x30 ;MRSR6 CL=3clk ;Mode register set for SDRAM

DCD 0x30 ;MRSR7 ;Mode register set for SDRAM

; DCD 0x20 ;MRSR6 CL=2clk

; DCD 0x20 ;MRSR7

ALIGN ;通过添加补丁字节使当前位置满足一定的对齐方式,声明字对齐

;这里将中断异常向量建立在sdram中

;可读写的数据段

AREA RamData, DATA, READWRITE ;异常中断向量(矢量)

^ _ISR_STARTADDRESS

^=MAP:定义一个结构化的内存表(storage map)的首地址,地址为0x33ff8000 HandleReset # 4 ; #--Field:定义一个结构化内存表中的数据域,该域为4个

;字节

HandleUndef # 4

ARM实验指导

ADS 集成开发环境及EasyJTAG 仿真器应用 ADS 集成开发环境是ARM 公司推出的ARM 核微控制器集成开发工具,英文全称为ARM Developer Suite,成熟版本为ADS1.2。ADS1.2 支持ARM10 之前的所有ARM 系列微控制器,支持软件调试及JTAG 硬件仿真调试,支持汇编、C、C++源程序,具有编译效率高、系统库功能强等特点,可以在Windows98、Windows XP、Windows2000 以及RedHat Linux上运行。 这里将简单介绍使用ADS1.2 建立工程,编译连接设置,调试操作等等。最后还介绍了基于LPC2100 系列ARM7 微控制器的工程模板的使用,EasyJTAG 仿真器的安装与使用。 一、ADS 1.2 集成开发环境的组成 ADS 1.2 由6 个部分组成,如表1 所示。 表1 ADS 1.2 的组成部分 由于用户一般直接操作的是CodeWarrior IDE 集成开发环境和AXD 调试器,所以这一章我们只介绍这两部分软件的使用,其它部分的详细说明参考ADS 1.2 的在线帮助文档或相关资料。 1. CodeWarrior IDE 简介

ADS 1.2 使用了CodeWarrior IDE 集成开发环境,并集成了ARM 汇编器、ARM 的C/C++编译器、Thumb 的C/C++编译器、ARM 连接器,包含工程管理器、代码生成接口、语法敏感(对关键字以不同颜色显示)编辑器、源文件和类浏览器等等。CodeWarrior IDE 主窗口如图1所示。 2. AXD 调试器简介 AXD 调试器为ARM 扩展调试器(即ARM eXtended Debugger),包括ADW/ADU 的所有特性,支持硬件仿真和软件仿真(ARMulator)。AXD 能够装载映像文件到目标内存,具有单步、全速和断点等调试功能,可以观察变量、寄存器和内存的数据等等。AXD 调试器主窗口如图2 所示。

ARM实验1

ARM技术原理与应用 实验报告 专业电子信息工程班级 学生姓名 学号 指导教师 2017年4月12 日

一、实验目的 (1)掌握ADS集成开发环境的创建; (2)掌握ADS环境下工程创建; (3)掌握ADS环境下汇编语言源程序创建、编辑、修改; (4)掌握ADS环境下汇编语言源程序的汇编操作; (5)掌握AXD环境下汇编语言程序的调试。 二、实验要求 1、实验必须在在ADS1.2环境下进行。 2、工程名、汇编语言源文件名按照下面规则命名: 工程名:pj+学号最后4位+其它字符 汇编语言源文件名:p+学号最后4位+其它字符+.s 例如:张维智同学学号最后4位是3134 因此,pj3134、pj3134a、pj31341等都是允许的工程名;而 p3134a.s、p3134b.s等都是允许的源文件名。 3、实验报告中需要说明实验中在ADS、AXD环境下进行的实际操作; 4、实验报告中应给出实际的实验操作及计算机的调试观察结果; 5、按照规定格式打印实验报告。 三、实验任务 1、在自己的笔记本电脑上安装ADS1.2ARM集成开发环境。同时,操作实验室台式机上ADS1.2以便熟悉实验室的ADS1.2集成开发环境。 2、参考课件文档:ARM汇编语言程序设计实验环境与工具的使用-笔记本电脑版-v2.doc,创建pjxxxx工程。 3、创建pxxxx.s汇编语言源程序。然后严格按照下面格式输入源程序。 AREA Example, CODE, READONLY Entry 才ode32 START: Mov R0,#5 MOV R2,#5 ;r2 MOV R0,0 mov R1,#0 LOOP: CUP R1,R2 BHI ADD_END ADD R0,R0 R1 ADD R1,R1,#1 B LOOP ADD_end B START End 在实验报告中列出上面自己创建的pxxxx.s汇编语言源程序。 4、将pxxxx.s汇编语言源程序添加到pjxxxx工程中。记录实验步骤和结果。 5、选Project->Make操作,对pxxxx.s汇编语言源程序进行汇编。记录错误数,出错行的

ARM实验汇编代码.

AREA Example1,CODE,READONLY ENTRY CODE32 START MOV R0,#15 MOV R1,#8 ADDS R0,R0,R1 B START END Test2.s X EQU 11 Y EQU 8 BIT23 EQU (1<<23 AREA Example3,CODE,READONLY ENTRY CODE32 START Y MOV R0,#X MOR R1,#Y ADD R3,R0,R1 MOV R8,R3

MVN R0,#0XA0000007 SUB R5,R0,R8,LSL #3 MOV R0,#Y ADD R0,R0,R0,LSL #2 MOV R0,R0,LSR #1 MOV R1,#X MOV R1,R1,LSL #1 CMP R0,R1 LDRHI R2,=0XFFFF0000 ANDHI R5,R5,R2 ORRLS R5,R5,#0X000000FF TST R5,#BIT32 BICNE R5,R5,#0X00000040 B START END //*******Test3.s******************** X EQU 11 Y EQU 8 BIT23 EQU (1<<23

AREA Example3,CODE,READONLY ENTRY CODE32 START MOV R0,#X MOV R1,#Y ADD R3,R0,R1 MOV R8,R3 MVN R0,#0XA0000007 SUB R5,R0,R8,LSL #3 MOV R0,#Y ADD R0,R0,R0,LSL #2 MOV R0,R0,LSR #1 MOV R1,#X MOV R1,R1,LSL #1 CMP R0,R1 LDRHI R2,=0XFFFF0000 ANDHI R5,R5,R2 ORRLS R5,R5,#0X000000FF TST R5,#BIT23

ARM实验报告--Thumb

XI`AN TECHNOLOGICAL UNIVERSITY 实验报告

西安工业大学实验报告 一丶实验目的 通过实验掌握ARM处理器16位Thumb汇编指令使用方法 二、实验内容 使用Thumb汇编语言,完成基本reg/men访问,以及简单的算术/逻辑运算。 使用Thumb汇编语言,完成较为复杂的程序分支,领会立即数大小的限制,并体会ARM与Thunb的区别。 三、实验原理 ARM 处理器共有两种工作状态: ARM:32 位,这种状态下执行字对准的ARM 指令; Thumb:16 位,这种状态下执行半字对准的Thumb 指令 在Thumb 状态下,程序计数器PC 使用位1 选择另一个半字。 注意: ARM 和Thumb 之间状态的切换不影响处理器的模式或寄存器的内容。ARM 处理器在两种工作状态之间可以切换。 1)进入Thumb 状态。当操作数寄存器的状态位0 为1 时,执行BX 指令进入Thumb 状态。如果处理器在Thumb 状态进入异常,则当异常处理(IRQ,FIQ,Undef,Abort 和SWI)返回时,自动切换到Thumb 状态。 2) 进入ARM 状态。当操作数寄存器的状态位0 为0 时,执行BX 指令进入ARM 状

态。处理器进行异常处理(IRQ,FIQ,Undef,Abort 和SWI)。在此情况下,把PC 方入异常模式链接寄存器中。从异常向量地址开始执行也可以进入ARM 状态。 四、实验过程 1)打开Embest IDE Pro软件,选择菜单项File-->New Workspace,系统弹出对话框,创建名为TEXT的新工程,并同时创建一个与工程名相同的工作区。此时在工作窗口将打开该工作区和工程。 2)建立源文件: 点击菜单项File-->New,系统弹出一个新的、没有标题的文本编辑窗,输入光标位玉窗口中第一行,将程序所需的源文件代码输入,编辑完后,进行保存,保存文件格式为_a.s文件。 3)添加源文件: 选择Project-->Add To Project-->File命令,弹出文件选择对话框,在工程目录下选择刚才建立的_a.s格式的源文件 4)基本配置: 选择菜单项Project-->Settings,弹出工程设置对话框,在工程设置对话框中,选择Processor设置对话框,选择ARM7对目标板所用处理器进行配置。

ARM嵌入式实验报告

实验一 ARM汇编指令使用实验——基本数学/逻辑运算 一、实验目的 1. 初步学会使用ARM ADS / Embest IDE for ARM 开发环境及ARM软件模拟器。 2. 通过实验掌握数据传送和基本数学/逻辑运算的ARM汇编指令的使用方法。 二、实验设备 1. 硬件:PC机。 2. 软件:ADS 1.2 / Embest IDE 200X集成开发环境。 三、实验内容 1.熟悉ADS 1.2 / Embest IDE 200X开发环境的使用,使用LDR/STR和MOV等指令访问寄存器或存储单元,实现数据的加法运算。具体实验程序如下: /* armasm1a.s */ .EQU X, 45 /*定义变量X,并赋值为45*/ .EQU Y, 64 /*定义变量Y,并赋值为64*/ .EQU STACK_TOP, 0X1000 /*定义栈顶0X1000*/ .GLOBAL _START .TEXT _START: /*程序代码开始标志*/ MOV SP, #STACK_TOP MOV R0, #X /*X的值放入R0*/ STR R0, [SP] /*R0的值保存到堆栈*/ MOV R0, #Y /*Y的值放入R0*/ LDR R1, [SP] /*取堆栈中的数到R1*/ ADD R0, R0, R1 STR R0, [SP] STOP: B STOP /*程序结束,进入死循环*/ .END 2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。具体实验程序如下:/* armasm1b.s */ .EQU X, 45 /*定义变量X,并赋值为45*/ .EQU Y, 64 /*定义变量Y,并赋值为64*/ .EQU Z, 87 /*定义变量Z,并赋值为87*/ .EQU STACK_TOP, 0X1000 /*定义栈顶0X1000*/ .GLOBAL _START .TEXT _START: /*程序代码开始标志*/ MOV R0, #X /*X的值放入R0*/ MOV R0, R0, LSL #8 /*R0的值乘以2的8次方 */ MOV R1, #Y /*Y的值放入R1*/ ADD R2, R0, R1, LSR #1 /*R1的值除以2再加上R0后的值放入R2*/ MOV SP, #0X1000

ARM实验三

教师评阅意见: 签名:年月日实验成绩: 一.实验目的 通过实验了解使用ADS 1.2 编写C 语言程序,并进行调试。 二.实验设备 (1)硬件:PC 机一台 (2)软件:Windows98/XP/2000 系统,ADS 1.2 集成开发环境 三.实验内容 编写一个汇编程序文件和一个C 程序文件。汇编程序的功能是初始化堆栈指针和初始化C 程序的运行环境,然后调跳转到C 程序运行,这就是一个简单的启动程序。C 程序使用加法运算来计算1+2+3+...+(N-1)+N 的值(N>0)。 四.实验预习要求 (1)仔细阅读参考文献[1]第4 章ARM 指令系统的内容。 (2)仔细阅读产品光盘附带文档《ADS 集成开发环境及仿真器应用》或其它相关资料,了解ADS 工程编辑和AXD 调试的内容。(本实验使用软件仿真)。五.实验步骤 (1)启动ADS 1.2,使用ARM Executable Image 工程模板建立一个工程ProgramC。(2)建立源文件Startup.S 和Test.c,编写实验程序,然后添加到工程中。(3)设置工程链接地址RO Base 为0x40000000,RW Base 为0x40003000。设置调试入口地址Image entry point 为0x40000000。 (4)设置位于开始位置的起始代码段,如图2.14 所示。

(5)编译链接工程,选择【Project】->【Debug】,启动AXD 进行软件仿真调试。 (6)在Startup.S 的“B Main”处设置断点,然后全速动行程序。 (7)程序在断点处停止。单步运行程序,判断程序是否跳转到C 程序中运行。(8)选择【Processor Views】->【Variables】)打开变量观察窗口,观察全局变量的值, 单步/全速运行程序,判断程序的运算结果是否正确。 六.实验参考程序 C 语言实验的参考程序见程序清单2.8。汇编启动代码见程序清单2.6。 程序清单2.8 C 语言实验参考程序 #define uint8 unsigned char #define uint32 unsigned int #define N 100 uint32 sum; // 使用加法运算来计算1+2+3+...+(N-1)+N 的值。(N>0) void Main(void) { uint32 i; sum = 0;

ARM基本指令实验报告书.

ARM基本指令实验报告书 ARM基本指令实验报告书1、实验内容或题目●熟悉开发环境的使用并使用ldr/str,mov 等指令访问寄存器或存储单元。●使用 add/sub/lsl/lsr/and/orr 等指令,完成基本数学/逻辑运算。2、实验目的与要求●初步学会使用Embest IDE for ARM 开发环境及ARM 软件模拟器;●通过实验掌握简单ARM 汇编指令的使用方法。3、实验步骤与源程序⑴ 实验步骤1) 新建工程:运行Embest IDE 集成开发环境,选择菜单项File → New Workspace,系统弹出一个对话框,输入相关内容。点击OK 按钮,将创建一个新工程,并同时创建一个与工程名相同的工作区。此时在工作区窗口将打开该工作区和工程。2) 建立源文件:点击菜单项File → New,系统弹出一个新的、没有标题的文本编辑窗,输入光标位于窗口中第一行,按照实验参考程序编辑输入源文件代码。3) 添加源文件:选择Project → Add To Project → Files 命令,或单击工程管理窗口中的相应右键菜单命令,弹出文件选择对话框,在工程目录下选择刚才建立的源文件asm1_a.s。4) 基本配置:选择菜单项Project → Settings…或快捷键Alt+F7,弹出工程设置对话框。在工程设置对话框中,选择Processor 设置对话框,按照图3-2 所示,进行目标板所用处理器的配置。5) 生成目标代码:选择菜单项Build → Build asm_a 或快捷键F7,生成目标代码。6) 调试设置:选择菜单项Project → Settings…或快捷键Alt+F7,弹出工程设置对话框。在工程设置对话框中,选择Remote 设置对话框,按照图3-4 所示对调试设备模块进行设置。7) 选择Debug 菜单Remote Connect 进行连接软件仿真器,执行Download 命令下载程序,并打开寄存器窗口。打开memory 窗口,观察地址0x8000~0x801f 的内容,与地址 0xff0~0xfff的内容。8) 单步执行程序并观察和记录寄存器与memory 的值变化。9) 结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM 指令的使用。10)理解和掌握实验后,完成实验练习题。首先在C盘根目录下找到EmbestIDE文件夹,打开Examples\ARM_Basic\3.1_asm1,这是实验的第一题。系统用EmbestIDE Pro软件打开此项目。然后在软件中操作Build- >Build asm1_a,接着再操作Debug Remote Connect,最后操作Debug Download.便能得出结果。⑵ 源代码题目一: 0x00008000 mov sp, #40960x00008004 mov r0, #450x00008008 str r0, [sp]0x0000800c mov r0, #640x00008010 ldr r1, [sp]0x00008014 add r0, r0, r10x00008018 str r0, [sp] stop :0x0000801c b 0x801c题目二: 0x00008000 mov r0, #450x00008004 mov r0, r0, lsl #80x00008008 mov r1, #640x0000800c add r2, r0, r1, lsr #10x00008010 mov sp, #40960x00008014 str r2, [sp]毕业论文

湖南工业大学ARM实验报告

ARM嵌入式系统原理及应用开发 实验报告 学院:电气与信息工程学院 班级:电子信息1204 指导老师:谭会生 姓名: 学号: 实验一:ARM汇编指令使用实验——基本数学/逻辑运算一、实验目的 1.初步学会使用ARM ADS / Embest IDE for ARM 开发环境及ARM软件模拟器。 2.通过实验掌握数据传送和基本数学/逻辑运算的ARM汇编指令的使用方法。 二、实验设备 1.硬件:PC机。 2.软件:ADS 1.2 / Embest IDE 200X集成开发环境。 三、实验内容 熟悉ADS 1.2 / Embest IDE 200X开发环境的使用,使用LDR/STR和MOV等指令访问寄存器或存储单元,实现数据的加法运算。具体实验参考程序如下: 四.实验操作步骤 1.新建工程。先建立一个实验文件夹,如E\ARMSY\armasm1;然后运行Embest IDE集成开发环境,选择File→New Workspace菜单项,弹出一个对话框,输入工程名armasm1a/armasmlb等相关内容;最后单击OK按钮,将创建一个新工程,并同时创建一个与工程名相同的工作区。此时在工作区窗口将能打开该工作区和工程。 2.建立源文件。选择File→New菜单项,弹出一个新的、没有标题的文本编辑窗口,输入光标位于窗口中第一行,按照实验参考程序编辑输入源文件代码。编辑完后,保存文件armasmla. s。 1)armasmla. s源程序: /* armasm1a.s */ .EQU X, 45 /*定义变量X,并赋值为45*/ .EQU Y, 64 /*定义变量Y,并赋值为64*/ .EQU STACK_TOP, 0X1000 /*定义栈顶0X1000*/ .GLOBAL _START .TEXT

ARM7基础实验(附原理图)

11.ADC数模转换——ARM的Proteus实验 LED闪烁——ARM的Proteus实验 实验原理 ARM(LPC21XX)的一个I/O口接LED,通过给它送0和1来设置LED的亮和灭。Proteus仿真电路图

步骤 KEIL 1.创建新工程 2.选择ARM型号(KEIL会自动生成启动代码startup.s) 3.添加源文件,编写程序 4.设置项目选项(是否输出hex、lst文件,设置linker script) Proteus 1.绘制电路图 2.载入程序 3.仿真 C语言源程序 /****************************************************************** ************/ /* */ /* led.c: 用ARM点亮一个led并闪烁,有点浪费…… */ /* */ /****************************************************************** ************/ #include /****************************************************************** ************* **函数名: delay() **描述: 软件延时 ******************************************************************* *************/ void delay (void) { unsigned volatile long i,j; for(i=0;i<60000;i++) for(j=0;j<5;j++) ; } int main(void) {

ARM实验报告

南京邮电大学通达学院 嵌入式系统B 实验报告 班级100023 专业通信工程(嵌入式系统开发) 学号10002304 姓名陆海霞 实验项目: 1、ADS下简单ARM汇编程序 2、熟悉LINUX开发环境 3、多线程应用程序设计 指导教师范山岗

实验一ADS下简单ARM汇编程序 实验目的: 1、熟悉ADS1.2下进行汇编语言程序设计的基本流程; 2、熟悉在ADS中创建工程及编写、编译和运行汇编语言程序的方法; 3、熟悉AXD中各种调试功能。 实验环境: 1、硬件:PC机。 2、软件ADS1.2。 实验内容: 1、在ADS中新建工程,并设置开发环境。 2、在Code Warrior 环境中编辑、编译和链接汇编语言程序,并生成可执行文件。 3、在AXD中调试汇编程序; 4、使用命令行界面编辑、编译和链接汇编程序。 实验步骤: 本实验要求在ADS环境下,编写一个汇编程序,计算S=1+2+3……+n的累加值。 把累加结果S存入到存储器的指定位置;在AXD中调试该程序,使用ARMulator模拟目标机。 1、新建工程。 打开Code Warrior,选择File->New(project)选项,使用ARM Executable Image模版新建一个工程。 2、设置编译和链接选项。 由于我们使用的是模拟机,设置汇编语言编译器的模拟处理器架构为Xscale;在ARM Linker 中,选择output选项卡并选择Linktype为Simple类型,确认RO Base为0x8000,修改RW Base为0x9000, 3、为当前工程添加源程序文件。 ARM汇编程序源文件后缀名为S大小写均可。 确保添加入当前工程复选框选上。 4、编辑源程序代码。 参考程序add.s : ;armadd源程序 N EQU 7 ;累加次数 ;定义名为Adding的代码段 AREA Adding,CODE,READONL Y ENTRY MOV R0,#0 MOV R1,#1 REPEAT ADD R0,R0,R1

2014完整ARM嵌入式系统实验报告

郑州航空工业管理学院 嵌入式系统实验报告 (修订版) 20 – 20第学期 赵成,张克新编著 院系: 姓名: 专业: 学号: 电子通信工程系 2014年3月制

实验一ARM体系结构与编程方法 一、实验目的 了解ARM9 S3C2410A嵌入式微处理器芯片的体系结构,熟悉ARM微处理器的工作模式、指令状态、寄存器组及异常中断的概念,掌握ARM指令系统,能在ADS1.2 IDE中进行ARM汇编语言程序设计。 二、实验内容 1.ADS1.2 IDE的安装、环境配置及工程项目的建立; 2.ARM汇编语言程序设计(参考附录A): (1)两个寄存器值相加; (2)LDR、STR指令操作; (3)使用多寄存器传送指令进行数据复制; (4)使用查表法实现程序跳转; (5)使用BX指令切换处理器状态; (6)微处理器工作模式切换; 三、预备知识 了解ARM嵌入式微处理器芯片的体系结构及指令体系;熟悉汇编语言及可编程微处理器的程序设计方法。 四、实验设备 1. 硬件环境配置 计算机:Intel(R) Pentium(R) 及以上; 内存:1GB及以上; 实验设备:UP-NETARM2410-S嵌入式开发平台,J-Link V8仿真器; 2. 软件环境配置 操作系统:Microsoft Windows XP Professional Service Pack 2; 集成开发环境:ARM Developer Suite (ADS) 1.2。 五、实验分析 1.安装的ADS1.2 IDE中包括和两个软件组件。在ADS1.2中建立类型的工程,工程目标配置为;接着,还需要对工程进行、及链接器设置;最后,配置仿真环境为仿真方式。 2.写出ARM汇编语言的最简程序结构,然后在代码段中实现两个寄存器值的加法运算,给出运算部分相应指令的注释。 ; 文件名:

ARM嵌入式实验报告完整篇(修改)解析

《ARM嵌入式系统》 实验报告 学生姓名刘宝雨 班级测控1002班学号10401600244 电气与信息工程学院 2013年4 月20 日

目录 目录 (1) 实验一 ARM汇编指令实验1 (2) 一、实验目的 (2) 二.实验设备 (2) 三.实验内容 (2) 四.实验原理 (2) 五.实验操作步骤 (2) 六.实验报告 (10) 实验二ARM汇编指令实验2 (10) 一、实验目的 (10) 二.实验设备 (10) 三.实验内容 (10) 四.实验原理 (10) 五.实验操作步骤 (11) 六.实验报告 (18) 实验三会编与C语言的相互调用实验 (18) 一、实验目的.......................................................................................,.. (18) 二.实验设备....................................................................................,,,,,,. (18) 三.实验内容....................................................................................,,,,,,, (18) 四.实验原理.......................................................................................,,, (19) 五.实验操作步骤.................................................................................,,,,,,. (20) 六.实验报告.................................................................................,,,,,,. (22)

ADS arm程序设计实验

大连民族大学 计算机科学与工程学院实验报告 实验题目: ADS arm程序设计 ___________________________ 课程名称:嵌入式系统 _________________ 实验类型:□演示性□验证性□操作性□设计性□综合性 专业:XXXX 班级:XXXXXX 学生姓名:XXXXXX 日期XXXXXX 【实验评语】

[实验报告正文] 1实验目的 ●熟悉ADS集成环境 ● Arm程序设计 2实验内容 ●在ADS中新建工程,并设置开发环境。 ●在AXD中调试汇编程序 3实验环境 ●硬件:PC机 ●软件:ADS ●操作系统:WINDOW 7 4实验流程 1)ADS编译系统工程建立配置步骤描述 1.1新建工程:先建一个文件夹如:H:\ test1。然后运行ADS1.2集成开发环境,选择File→New 菜单项,弹出一个对话框,然后出来图1.1新建工程类型选择对话框,选择project,在“Project name”中输入工程文件名”test1”,点击确定,同时创建一个与工程名相同的工作区。 1.2为当前工程添加源程序文件。 ARM汇编程序源文件后缀名为S大小写均可。选择Debug,DebugRel Release. 按照同样步骤建立test2.s。

1.3. 添加源文件:选择Project→Add To Project→File项,或单击工程管理窗口中的相应右键快捷菜单命令,打开文件选择对话框,在工程目录下选择刚才建立的源并添加到文件test1.s。在“Add Files”对话框中选择“DebugRel”按照同样步骤建立test 2.s。 1.4基本设置:设置中只需设置“entry point” 1.5生成目标代码:按下图标生成目标代码。 1.6调试设置:按下图标。首先编译和链接之后,在工程test1所在的目录下生 成一个名为“test_data的目录,同时打开对话框使用Debugrel目标,选择生成的test.axf用于调试。 1.7打开存储器窗口,观察地址的内容. 1.8单步执行程序并观察和记录寄存器与存储器值的变化。 1.9结合实验内容和相关资料,观察程序运行,通过实验加深理解ARM指令。 2)完成程序设计:X=|X|+|Y|+|Z|,其中R0=X=1,R1=Y=2,R2=Z=3,用子程序调用的方 法,入口参数为R3,出口参数为R4 a)一个*.s文件实现 b)写出完整的代码

arm实验源程序代码

ARM处理器工作模式实验程序代码: USR_STACK_LEGTH EQU 64 SVC_STACK_LEGTH EQU 0 FIQ_STACK_LEGTH EQU 16 IRQ_STACK_LEGTH EQU 64 ABT_STACK_LEGTH EQU 0 UND_STACK_LEGTH EQU 0 AREA Example5,CODE,READONL Y ; 声明代码段Example5 ENTRY ; 标识程序入口 CODE32 ; 声明32位ARM指令 START MOV R0,#0 MOV R1,#1 MOV R2,#2 MOV R3,#3 MOV R4,#4 MOV R5,#5 MOV R6,#6 MOV R7,#7 MOV R8,#8 MOV R9,#9 MOV R10,#10 MOV R11,#11 MOV R12,#12 BL InitStack ; 初始化各模式下的堆栈指针 ; 打开IRQ中断(将CPSR寄存器的I位清零) MRS R0,CPSR ; R0 <= CPSR BIC R0,R0,#0x80 MSR CPSR_cxsf,R0 ; CPSR <= R0 ; 切换到用户模式 MSR CPSR_c, #0xd0 MRS R0,CPSR ; 切换到管理模式 MSR CPSR_c, #0xdf MRS R0,CPSR HALT B HALT ; 名称:InitStack ; 功能:堆栈初始化,即初始化各模式下的堆栈指针。 ; 入口参数:无 ; 出口参数:无 ; 说明:在特权模式下调用此子程序,比如复位后的管理模式

InitStack MOV R0, LR ; R0 <= LR,因为各种模式下R0是相同的 ;设置管理模式堆栈 MSR CPSR_c, #0xd3 LDR SP, StackSvc ;设置中断模式堆栈 MSR CPSR_c, #0xd2 LDR SP, StackIrq ;设置快速中断模式堆栈 MSR CPSR_c, #0xd1 LDR SP, StackFiq ;设置中止模式堆栈 MSR CPSR_c, #0xd7 LDR SP, StackAbt ;设置未定义模式堆栈 MSR CPSR_c, #0xdb LDR SP, StackUnd ;设置系统模式堆栈 MSR CPSR_c, #0xdf LDR SP, StackUsr MOV PC, R0 StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1)*4 StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)*4 StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)*4 StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)*4 StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)*4 StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)*4 ; 分配堆栈空间 AREA MyStacks, DATA, NOINIT, ALIGN=2 UsrStackSpace SPACE USR_STACK_LEGTH * 4 ; 用户(系统)模式堆栈空间 SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ; 中断模式堆栈空间FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ; 快速中断模式堆栈空间AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间UndtStackSpace SPACE UND_STACK_LEGTH * 4 ; 未定义模式堆栈END

ARM汇编实验报告

《嵌入式系统原理与应用B》课程实验报告 ARM汇编语言编程与调试 要求完成的主要实验 1、给出的数据中寻找最大、最小数问题 2、两种求和运算的编程与调试 3、第四章作业第9题 4、排序冒泡程序的调试与总结 5、第四章作业第11题 说明:标注完成的实验,未完成的给予说明 专业名称:通信工程 班级:1510班 学生姓名:石龙飞 学号(8位):03151307 指导教师:刘钊远

给出的数据中寻找最大、最小数问题 一、实验目的 1、学习汇编软件的安装、使用,熟悉汇编环境。 2、学会使用汇编软件,如何新建一个工程,如何书写源代码,如何进行链接、编译,以及如何调试。 3、尝试一些简单的指令,学会用汇编指令写一些简单的程序。 二、实验内容 编写一个汇编程序,要求在给定的一组数中找到最大数和最小数。 三、实验主要步骤 1、首先建立一个工程 2、再新建.s的源文件,添加到工程中 3、编写源代码,这里主要是实现在一组数中寻找最大数和最小数,最后将找到的两个数放到相应的寄存器中。

4、进行链接编译,看看有没有语法的错误,如果有错误编译器会提示错误的类型以及在哪里出错。 5、进行debug调试,查找代码中的逻辑错误,若无逻辑错误,可在debug界面查看运行结果,其最需要的关注的几个地方是菜单栏的一组运行按钮、源码执行的步骤以及断点、左边的寄存器状态、下方的存储器状态,将这些综合起来,就可以很明确的回到程序如何运行,运行结果如何。

四、实验代码

五、实验总结与分析 1、实验结果分析 其中用红色方框框起来的是最后程序运行的结果,也就是在R3中保存了最小数在R2中保存了最大数,完成了实验要求。 2、在用汇编语言编程之前首先要看看有没有汇编软件ADS、没有的话需要安装,WindowsXP安装起来比较简单,只需要点击setup,一直点击写一部就可以,但是如果是Windows 7或者更高版本的话就需要在setup的属性里点击兼容WindowsXP,运行时以管理员身份运行才能正确进行安装。

arm实验代码

1.寄存器R0和R1中有两个正整数,求这两个数的最大公约数,结果保存在R3中。AREA TEST, CODE,READONL Y ENTRY START MOV R0,#3 MOV R1,#4 MOV R2,#5 CMP R0,R1 BHI EXI BLS EXT EXI CMP R0,R2 BHI AXI BLS AXY AXI MOV R3,R0 EXT CMP R1,R2 BHI AXT BLS AXY AXT MOV R3,R1 AXY MOV R3,R2 END 2.用汇编语言设计程序实现10! AREA TEST, CODE,READONL Y ENTRY STRA T MOV R13 ,#0X1000 MOV R0,#0X01 MOV R1,#0X02 MOV R2,#0X03 STMFD R13,{R0,R2,R1} MOV R7,#&FF LDMFD R13!,{R3-R5} MOV R8,#&55 END 3.实现字符串的逆序复制TEXT1=HELLO=>TEXT2=0LLEH AREA invstring, CODE, READONL Y start

ADR R1,TEXT1 ADR R2,TEXT2 MOV R3, #0 LOOP LDRB R0,[R1], #1 ADD R3,R3,#1 CMP R0,#0 BNE LOOP SUB R1,R1,#2 LOOP1 LDRB R0,[R1], #-1 STRB R0,[R2], #1 SUB R3,R3, #1 CMP R3,#1 BNE LOOP1 MOV R5,#&55 NOP TEXT1 =“HELLO”,0 ALIGN TEXT2 =“OELLH” END 4.用调用子程序的方法实现1!+2!+3!+ (10) asmp.s AREA JC, CODE, READONL Y EXPORT JCP ENTRY JCP ADD R3, R0, #1 MOV R2, #1 MOV R1, #1 LOOP MUL R0, R1, R2 MOV R1, R0 ADD R2, R2, #1 CMP R2, R3 BNE LOOP NOP NOP MOV PC, LR END PROGC.c #include

ARM实验

汇编与 C 语言的相互调用 一.实验目的 阅读Embest Arm EduKit II 启动代码,观察处理器启动过程; 学会使用 Embest IDE 辅助信息窗口来分析判断调试过程和结果; 二.实验设备 硬件:PC 机。 软件:Embest IDE Pro 2004 集成开发环境,Windows 98/2000/NT/XP。 三.实验内容 使用汇编完成一个随机数产生函数,通过 C 语言调用该函数,产生一系列随机数,存放到数组里面。 四.实验原理 1. ARM过程调用ATPCS (ARM ),ATPCS 是一系列用于规定应用程序之间相互调用的基本规则,这此规则包括:①支持数据栈限制检查;②支持只读段位置无关(ROPI);③支持可读/写段位置无关(RWPI);④支持ARM 程序和Thumb 程序的混合使用;⑤处理浮点运算。使用以上规定的ATPCS 规则时,应用程序必须遵守如下: ①程序编写遵守ATPCS②变量传递以中间寄存器和数据栈完成;③汇编器使用-apcs 开关选项。 程序只要遵守ATPCS 相应规则,就可以使用不同的源代码编写程序。程序间的相互调用最主要的是解决参数传递问题。应用程序之间使用中间寄存器及数据栈来传递参数,其中,第一个到第四个参数使用 R0-R3,多于四个参数的使用数据栈进行传递。这样,接收参数的应用程序必须知道参数的个数但是,在应用程序被调用时,一般无从知道所传递参数的个数。不同语言编写的应用程序在调用时可以自定义参数传递的约定,使用具有一定意义的形式来传递,可以很好地解决参数个数的问题。常用的方法是把第一个或最后一个参数作为参数个数(包括个数本身)传递给应用程序。 ATPCS 中寄存器的对应关系

ARM实验报告

重庆交通大学信息科学与工程学院综合性设计性实验报告 专业:xxxxxxxxxxxx 学号:xxxxxxxx 姓名:xxxx 实验所属课程:ARM嵌入式系统 实验室(中心):信息技术软件实验室 指导教师:xxxxx 2014年12月

流水灯显示姓名及按键实验 一、实验目的 (1)了解μC/OS-II 操作系统的基本原理和移植条件。 (2)掌握流水灯的原理与应用,能改变流水灯状态,从初始状态开始。 (3)掌握LPC2200(for MagicARM2200)专用工程模板的使用,能够在MagicARM2200-S上运行基于μC/OS-II操作系统的程序。 二、实验设备 硬件:PC 机一台 MagicARM2200-S 教学实验开发平台一套 软件:Windows98/XP/2000 系统 ADS 1.2 集成开发环境μC/OS-II 操作系统(V2.52) 三、实验内容 学习移植μC/OS-II 操作系统到ARM7 处理器,然后编写一个简单的多任务应用程序,实现按键LED 流水灯控制。流水灯显示本人名字的ASCII码,每次按键LED变化一次;另一个任务用于控制蜂鸣器,蜂鸣器控制任务平时处于等待状态,当按键检测任务检测到有效按键输入时,立即唤醒蜂鸣器控制任务。 四、实验预习要求 (1)了解μC/OS-II 的组成和移植相关的文件内容。 (2)了解ARM7 体系结构及其汇编编程,了解LPC2000 系列ARM7 微控制器的硬件结构(如向量中断控制器和定时器等)和μC/OS-II 移植的相关说明。

(3)仔细阅读参考文献第5.7节的LPC2000管脚连接模块,第5.9节的GPIO;仔细阅读本书第1章的内容,了解MagicARM2200-S的硬件结构,注意蜂鸣器的控制电路及KEY1按键电路的说明;仔细阅读产品配套光盘附带文档《ADS集成开发环境及仿真器应用》或其它相关资料,了解ADS 1.2集成开发环境、LPC2200(for MagicARM2200)专用工程模板、EasyJTAG仿真器的应用;阅读参考文献[4]的第16章和第17章的内容,了解μC/OS-II操作系统的配置,系统的初始化,任务的建立,系统的启动等等。 五、实验原理 (1) μC/OS-II 概述 μC/OS-II 是一个完整的、可移植、可固化、可剪裁的占先式实时多任务内核。μC/OS-II是用ANSIC 语言编写,包含一小部分汇编代码,使之可以供不同架构的微处理器使用。 μC/OS-II 可以管理64 个任务,具有信号量、互斥信号量、事件标志组、消息邮箱、消息队列、任务管理、时间管理和内存块管理等系统功能。 μC/OS-II 软件体系结构如图3.1 所示,由图可以看出,μ C/OS-II 包括以下3 个部分: μC/OS-II 核心代码:包括10 个C 程序文件和1 个头文件,主要实现了系统调度、 任务管理、内存管理、信号量、消息邮箱和消息队列等系统功能。此部分的代码与处理器无关。 μC/OS-II 配置代码:包括2 个头文件,用于裁剪和配置μ

ARM嵌入式原理和开发实验报告

. 南京邮电大学海外学院 实验报告 实验名称: 实验一基于ADS开发环境的程序设计 实验二嵌入式Linux交叉开发环境的建立实验三嵌入式Linux环境下的程序设计 课程名称嵌入式系统与开发 班级学号 姓名 开课时间 2014/2015学年第1学期

实验一基于ADS开发环境的程序设计 一、实验目的 1、学习ADS开发环境的使用; 2、学习和掌握ADS环境下的汇编语言及C语言程序设计; 3、学习和掌握汇编语言及C语言的混合编程方法。 二、实验内容 1、编写和调试汇编语言程序; 2、编写和调试C语言程序; 3、编写和调试汇编语言及C语言的混合程序; 4、编写程序测试多寄存器传送指令的用法。 三、实验原理 ADS全称为ARM Developer Suite,是ARM公司推出的新一代ARM集成开发工具。现在常用的ADS版本是ADS1.2,它取代了早期的ADS1.1和ADS1.0。 ADS用于无操作系统的ARM系统开发,是对裸机(可理解成一个高级单片机)的开发。ADS具有极佳的测试环境和良好的侦错功能,它可使硬件开发工作者更深入地从底层去理解ARM处理器的工作原理和操作方法,为日后自行设计打基础,为BootLoader的编写和调试打基础。 1.ADS软件的组成 ADS由命令行开发工具、ARM运行时库、GUI开发环境(CodeWarrior和AXD)、实用程序、支持软件等组成。 2.GUI开发环境 ADS GUI开发环境包含CodeWarrior和AXD两种,其中Code Warrior是集成开发工具,而AXD是调试工具。 使用汇编语言进行编程简单、方便,适用于初始化硬件代码、启动代码等。 汇编语言具有一些相同的基本特征: 1.一条指令一行。 2.使用标号(label)给内存单元提供名称,从第一列开始书写。 3.指令必须从第二列或能区分标号的地方开始书写。 4.注释必须跟在指定的注释字符后面,一直书写到行尾。 在ARM汇编程序中,每个段必须以AREA作为段的开始,以碰到下一个AREA 作为该段的结束,段名必须唯一。程序的开始和结束需以ENTRY和END来标识。 嵌入式C语言设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则。ATPCS就是ARM程序和Thumb程序中子程序调用的基本规则。

相关主题
文本预览
相关文档 最新文档