ARM实验5_嵌入式C与汇编混合编程

昆明理工大学信息工程与自动化学院学生实验报告

(2011 —2012 学年第 1 学期)

课程名称:ARM嵌入式系统结构开课实验室:信自楼443 2012 年12月27日

一、实验目的

●掌握建立基本完整的ARM工程,包含启动代码,连接脚本等;

●阅读Embest S3CEV40启动代码,观察处理器启动过程;

●学会使用Embest IDE 辅助信息窗口来分析判断调试过程和结果;

●学会在Embest IDE环境中编写、编译与调试汇编和C语言相互调用的程序。

●掌握通过memory/register/watch/variable窗口分析判断结果。

二、实验原理

1. ARM异常向量表

当正常的程序执行流程挂起时,称之为异常。在处理异常之前,必须保存当前的处理器状态,以便从异常程序返回时可以继续执行当前的程序。ARM异常向量表如表2-2所示。

由上可见,复位(Reset)入口是整个程序的实际入口点。因此,编写代码时,第一条语句在0x00000000处开始执行。

2. ARM过程调用ATPCS(ARM)

ATPCS是一系列用于规定应用程序之间相互调用的基本规则。

程序只要遵守ATPCS相应规则,就可以使用不同的源代码来编写程序。程序间的相互调用最主要的是解决参数传递问题。应用程序之间使用中间寄存器及数据栈来传递参数,其中第1~4个参数使用R0~R3,多于4个参数的则使用数据栈进行传递。

用不同语言编写的应用程序在调用时可以自定义参数传递的约定。使用具有一定意义的形式来传递,可以很好地解决参数个数问题。常用方法是把第1个或最后1个参数(包括个数本身)传递给应用程序。

ATPCS中寄存器的对应关系如表2-3所列。

表2-3 ATPCS规则中寄存器列表

3. 链接脚本文件

所有的链接都是通过链接脚本来控制实现的。这些链接脚本文件使用链接命令语言编写。

链接脚本的最主要作用是描述我们编写的文件中这么多个部分应该如何的相应摆放在输出文件中,并控制存储区如何定位这些输出文件。同时,如果需要,我们还可以使用链接脚本文件实现其它功能。

大部分链接脚本文件都是很简单的。最简单的链接脚本只有一行命令:

SECTIONS。使用SECTIONS命令来告诉存储区应该如何摆放输出文件。

4.Embest IDE开发调试辅助窗口

使用Embest IDE嵌入式开发环境,用户可以使用源代码编辑窗口编写源文件程序。使用反汇编窗口观察程序代码的执行,使用Register窗口观察程序操作及CPU状态,使用外围寄存器窗口观察当前处理器的设置,使用Memory窗口观察内存单元使用情况,使用Watch 或Variables窗口观察程序变量,使用操作控制台执行特殊命令。加上调试状态下丰富的右键快捷菜单功能,用户可以使用IDE实现或发现任何一部分应用软件,修改任何一个开发或运行时的错误。

三、实验内容

1. 使用汇编完成一个随机数产生函数,通过C语言调用该函数,产生一系列随机数,存放到数组里面。

2. 下面是ARM的启动文件init.s及链接脚本文件ldscript的参考程序:

参考程序init.s:

#.arm

.global _start

.text

_start:

# 设置中断/异常向量

B Reset_Handler

Undefined_Handler: B Undefined_Handler

SWI_Handler: B SWI_Handler

Prefetch_Handler: B Prefetch_Handler

Abort_Handler: B Abort_Handler

NOP

IRQ_Handler: B IRQ_Handler

FIQ_Handler: B FIQ_Handler

Reset_Handler: LDR sp, =0x00002000

#----------------------------------------------------------------

#- Branch on C code Main function (with interworking)

#- Branch must be performed by an interworking call as either an ARM or Thumb #- main C function must be supported. This makes the code not position-

#- independant. A Branch with link would generate errors

#----------------------------------------------------------------

.extern __main

ldr r0, = __main

mov lr, pc

bx r0

#----------------------------------------------------------------

#- Loop for ever

#- End of application. Normally, never occur.

#- Could jump on Software Reset ( B 0x0 ).

#----------------------------------------------------------------

End: B End

.end

链接脚本文件ldscript:

SECTIONS

{

. = 0x0;

.text : { *(.text) }

.data : { *(.data) }

.rodata : { *(.rodata) }

.bss : { *(.bss) }

}

四、实验步骤:

1.创建新的工程,工程名为:explasm;

2.编写源代码文件并分别保存为randtest.c,init.s,random.s和ldscript,并加入工程

里;

3.按照编译、汇编器配置->链接器配置->调试器配置设置新工程;并编译链接工程;

4.选择Debug菜单Remote Connect 进行连接软件仿真器,执行Download命令下载程序,

并打开寄存器窗口。

5.下载调试文件,打开memory/register/watch/variable/call stack窗口,单步执行程序,

并通过以上窗口,跟踪程序运行,观察分析运行结果,通过实验学会使用Embest IDE进行应用程序的开发与调试。

/********************************* Init.s*****************************/

# *******************************************************

# * NAME : 44BINIT.S *

# * Version : 10.April.2000 *

# * Description: *

# * C start up codes *

# * Configure memory, Initialize ISR ,stacks *

# * Initialize C-variables *

# * Fill zeros into zero-initialized C-variables *

# *******************************************************

#程序入口,arm汇编

#.arm

.global _start

.text

_start:

# --- Setup interrupt / exception vectors

B Reset_Handler

Undefined_Handler:

B Undefined_Handler

SWI_Handler:

B SWI_Handler

Prefetch_Handler:

B Prefetch_Handler

Abort_Handler:

B Abort_Handler

NOP /* Reserved vector */

IRQ_Handler:

B IRQ_Handler

FIQ_Handler:

B FIQ_Handler

Reset_Handler:

LDR sp, =0x00002000

#------------------------------------------------------------------------------ #- Branch on C code Main function (with interworking)

#----------------------------------------------------

#- Branch must be performed by an interworking call as either an ARM or Thumb #- main C function must be supported. This makes the code not position-

#- independant. A Branch with link would generate errors

#------------------------------------------------------------------------------ .extern main

ldr r0, = main

mov lr, pc

bx r0

#------------------------------------------------------------------------------ #- Loop for ever

#---------------

#- End of application. Normally, never occur.

#- Could jump on Software Reset ( B 0x0 ).

#------------------------------------------------------------------------------ End:

b End

.global __gccmain

__gccmain:

mov pc, lr

.end

/***********************************Ldscript*****************************/ SECTIONS

{

. = 0x0;

.text : { *(.text) }

.data : { *(.data) }

.rodata : { *(.rodata) }

.bss : { *(.bss) }

}

/***********************************random.s*****************************/ # Random number generator

#

# This uses a 33-bit feedback shift register to generate a pseudo-randomly # ordered sequence of numbers which repeats in a cycle of length 2^33 - 1 # NOTE: randomseed should not be set to 0, otherwise a zero will be generated # continuously (not particularly random!).

#

# This is a good application of direct ARM assembler, because the 33-bit

# shift register can be implemented using RRX (which uses reg + carry).

# An ANSI C version would be less efficient as the compiler would not use RRX.

# AREA |Random$$code|, CODE, READONLY

.GLOBAL randomnumber

randomnumber:

# on exit:

# a1 = low 32-bits of pseudo-random number

# a2 = high bit (if you want to know it)

LDR ip, seedpointer

LDMIA ip, {a1, a2}

TST a2, a2, LSR#1 /* to bit into carry */

MOVS a3, a1, RRX /* 33-bit rotate right */

ADC a2, a2, a2 /* carry into LSB of a2 */

EOR a3, a3, a1, LSL#12 /* (involved!) */

EOR a1, a3, a3, LSR#20 /* (similarly involved!)*/

STMIA ip, {a1, a2}

MOV pc, lr

seedpointer:

.LONG seed

.DATA

.GLOBAL seed

seed:

.LONG 0x55555555

.LONG 0x55555555

# END

/*********************************randtest.c*****************************/ /* Random number generator demo program

Calls assembler function 'randomnumber' defined in random.s

*/

//#include

/* this function prototype is needed because 'randomnumber' is external */ extern unsigned int randomnumber( void );

int main()

{

int i;

int nTemp;

unsigned int random[10];

for( i = 0; i < 10; i++ )

{

nTemp = randomnumber();

random[i] = nTemp;

}

return( 0 );

}

五、思考题:

从汇编语言中调用C函数:使用C语言完成一个随机数产生函数,通过汇编语言调用该函数,产生一系列随机数,存放到数组里面。

/*******************************Random.c*********************************/

int random()

{

int i;

int nTemp;

unsigned int random[10];

for( i = 0; i < 10; i++ )

{

nTemp = randomnumber();

random[i] = nTemp;

}

return( 0 );

}

/********************************* Init.s*****************************/

# *******************************************************

# * NAME : 44BINIT.S *

# * Version : 10.April.2000 *

# * Description: *

# * C start up codes *

# * Configure memory, Initialize ISR ,stacks *

# * Initialize C-variables *

# * Fill zeros into zero-initialized C-variables *

# *******************************************************

#程序入口,arm汇编

#.arm

.global _start

.text

_start:

# --- Setup interrupt / exception vectors

B Reset_Handler

Undefined_Handler:

B Undefined_Handler

SWI_Handler:

B SWI_Handler

Prefetch_Handler:

B Prefetch_Handler

Abort_Handler:

B Abort_Handler

NOP /* Reserved vector */

IRQ_Handler:

B IRQ_Handler

FIQ_Handler:

B FIQ_Handler

Reset_Handler:

LDR sp, =0x00002000

#------------------------------------------------------------------------------ #- Branch on C code Main function (with interworking)

#----------------------------------------------------

#- Branch must be performed by an interworking call as either an ARM or Thumb #- main C function must be supported. This makes the code not position-

#- independant. A Branch with link would generate errors

#------------------------------------------------------------------------------ .extern random @申明一个random外部函数,调用它

ldr r0, = random

mov lr, pc

bl random @调用random函数

#------------------------------------------------------------------------------ #- Loop for ever

#---------------

#- End of application. Normally, never occur.

#- Could jump on Software Reset ( B 0x0 ).

#------------------------------------------------------------------------------ End:

b End

.global __gccrandom

__gccrandom:

mov pc, lr

.end

/***********************************Ldscript*****************************/ SECTIONS

{

. = 0x0;

.text : { *(.text) }

.data : { *(.data) }

.rodata : { *(.rodata) }

.bss : { *(.bss) }

}

/***********************************randtest.s***************************/ # Random number generator

#

# This uses a 33-bit feedback shift register to generate a pseudo-randomly # ordered sequence of numbers which repeats in a cycle of length 2^33 - 1 # NOTE: randomseed should not be set to 0, otherwise a zero will be generated # continuously (not particularly random!).

#

# This is a good application of direct ARM assembler, because the 33-bit # shift register can be implemented using RRX (which uses reg + carry).

# An ANSI C version would be less efficient as the compiler would not use RRX.

# AREA |Random$$code|, CODE, READONLY

.GLOBAL randomnumber

randomnumber:

# on exit:

# a1 = low 32-bits of pseudo-random number

# a2 = high bit (if you want to know it)

LDR ip, seedpointer

LDMIA ip, {a1, a2}

TST a2, a2, LSR#1 /* to bit into carry */

MOVS a3, a1, RRX /* 33-bit rotate right */

ADC a2, a2, a2 /* carry into LSB of a2 */

EOR a3, a3, a1, LSL#12 /* (involved!) */

EOR a1, a3, a3, LSR#20 /* (similarly involved!)*/

STMIA ip, {a1, a2}

MOV pc, lr

seedpointer:

.LONG seed

.DATA

.GLOBAL seed

seed:

.LONG 0x55555555

.LONG 0x55555555

# END

六、实验总结

通过实验我们能够得到,在实验中通过C调用汇编程序;还是汇编程序调用C,其结果都是相同的。这两种编程方式都能达到我们期望中的实验效果,所以都是可取的编程方法。在这次实验中,要注意的是:我们所编写的程序是分为几个部分,在运行时,需要将其分开引入到一个工程中,使它们之间形成调用关系。同时在引进文件是需要选择所有文件类型,这与我们前边所执行程序时有所不同。同时,在实验中我学会了很多,也对软件有了更进一步的了解和认识。总的来说这次实验还是有所收获吧。

5_ARM实验报告

实验五数码管显示实验 实验目的:通过实验掌握 LED 的显示控制方法; 掌握对存储区进行访问的方法。 一.实验内容: 编写程序使实验板上八段数码管循环显示0到9字符。 二.实验原理: 1.八段数码管的结构 八段数码管由八个发光二极管组成,其中七个长条形的发光管排列成“日”字形,右下角一个点形的发光管作为显示小数点用,八段数码管能显示所有数字及部份英文字母。见图5-1-2。 图5-1-2 八段数码管的结构 2八段数码管的硬件电路原理 EMBEST ARM EDUKIT II教学电路中,使用的是共阳极八段数码管,数码管的控制通过芯片ZLG7290 控制,各段的控制信号是芯片ZLG7290 的SEGA ~SEG G 引脚控制,需要显示的段码通过IIC 总线传送到该芯片。如图5-1-1、图5-1-2、图5-1-3所示。 图5-1-1 八段数码管控制电路

图5-1-2 八段数码管控制电路 3.八段数码管的类型 八段数码管有两种不同的形式:一种是八个发光二极管的阳极都连在一起的,称之为共阳极八段数码管;另一种是八个发光二极管的阴极都连在一起的,称之为共阴极八段数码管。 工作原理 以共阳极八段数码管为例,当控制某段发光二极管的信号为低电平时,对应的发光二极点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮;共阴极二极管则相反,制信号为高电平时点亮。 电平信号按照dp→g→f→e……a的顺序组合形成的数据字称为该字符对应的段码,常用字的段码表如下: 4. 八段数码管的显示方式有两种,分别是静态显示和动态显示。 静态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管控制信号一直保持有效。 动态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管是轮流点亮的,即控制信号按一定周期有效,在轮流点亮的过程中,点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二

arm中c嵌入汇编

ARM中C和汇编混合编程及示例 原文链接:https://www.360docs.net/doc/5f19338714.html,/article/detail.asp?id=4145 在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的。在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较好,便于人的理解,而且有大量的支持库。尽管如此,很多地方还是要用到汇编语言,例如开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,主频的设定,以及RAM的控制参数及初始化,一些中断处理方面也可能涉及汇编。另外一个使用汇编的地方就是一些对性能非常敏感的代码块,这是不能依靠C 编译器的生成代码,而要手工编写汇编,达到优化的目的。而且,汇编语言是和CPU的指令集紧密相连的,作为涉及底层的嵌入式系统开发,熟练对应汇编语言的使用也是必须的。 单纯的C或者汇编编程请参考相关的书籍或者手册,这里主要讨论C和汇编的混合编程,包括相互之间的函数调用。下面分四种情况来进行讨论,暂不涉及C++。 1.在C语言中内嵌汇编 在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过其使用与汇编文件中的指令有些不同,存在一些限制,主要有下面几个方面: a. 不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令 b. 在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突 c. R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0到R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器 d. 一般不要直接指定物理寄存器,而让编译器进行分配 内嵌汇编使用的标记是__asm或者asm关键字,用法如下: __asm { instruction [; instruction] … [instruction] } asm(“instruction [; instruction]”); 下面通过一个例子来说明如何在C中内嵌汇编语言, #include

C语言与汇编语言混合编程_32位嵌入式共6页word资料

实验二C语言与汇编语言混合编程 一、实验目的 1.掌握ARM嵌入式C语言编程基本方法。 2. 掌握嵌入式汇编(Inline Assembly)编程规则和方法。 3.掌握汇编语言程序和C语言程序之间相互调用规则和编程方法。 二、实验步骤 1. 创建工作空间并且添加工程。 2.编写程序并且利用软件仿真查看结果。 三、实验内容 1.利用汇编语言编写初始化程序,实现管理模式下堆栈指针初始化, 并最终跳转到C语言程序开始Main函数处执行。 2.利用汇编语言编写子程序实现字符串拷贝功能,利用C语言在 Main函数中定义字符串“Hello World!”定义并调用该子程序完成字符串拷贝。 3.利用汇编语言编写子程序完成冒泡法排序,利用C语言在Main 函数中定义字符串“Hello World!”定义并调用该子程序将数组中字符按照ASCII码值由小到大重新排序。 思考: 1.GNU编译环境下混合编程与ADS环境下有些什么区别? .global _start .global str_cpy .text

_start: BIC R0,R0,#MODEMASK @将CPSR中的模式位 ORR R1,R0,#FIQMODE @设置模式位为FIQ模式 MSR CPSR_c, R1 @切换处理器到FIQ模式 LDR SP,=FIQStack @设置该模式下的堆栈 BIC R0,R0,#MODEMASK @将CPSR中的模式位 ORR R1,R0,#IRQMODE @设置模式位为IRQ MSR CPSR_c, R1 @切换处理器到IRQ模式 LDR SP,=IRQStack @设置该模式下的堆栈 BIC R0,R0,#MODEMASK @将CPSR中的模式位 ORR R1,R0,#USRMODE @设置模式位为IRQ MSR CPSR_c, R1 @切换处理器到IRQ模式 LDR SP,=IRQStack @设置该模式下的堆栈 BL Main B . .equ FIQMODE,0x11 .equ IRQMODE,0x12 .equ SVCMODE,0x13 .equ USRMODE,0x10 .equ SVCStack,0x03FE0100 .equ FIQStack,0x03FE0200 .equ IRQStack,0x03FE0300

ARM实验5_嵌入式C与汇编混合编程

昆明理工大学信息工程与自动化学院学生实验报告 (2011 —2012 学年第 1 学期) 课程名称:ARM嵌入式系统结构开课实验室:信自楼443 2012 年12月27日 一、实验目的 ●掌握建立基本完整的ARM工程,包含启动代码,连接脚本等; ●阅读Embest S3CEV40启动代码,观察处理器启动过程; ●学会使用Embest IDE 辅助信息窗口来分析判断调试过程和结果; ●学会在Embest IDE环境中编写、编译与调试汇编和C语言相互调用的程序。 ●掌握通过memory/register/watch/variable窗口分析判断结果。 二、实验原理 1. ARM异常向量表 当正常的程序执行流程挂起时,称之为异常。在处理异常之前,必须保存当前的处理器状态,以便从异常程序返回时可以继续执行当前的程序。ARM异常向量表如表2-2所示。 由上可见,复位(Reset)入口是整个程序的实际入口点。因此,编写代码时,第一条语句在0x00000000处开始执行。 2. ARM过程调用ATPCS(ARM) ATPCS是一系列用于规定应用程序之间相互调用的基本规则。 程序只要遵守ATPCS相应规则,就可以使用不同的源代码来编写程序。程序间的相互调用最主要的是解决参数传递问题。应用程序之间使用中间寄存器及数据栈来传递参数,其中第1~4个参数使用R0~R3,多于4个参数的则使用数据栈进行传递。 用不同语言编写的应用程序在调用时可以自定义参数传递的约定。使用具有一定意义的形式来传递,可以很好地解决参数个数问题。常用方法是把第1个或最后1个参数(包括个数本身)传递给应用程序。 ATPCS中寄存器的对应关系如表2-3所列。 表2-3 ATPCS规则中寄存器列表

(完整word版)keil C语言与汇编语言混合编程

keil C语言与汇编语言混合编程 1. C语言中嵌入汇编 1、在C 文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM; Assembler Code Here #pragma ENDASM 2、在Project 窗口中包含汇编代码的C 文件上右键,选择“Options for ...”,点击右边的“Generate Assem bler SRC File”和“Assemble SRC File”,使检查框由灰色变成黑色(有效)状态; 3、根据选择的编译模式,把相应的库文件(如Small 模式时,是Keil\C51\Lib\C51S.Lib)加入工程中, 该文件必须作为工程的最后文件; 4、编译,即可生成目标代码。 来个实例吧: #i nclude void main(void) { P2=1; #pragma asm MOV R7,#10 DEL:MOV R6,#20 DJNZ R6,$ DJNZ R7,DEL #pragma endasm P2=0; } 2 . 无参数传递的函数调用 C51调用汇编函数 1.无参数传递的函数调用 先来个例子:其中example.c和example.a51为项目中的两个文件

***********************example.c*********************************************** extern void delay100(); main() {delay100;} ***********************example.a51*********************************************** ?PR?DELAY100 SEGMENT CODE; // 在程序存储区中定义段 PUBLIC DELAY100; //声明函数 RSEG ?PR?DELAY100; //函数可被连接器放置在任何地方 DELAY100: MOV R7,#10 DEL: MOV R6,#20 DJNZ R6,$ DJNZ R7,DEL RET END 在example.c文件中,先声明外部函数,然后直接在main中调用即可。 在example.a51中, ?PR?DELAY100 SEGMENT CODE; 作用是在程序存储区中定义段,DELAY100为段名,?PR?表示段位于程序存储区内 PUBLIC DELAY100; 作用是声明函数为公共函数 RSEG ?PR?DELAY100; 表示函数可被连接器放置在任何地方,RSEG是段名的属性 段名的开头为PR,是为了和C51内部命名转换兼容,命名转换规律如下: CODE -?PR? XDATA-?XD DATA-?DT BIT-?BI PDATA-?PD 3. 有参数传递的函数调用 记住哦,c文件和A51文件不能使用同一个文件名,不过我还不知道为什么会这样,有高手知道得话请告知。 今天说说带参数传递的函数调用,在C51和汇编之间传递参数的方式有两种,一种是通过寄存器传递参数,C51中不同类型的实参会存入相应的寄存器,在汇编中只需对相应寄存器进行操作,即达到传递参数的目的。 不同类型的数据及其传递参数的寄存器如下表所示: 在C和汇编混合编程的时候,存在C语言和汇编语言的变量以及函数的接口问题。

ARM体系结构实验5 ARM汇编程序设计实验报告

实验目的和要求 1.掌握ARM伪指令和伪操作 2.掌握结构化程序的设计 3.掌握各种调试方法 实验内容与分析设计 1.练习教材P334 7.6的实验。(此操作可以不写在实验报告中) 2.已知有32位数X存放在存储器的地址0x90010中,要求实现:若X大于0,则Y=1;若X=0,则Y=0;否则,Y=-1.其中Y的值存放在0X90014中。 3.编写一个汇编程序,要求求两个数组DATA1和DA TA2对应的数据之和,并把和存储在新数组SUM中,即实现SUM[i]=DATA1[i]+DATA2[i]. 实验步骤与调试过程 实验1: 1.启动MDK开发环境,建立工程test6,分别编辑汇编源程序文件为test1.s,test 2.s,test 3.s; 2.编译并链接程序test1.s,使用寄存器观察器,同时将程序反汇编格式显示出来,运用单步执行方式调试程序test1.s; 3.编译并链接程序test2.s,使用寄存器观察器,运用单步执行方式调试程序; 4.编译并链接程序test3.s,使用寄存器观察器,运用单步执行方式调试程序。 实验2: 1.启动MDK开发环境,建立工程test,编辑汇编源程序文件test.s; 2.编译并链接程序test.s,运用单步执行方式调试程序。 实验3: 1.启动MDK开发环境,建立工程test,编辑汇编源程序文件test.s; 2.编译并链接程序test.s,运用单步执行方式调试程序。 实验结果 由于电脑问题,没有截图,但是工程及程序完整,望老师见谅。 主要算法和程序清单 实验1(部分代码): test1.s preserve8

area reset,code,readonly entry code32 mov r0,#1 b start data1 dcb "strin" align 4 start bl func1 bl func2 b start func1 ldr r0,=start ldr r1,=darea+12 ldr r2,=darea+400 mov pc,lr ltorg func2 ldr r3,=darea+60 ldr r4,=darea+6004 mov pc,lr darea space 4000 end 实验2: AREA Exam,CODE,READONL Y ENTRY START LDR R1,=0x90010 LDR R2,[R1] CMP R2,#0 BEQ ZERO BGT PLUS MOV R0,#-1 B FINISH LPUS MOV R0,#1 B FINISH ZERO MOV R0,#0 FINISH STR R0,[R1] END 实验3: AREA BlockData,DA TA,READWRITE DA TA1 DCD 2,5,0,3,-4,5,0,10,9

常用ARM及汇编指令

用ARM指令及汇编包括 (2) 指令集介绍 (7) ARM数据处理指令包括 (12) ARM伪指令介绍 (18) ARM汇编程序设计及一些格式要求说明 (25)

用ARM指令及汇编包括 1、ARM处理器寻址方式 2、指令集介绍 3、伪指令 4、ARM汇编程序设计 5、C与汇编混合编程

ARM处理器寻址方式 1、寄存器寻址:操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作 MOV R1, R2;R2->R1 SUB R0, R1,R2;R1-R2 ->R0 2、立即寻址:立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令就取出了可以立即使用的操作数SUBS R0,R0,#1;R0-1 -> R0 MOV R0,#0xff00;0xff00 -> R0 注:立即数要以"#"为前缀,表示16进制数值时以"0x"表示 3、寄存器偏移寻址:是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第2个寄存器操作数在与第1个操作数结合之前选择进行移位操作 MOV R0,R2,LSL #3;R2的值左移3位,结果存入R0,即R0 = R2 * 8 ANDS R1,R1,R2,LSL R3;R2的值左移R3位,然后和R1相与操作,结果放入R1 寄存器偏移寻址可采用的移位操作如下

(1)、LSL(Logical Shift Left)逻辑左移,寄存器中字的低端空出补0 (2)、LSR(Logical Shift Right)逻辑右移,寄存器中字的高端空出补0 (3)、ASR(Arthmetic Shift Right)算术右移,移位中保持符号位不变,即如果源操作数为正数,字高端空出补0,否则补1 (4)、ROR(Rotate Right)循环右移,由字的低端移出的位填入高端空出的位 (5)、RRX(Rotate Right eXtended by 1 place),操作数右移一位,左侧空位由CPSR的C填充 4、寄存器间接寻址:寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针 LDR R1,[R2];将R2中的数值作为地址,取出此地址中的数据保存在R1中 SWP R1,R1,[R2] ;将R2中的数值作为地址,取出此地址中的数值与R1中的值交换 5、基址寻址:将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器访问等。 LDR R2,[R3,#0x0F];将R3的数值加0x0F作为地址,取出此地址的数值保存在R2中 STR R1,[R0,#-2];将R0中的数值减2作为地址,把R1中的内容保

嵌入式系统ARM实验报告

南京邮电大学通信与信息工程学院 实验报告 实验名称:实验一基于ADS开发环境的设计 实验二嵌入式Linux交叉开发环境的建立 实验三嵌入式Linux环境下的程序设计 课程名称嵌入式系统B 班级学号B******** 姓名马俊民 开课时间2015/2016学年第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来标识。

基于ARM的C语言程序设计

基于ARM的C语言程序设计 一、实验目的 1.了解armc语言的基本框架,学会使用arm的c语言编程 二、实验设备 1.el-arm-830教学实验箱,pentiumii以上的pc机,仿真器电缆。 2.pc操作系统win98或win2000或winxp,armsdt2.5或ads1.2内置研发环境, 仿真器驱动程序 三、armc语言概述与采用规则 1.arm使用c语言编程是大势所趋 在应用领域系统的程序设计中,若所有的编程任务均由汇编语言去顺利完成,其工作 量非常大,并且不必移殖。由于arm的程序执行速度较低,存储器的存储速度和存储量也 很高,因此,c语言的特点充分发挥,使应用程序的研发时间大为延长,代码的移殖十分 便利,程序的重复使用率提升,程序架构准确易懂,管理较为难等等。因此,c语言的在arm编程中具备关键地位。 2.armc语言程序的基本规则 在arm程序的研发中,须要大量读取硬件寄存器,并且尽量延长程序的继续执行时间 的代码通常采用汇编语言去撰写,比如说arm的启动代码,arm的操作系统的移殖代码等,除此之外,绝大多数代码可以采用c语言去顺利完成。 c语言使用的是标准的c语言,arm的开发环境实际上就是嵌入了一个c语言的集成 开发环境,只不过这个开发环境和arm的硬件紧密相关。 在采用c语言时,必须使用和汇编语言的混合编程。当编订代码较为简约,则可以采 用轻易嵌入编订的方法,否则,采用将编订文件以文件的形式重新加入项目当中,通过atpcs的规定与c程序相互调用与出访。 atpcs,就是arm、thumb的过程调用标准(arm/thumbprocedurecallstandard),它 规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传 递规则等。 在c程序和arm的汇编程序之间相互调用必须严格遵守atpcs。而采用ads的c语言 编译器编程的c语言子程序满足用户选定的atpcs的规则。但是,对于汇编语言来说,全 然必须倚赖用户确保各个子程序遵从atpcs的规则。具体来说,汇编语言的子程序应当满 足用户下面3个条件:

嵌入式实验报告

实验一 ARM汇编语言程序设计 一、实验目的 1.了解IAR Embedded Workbench 集成开发环境 2.掌握ARM汇编指令程序的设计及调试 二、实验设备 1.PC操作系统WIN98或WIN2000或WINXP,ADSI.2集成开发环境,仿 真驱动程序 三、实验内容 1.熟悉IAR Embedded Workbench 集成开发环境 2.理解下列程序,新建工程,加入下面的程序,并观察实验结果,解释 程序实现的功能 分析:该程序实现的功能是程序功能:Y = A*B+C*D+E*F 程序代码: AREA Examl, CODE,READONLY ;定义一个代码段 ENTRY ;程序入口 MOV R0,#0;设置R0寄存器的值为0 MOV R8,#0;设置R8寄存器的值为0 ADR R2,N;将R2寄存器的值设为数据域N的地址 LDR R1,[R2];将以R2的值为地址的数据读入R1 MOV R2,#0;设置R2的值为0 ADR R3,C; 将R3寄存器的值设为数据域C的地址 ADR R5,X; 将R5寄存器的值设为数据域X的地址 LOOP LDR R4,[R3,R8];将R3+R8的数据读入R4 LDR R6,[R5,R8];将R5+R8的数据读入R6 MUL R9,R4,R6;R9 = R4*R6 ADD R2,R2,R9;R2 = R2+R9 ADD R8,R8,#4;R8 = R8+4 ADD R0,R0,#1;R0 = R0+1 CMP R0,R1;比较R0和R1的值 BLT LOOP;R0

c语言和汇编语言混合编程

c语言和汇编语言混合编程 一、混合编程的概念 混合编程是指在一个项目中同时使用C语言和汇编语言来进行编程的方式。C语言作为高级语言,具有易读易写的特点,适合用来进行程序的框架设计和算法实现;而汇编语言作为底层语言,可以直接操作计算机的硬件资源,提供了更高的灵活性和效率。 二、混合编程的使用场景 1.优化性能:C语言的执行效率相对较高,但在某些特殊的场景下,需要通过使用汇编语言来对关键代码进行优化,以提升程序的性能。 2.访问底层硬件资源:汇编语言可以直接对计算机的硬件资源进行操作,如访问特定的芯片、寄存器等,从而实现对硬件资源的更直接的控制。 3.特殊算法实现:某些算法的实现需要使用到特定的汇编指令集,通过混合编程的方式可以在C语言的框架下使用汇编语言来实现这些特殊算法。 4.系统级编程:在操作系统、驱动程序等领域,混合编程可以更好地利用C语言的高级特性,同时结合汇编语言的底层操作能力,实现对系统资源的更加细致控制。 三、混合编程的优势 1.灵活性:混合编程可以充分发挥C语言的灵活性,利用其高级特

性来进行程序的框架设计和算法实现,同时结合汇编语言的底层操作能力,实现对硬件资源的更加细致控制。 2.效率:通过使用汇编语言对关键代码进行优化,可以提高程序的执行效率,尤其在对计算量较大的算法进行优化时,混合编程可以发挥出更大的优势。 3.可移植性:C语言作为一种通用的高级语言,具有良好的可移植性,而汇编语言的编写通常与具体的硬件平台相关,因此,在混合编程中,可以通过将汇编代码与C代码分离,实现对不同平台的兼容性。 四、混合编程的实际应用案例 1.图像处理:在图像处理领域,混合编程可以利用C语言的框架设计和算法实现特定的图像处理算法,同时通过汇编语言来实现对图像像素的高效访问和处理。 2.密码学:在密码学领域,混合编程可以结合C语言的高级特性和汇编语言的底层操作能力,实现对密码算法的高效实现。 3.嵌入式系统开发:在嵌入式系统开发中,混合编程可以通过使用C语言进行系统框架设计和驱动程序开发,同时利用汇编语言来对底层硬件资源进行直接访问和控制,提高系统的性能和稳定性。 4.游戏开发:在游戏开发领域,混合编程可以通过使用C语言进行游戏逻辑的设计和实现,同时利用汇编语言来对关键代码进行优化,提高游戏的运行效率和用户体验。

5_ARM实验报告

5_ARM实验报告 [实验报告] 实验名称:5_ARM实验 实验目的: 1.了解ARM架构的特点和基本原理; 2.掌握ARM指令集和编程模式; 3.学会使用ARM开发工具进行编程和调试; 4.实现一个简单的ARM程序并运行。 实验器材: 1.ARM开发板; 2.电脑; https://www.360docs.net/doc/5f19338714.html,B数据线。 实验步骤: 1.搭建开发环境 根据实验指导书的步骤,将开发板与电脑连接,安装开发工具和驱动程序。 2.学习ARM指令集和编程模式 通过阅读教材和参考资料,了解ARM指令集的基本原理和常用指令。同时,学习ARM的编程模式,包括程序的加载、运行和调试等。

3.编写ARM程序 根据实验要求,编写一个简单的ARM程序。这个程序可以是一个简单的计算器,或者是一个LED灯的控制程序等。编写程序时需要注意使用合适的指令和编程模式。 4.编译和烧录程序 使用ARM开发工具,将编写好的程序进行编译和烧录。编译过程会生成一个可执行的二进制文件,烧录过程会将这个二进制文件加载到开发板上。 5.调试并运行程序 通过ARM开发工具进行调试,检查程序中可能存在的错误,并进行修正。调试过程中需要注意程序的执行流程和变量的值等。调试完成后,运行程序并观察其运行结果。 实验结果与分析: 在实验中,我成功地搭建了ARM的开发环境,学习了ARM指令集和编程模式,并编写了一个简单的ARM程序。经过编译和烧录,我成功地将程序加载到开发板上,并通过调试和运行,验证了程序的正确性。 实验中遇到的问题和解决方法: 在编写程序的过程中,我遇到了一些语法错误和逻辑问题。通过阅读资料、查找文档和与同学的讨论,我解决了这些问题。在调试的过程中,我还遇到了一些程序运行速度过慢的问题。通过优化代码和使用合适的编译选项,我解决了这个问题。 实验总结:

混合编程

C语言和汇编语言混合编程的必要性: C语言是目前非常流行的一种编程语言,具有高级语言使用方便灵活、数据处理能力强、编程简单等优点,还可以使用BIOS和DOS的终端功能调用,实现汇编语言的大部分功能。但如果在直接对硬件进行操作、生成的目标代码质量较高等情况时,却显示出来明显的不足,而汇编语言作为一种符号语言,没有高级语言要占用较大的存储空间和较长的运行时间等缺点,具有代码短,占用少,运行快,并能对硬件直接操作等优点,这些都是高级语言无法比拟的。所以在诸如对硬件的直接操作、中断处理、快速执行等场合时,使用C语言与汇编语言混合编程,两种语言的程序相互调用,进行参数传递,共享数据结构及数据信息,能充分发挥各自的优势,有效结合,扬长避短。 C语言和汇编语言混合编程基本方法及举例: (一)在C和C++代码中内联汇编 内联汇编主要用于如下场合:1.使用汇编语言写函数;2.对速度要求非常高的代码;3.设备驱动程序中直接访问硬件;4."Naked" Call的初始化和结束代码。 在Visual C++使用内联汇编用到的是__asm关键字,这个关键字有两种使用方法: 1.简单__asm块 __asm { MOV AL, 2 MOV DX, 0XD007 OUT AL, DX } 2.在每条汇编指令之前加__asm关键字 __asm MOV AL, 2 __asm MOV DX, 0xD007 __asm OUT AL, DX (二)使用C、C++程序调用汇编程序 C程序调用汇编程序(调用汇编的C 函数): #include extern void strcopy(char *d,const char *s); //声明外部函数,即要调用的汇编子程序 int main(void) { const char *srcstr=“First string-source”; char dstsrt[] =“Second string-destination”; printf(“Before copying:\n”);

arm汇编编程

a r m汇编编程(示例)(共49页) --本页仅作为文档封面,使用时请直接删除即可-- --内页可以根据需求调整合适字体及大小--

一、arm的认知及基本概念 (一).arm的基本概念 1. 什么是arm arm是一家英国电子公司的名字,全名是Advanced RISC Machine 这家企业设计了大量高性能、廉价、耗能低的RISC(精简指令集)处理器,ARM公司只设计芯片而不生产,它将 技术授权给世界上许多公司和厂商。目前采用arm技术知识产权内核的微处理器,即通常所说的arm微处理器 所以arm也是对一类微处理器的通称。 arm指令集体系版本号(软件)为V1 ~ V7 目前V1 ~ V3已很少见。从V4版不再与以前的版本兼容。 arm的CPU系列(硬件)主要有 ARM7 ~ ARM11 2. 典型的嵌入式处理器 arm 占市场% ARM mips 占市场% MIPS microSPARC 占市场% SUN PowerPc 占市场% IBM 其它占市场% 3. arm的应用范围: 工业控制:如机床、自动控制等 无线通信:如手机 网络应用:如 电子产品:如音视频播放噐、机顶盒、游戏机、数码相机、打印机 其它各领域:如军事、医疗、机器人、智能家居等 4.计算机体系结构 见图:冯.诺依曼计算机体系图 冯.诺依曼体系结构 处理器使用同一个存储器,经由同一个总线传输 完成一条指令需要3个步骤:即取指令->指令译码->执行指令 指令和数据共享同一总线的结构 哈佛体系结构 将程序指令存储和数据存储分开 中央处理器首先到程序指令存储器中读取程序指令。解码后到数据地址,再到相应的数据存储器读取数据,然后执行指令 程序指令存储与数据存储分开,可以使指令和数据有不同的数据宽度。 5.复杂指令集与精简指令集

ARM嵌入式系统结构与编程习题答案 清华大学出版社 最详细版

ARM嵌入式系统结构与编程习题答案清华大学出版社最详细版 arm嵌入式系统结构与编程习题答案清华大学出版社最详细版 一 《arm嵌入式系统结构与编程》习题答案 第一章为绪论 1.国内嵌入式系统行业对“嵌入式系统”的定义是什么?如何理解? 答:国内嵌入式行业普遍接受的定义是:以应用为中心,以计算机技术为基础,软硬 件可定制,满足应用系统在功能、可靠性、成本、体积和功耗等方面的严格要求的专业计 算机系统。从这个定义可以看出,嵌入式系统与应用紧密结合,具有很强的特殊性。它必 须根据实际系统需求进行合理定制和使用。因此,嵌入式系统是“为特定的人定制的”。 2.嵌入式系统是从何时产生的,简述其发展历程。答:从20世纪70年代单片机的 出现到目前各式各样的嵌入式微处理器,微控制器的大规模应用,嵌入式系统已经有了30多年的发展历史。 嵌入式系统的出现最初是基于单片机的。英特尔于1971年开发了第一款4位总线结 构的微处理器4004,可以说是嵌入式系统的雏形。80年代初的8051是单片机历史上值得 纪念的一页。20世纪80年代初,出现了一种商业化的“实时操作系统内核”。在实时内 核下编写应用软件,可以加快新产品的开发速度,节约资金。在20世纪90年代,实时内 核发展为实时多任务操作系统。进入21世纪以来,嵌入式系统得到了极大的发展。在硬 件方面,单片机的性能有了很大的提高,尤其是ARM技术的出现和改进,为嵌入式操作系 统提供了强大的硬件载体,将嵌入式系统推向了一个新的阶段。 3.当前最常用的源码开放的嵌入式操作系统有哪些,请举出两例,并分析其特点。答:主要有嵌入式linux和嵌入式实时操作内核uc/os-ii 嵌入式Linux操作系统是一种针对嵌入式微控制器的特点而定制的Linux操作系统, 包括通用的嵌入式通信协议和通用驱动程序,并支持多种文件系统。它主要具有以下特点:开源、易移植、内核小、功能强大、运行稳定、效率高。 uc/os是源码工卡的实时嵌入式系统内核,主要有以下特点:源码公开,可移植性强,可固化,可剪裁,占先式,多任务,可确定性,提供系统服务等。 4.说明嵌入式设备在工业控制设备中的应用。答:由于工业控制系统强调可靠性和实 时性,“量身定做”的嵌入式控制系统可以满足工业控制的需要。例如:工业过程控制、 数字控制、机床、电网设备监控、电力自动控制系统、石化监控等。 5.嵌入式技术的发展趋势有哪些?

汇编语言与c语言混合编程

汇编语言与c语言混合编程 汇编语言与C语言混合编程是一种程序设计方法,它将汇编语言和C 语言结合起来使用,以实现更高效、更灵活的程序设计。在这种编程方法中,汇编语言主要用于实现底层操作,而C语言则用于实现高层逻辑。下面将详细介绍汇编语言与C语言混合编程的基本原理、优点及注意事项。 一、基本原理 在汇编语言与C语言混合编程中,通常采用的方法是通过汇编代码调用C函数或者将C函数嵌入到汇编代码中。具体来说,可以使用以下两种方式: 1. 汇编代码调用C函数 在这种方式下,首先需要定义一个extern类型的函数声明,并在需要调用该函数的地方使用call指令进行调用。例如: extern int add(int a, int b); ... mov eax, 1

mov ebx, 2 call add ... 其中add是一个C函数,在汇编代码中通过extern关键字进行声明,并使用call指令进行调用。 2. 将C函数嵌入到汇编代码中 在这种方式下,可以使用asm关键字将一段汇编代码嵌入到C函数中。例如: int main() { int a = 1; int b = 2; asm("mov eax, %0\n" "add eax, %1\n" "mov %0, eax\n" : "+r" (a) : "r" (b) : "eax"); return a;

} 在这个例子中,使用asm关键字将一段汇编代码嵌入到了main函数中。该汇编代码实现了对a和b的相加操作,并将结果保存在a中。 二、优点 汇编语言与C语言混合编程具有以下几个优点: 1. 提高程序效率 汇编语言可以直接操作硬件,因此在需要进行底层操作或者对性能要求较高的场合下,使用汇编语言可以提高程序的效率。 2. 增强程序灵活性 C语言具有良好的可移植性和易读性,而汇编语言则具有更高的灵活性。通过将两者结合起来使用,既可以充分利用C语言的优点,又可以发挥汇编语言的灵活性,从而增强程序的灵活性。 3. 便于调试 在使用纯汇编语言进行开发时,由于其代码量较大且难以理解,因此

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 BICNE R5,R5,#0X00000040 B START END *Test4.s ****** ;Name :test4.s

《ARM嵌入式系统结构与编程》习题答案

1章绪论 1.国内嵌入式系统行业对“嵌入式系统”的定义是什么?如何理解?答:见教材1.1节。 2.嵌入式系统是从何时产生的,简述其发展历程。答:见教材1.1节。 3.当前最常见的源码开放的嵌入式操作系统有哪些,请举出两例,并分析其特点。 答:见教材1.2.1节的嵌入式Linux和嵌入式实时操作内核UC /OS-I 。 4.举例说明嵌入式设备在工控设备中的应用。答:见教材1.3节的“工业控制领域”。 5.未来嵌入式技术的发展趋势有哪些?答:见教材1.4节的嵌入式技术的发展趋势。 2章ARM技术与ARM体系结构 1.简述ARM处理器内核调试结构原理。答:对教材1.2节的图2-1进行描述。 2.分析ARM7TDMI-S各字母所代表的含义。答:参考教材2.1.2 ARM核版本命名规则说明。 3.ARM处理器的工作模式有哪几种,其中哪些为特权模式,哪些为异常模式,并指出处理器在什么情况下进入相应的模式。 ARM处理器共有7种工作模式: 用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式下执行。在用户模式下,如果没异常发生,不允许应用程序自行改变处理器的工作模式,如果有异常发生,处理器会自动切换工作模式 FIQ模式:也称为快速中断模式,支持高速数据传输和通道处理,当一个高优(fast)中断产生时将会进入这种模式。 IRQ模式:也称为普通中断模式,:当一个低优先级中断产生时将会进入这种模式。在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。通常的中断处理都在IRQ 模式下进行。 SVC模式:称之为管理模式,它是一种操作系统保护模式。当复位或软中断指令执行时处理器将进入这种模式。 中止模式:当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟存储或存储保护。 未定义指令异常模式:当执行未定义指令时会进入这种模式,主要是用来处理未定义的指令陷阱,支持硬件协处理器的软件仿真,因为未定义指令多发生在对协处理器的操作上。 系统模式:使用和User模式相同寄存器组的特权模式,用来运行特权级的操作系统任务。 在这7种工作模式中,除了用户模式以外,其他6种处理器模式可以称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切换。在这6种特权模式中,除了系统模式外的其他5种特权模式又称为异

ARM嵌入式系统结构与编程,课后练习及答案

第一章 思考与练习 1、举出3个书本中未提到的嵌入式系统的例子。答:红绿灯控制,数字空调,机顶盒 2、什么叫嵌入式系统?嵌入式系统:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 3、什么叫嵌入式处理器?嵌入式处理器分为哪几类? 嵌入式处理器是为完成特殊的应用而设计的特殊目的的处理器。 嵌入式微处理器(Embedded Microprocessor Unit, EMPU) 嵌入式微控制器(Microcontroller Unit, MCU) 嵌入式DSP 处理器(Embedded Digital Signal Processor, EDSP) 嵌入式片上系统(System On Chip) 4、什么是嵌入式操作系统?为何要使用嵌入式操作系统? 是一段在嵌入式系统启动后首先执行的背景程序,首先,嵌入式实时操作系统提高了系统的可靠性。其次,提高了开发效率,缩短了开发周期。再次,嵌入式实时操作系统充分发挥了 32 位CPU 的多任务潜力。 第二章 1、嵌入式系统项目开发的生命周期分哪几个阶段?各自的具体任务是什么? 项目的生命周期一般分为识别需求、提出解决方案、执行项目和结束项目4 个阶段。 识别需求阶段的主要任务是确认需求,分析投资收益比,研究项目的可行性,分析厂商所应具备的条件。 提出解决方案阶段由各厂商向客户提交标书、介绍解决方案。 执行项目阶段细化目标,制定工作计划,协调人力和其他资源;定期监控进展, 分析项目偏差,采取必要措施以实现目标。 结束项目阶段主要包括移交工作成果,帮助客户实现商务目标;系统交接给维护人员;结清各种款项。 2、为何要进行风险分析?嵌入式项目主要有哪些方面的风险? 在一个项目中,有许多的因素会影响到项目进行,因此在项目进行的初期,在客户和开发团队都还未投入大量资源之前,风险的评估可以用来预估项目进行可能会遭遇的难题。 需求风险;时间风险;资金风险;项目管理风险 3、何谓系统规范?制定系统规范的目的是什么? 规格制定阶段的目的在于将客户的需求,由模糊的描述,转换成有意义的量化数据。 4、何谓系统规划?为何要做系统规划 系统规划就是拟定一个开发进程,使项目在合理的进程范围中逐渐建构完成。其目地是让客户可以进一步地掌握系统开发的进程,并确定检查点,以让双方确定项目是否如预期中的进度完成。 5、为什么在项目结束前需要进行项目讨论? 项目的讨论一个项目进行的反馈机制。通过这一个程序,项目团队的经验才可以被记录 下来,也就是说,这是一个撰写项目历史的过程。 第三章 1、ARM7TDMI中的T、D、M、I的含义是什么? 64 位乘法指令(带M 后缀的)、支持片上调试(带D 后缀的)、高密度16 位的Thumb 指令机扩展(带T 后缀的)和EmbededICE 观察点硬件(带I 后缀的) 2、ARM7TDMI采用几级流水线?使用何种存储器编址方式? 三级流水线(取指译码执行);使用了冯·诺依曼(V on Neumann )结构,指令和数据共用一条32 位总线。 3、ARM处理器模式和ARM处理器状态有何区别? 处理器模式指的是处理器在执行程序时在不同时刻所处的不同状态,处理器状态指的是处理器当前所执行的指令集。 4、分别列举ARM的处理器模式和状态。 状态: ARM 状态32 位,这种状态下执行的是字方式的ARM 指令 Thumb 状态16 位,这种状态下执行半字方式的Thumb 指令 模式: 用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式。 5、PC和LR分别使用哪个寄存器? PC使用R15寄存器,LR使用R14寄存器 6、R13寄存器的通用功能是什么? 堆栈 第四章 1、基础知识 (1)ARM7T DMI(-S)有几种寻址方式?LOR R1,[R0,#0x08]属于哪种寻址方式? 1. 寄存器寻址; 2. 立即寻址; 3. 寄存器移位寻址; 4. 寄存器间接寻址; 5. 基址寻址; 6. 多寄存器寻址; 7. 堆栈寻址; 8. 块拷贝寻址; 9. 相对寻址;LOR R1,[R0,#0x08]属于基址寻址。 (2)ARM指令的条件码有多少个?默认条件码是什么? 16条,默认条件码是AL。 (3)ARM指令中第二个操作数有哪几种形式?举例5个8位图立即数。 (1) 立即数;(2) 寄存器;(3) 寄存器及移位常数; 0x3FC(0xFF<<2)、0、0xF0000000(0xF0<<24)、200(0xC8)、0xF0000001(0x1F<<28)。 (4)LDR/STR指令的偏移形式有哪4种?LDRB和LDRSB有何区别? (1) 零偏移;(2) 前索引偏移;(3) 程序相对偏移;(4) 后索引偏移。LDRB就是读出指定地址的数据并存入指定寄存器,LDRSB读出指 定地址的数据,并高24位用符号位扩展,再存入指定寄存器。 (5)请指出MOV指令与LDR加载指令的区别及用途。 MOV 将8 位图(pattern)立即数或寄存器(operand2)传送到目标寄存器(Rd),可用于移位运算等操作。读取指定地址上的存储器单元内容,执行条件AL. (6)CMP指令的操作是什么?写一个程序,判断R1的值是否大于0x30,是则将R1减去0x30。 CMP 指令将寄存器Rn 的值减去operand2 的值,根据操作的结果更新CPSR 中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。 CMP R1,0x30 SUBHI R1,R1,0x30 (7)调用子程序是用B还是用BL指令?请写出返回子程序的指令? BL 指令用于子程序调用。 MOV PC,R14 (8)请指出LDR伪指令的用法。指令格式与LDR加载指令的区别是什么? LDR 伪指令用于加载32 位的立即数或一个地址值到指定寄存器。第二个数为地址表达式。 (9)ARM状态与T humb状态的切换指令是什么?请举例说明。 BX指令, (10)Thumb状态与ARM状态的寄存器有区别吗?T humb指令对哪些寄存器的访问受到一定限制? Thumb状态下不能更新CPSR 中的ALU 状态标志。,Thumb指令对R8~R15寄存器访问受限。 (11)T humb指令集的堆栈入栈、出栈指令是哪两条?PUSH POP

相关主题
相关文档
最新文档