《嵌 入 式 系 统》
实验报告
姓名: 学号: 班级:
湖南工业大学 电气与信息工程学院
2013年5月
实验一 ARM汇编指令实验1
一、实验目的
1.初步学会使用ADS1.2开发环境及ARM软件模拟器; 2.通过实验掌握简单ARM汇编指令的使用方法。
二.实验设备
1.硬件:PC机;
2.软件:ADS1.2。Windows98/2000/NT/XP。
三.实验内容
1.熟悉开发环境的使用,并使用LDR/STR和MOV等指令访问寄存器或存储单元。 2.使用ADD/SUB/LSL/LSR/AND/ORR等指令,完成基本数学/逻辑运算。
四.实验原理
ARM处理器共有37个寄存器:31个通用寄存器,包括程序计数器(PC),这些寄存器都是32位;6个状态寄存器,这些寄存器也是32位,但只使用了其中的12位。
1.ARM通用寄存器
通用寄存器(R0~R15)可分为3类,即不分组寄存器R0~R7.分组寄存器R8~R14.程序计数器R15。
2. 存储器格式
ARM体系结构将存储器看作是从零地址开始的字节的线性组合。字节0~3存放第一个字,字节4~7存放第2个字,以此类推。
ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。
3. GNU基础知识
Embest IDE集成了GNU汇编器as、编译器gcc和链接器ld。因此,编写程序要符合CNU的语法和规则。关于as.gcc和ld的具体使用,请参照Embest IDE所带的电子文档ProgRef.chm。
五 实验程序
1. 实验A程序
area Int,code,readonly entry
x equ 45;
y equ 64; stack_top equ 0x1000; global start
start MOV sp, #stack_top 2. 实验B程序
area Int|,code,readonly entry
MOV r0, #x STR r0, [sp] MOV r0, #y LDR r1, [sp] ADD r0, r0, r1 STR r0, [sp] stop
B stop end x equ y equ
45; 64;
z equ 87; stack_top equ 0x1000; global start
start MOV r0, #x
MOV r0, r0, lsl #8 MOV r1, #y
ADD r2, r0, r1, lsr #1 MOV sp, #0x1000 STR r2, [sp]
MOV r0, #z
AND r0, r0, #0xFF
ADD r2, r0, r1, lsr #1 LDR r0, [sp] MOV r1, #0x01 ORR r0, r0, r1
MOV r1, R2
ADD r2, r0, r1, lsr #1 stop
B stop end
六.实验结果及分析
实验A:
实验B:
这个程序实现了两数的相加。
这个程序实现了基本的数学加法,逻辑或运算。
实验二 ARM汇编指令实验2
一、实验目的
1.熟悉ARM ADS 1.2 for ARM 开发环境及ARM软件模拟器的使用。
2.通过实验掌握使用LDM/STM、B、BL等指令完成较为复杂的存储区访问和分支程序
的方法,学习使用条件码,加强对CPSR的认识。
二.实验设备
1.硬件:PC机;
2.软件:ADS1.2集成开发环境。Windows98/2000/NT/XP。
三.实验内容
设计并调试一个存储区数据块的传送程序,具体数据块的传送要求为:将数据从源数据区snum复制到目标数据区dnum,数据的个数num假定为20,复制时以8个字为单位进行,对于最后不足8个字的数据,以字为单位进行复制。
四.实验程序
Area Int,code,readonly entry
global start num equ 20; start
LDR r0, =src LDR r1, =dst MOV r2, #num
MOV sp, #0x400 ublockcopy
MOVS r3,r2, LSR #3 BEQ copywords
STMFD sp!, {r4-r11} octcopy
LDMIA r0!, {r4-r11} STMIA r1!, {r4-r11}
SUBS r3, r3, #1 BNE octcopy
LDMFD sp!, {r4-r11}
copywords
ANDS r2, r2, #7 BEQ stop wordcopy
LDR r3, [r0], #4 STR r3, [r1], #4 SUBS r2, r2, #1 BNE wordcopy stop
B stop src
dcd
1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst
dcd
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 end
五.实验结果及分析
这个程序实现了数据块的相互传送。 实验三 汇编与
C语言的相互调用实验
一、实验目的
1.阅读Embest S3CEV40启动代码,观察处理器启动过程。
2.学会使用Embest IDE辅助信息窗口来分析判断调试过程和结果
3.学会在Embest IDE环境中编写、编译与调试汇编和C语言相互调用的程序。
二、实验设备
1.硬件:PC机;
2.软件:ADS1.2集成开发环境。Windows98/2000/NT/XP。
三、实验内容
使用汇编完成一个随机数产生函数,通过C语言调用该函数,产生一系列随机数,存放到数组中。
四、实验原理
1.ARM过程调用ATPCS(ARM)
ATPCS是一系列规定应用程序之间相互调用的基本规则,包括: 支持数据栈限制检查;
支持只读段位置无关(ROPI); 支持可读/写段位置无关(RWPI);
支持ARM程序和Thumb程序的混合使用; 处理浮点运算。
使用以上规定的ATPCS规则是,应用程序必须遵守如下: 程序编写遵守ATPCS;
变量传递以中间寄存器和数据栈完成; 汇编器使用-apcs开关选项。
程序只要遵守ATPCS相应规则,就可以使用不同的源代码来编写程序。程序间的相互调用最主要的是解决参数传递问题。应用程序之间使用中间及数据栈来传递参数,其中,第1~4个参数使用R0~R3,多用4个参数数据栈进行传递。这样,接受参数的应用程序必须知道参数的个数。
但是,在应用程序被调用时,一般无从知道所传递参数的个数。用不同语言编写的应用程序在调用时可以自定义传递的约定。使用具有一定意义的形式来传递,可以很好地解决参数个数的问题。常用方法是把第1个或最后1个参数作为参数个数(包括个数本身)传递给应用程序。ATPCS中寄存器的相应关系如表3.1所列。
表3.1 ATPCS规则中寄存器列表 ARM 寄存器 R0~R3 R4 R5 R6 R7 R8 R9 ATPCS 别名 a1~a4 v1 v2 v3 v4、wr v5 v6、sb ATPCS寄存器说明 参数/结果/scratch寄存器1~4 局部变量寄存器1 局部变量寄存器2 局部变量寄存器3 局部变量寄存器4 Thumb状态工作寄存器 ARM状态局部变量寄存器5 ARM状态局部变量寄存6 RWPI的静态基址寄存器 ARM 寄存器 R10 R11 R12 R13 R14 R15 ATPCS 别名 v7、sl v8 ip sp lr PC ATPCS寄存器说明 ARM 状态局部变量寄存器7,数据栈限制指针寄存器 ARM状态局部变量寄存器8 子程序内部调用的临时(scratch)寄存器 数据栈指针寄存器 链接寄存器 程序计数器 2.main( )与__gccmain( )函数 当应用程序中包含了main( )函数时,会引起对C运行时库的初始化。该初始化是通过函数__gccmain( )实现的,即在main( )函数入口处,编译器会首先调用__gccmain( )函数,然后才是执行编写的代码。__gccmain( )函数在GCC的标准库里实现。当应用程序中没有包含main( )函数时,不会引起对C运行时库的初始化。这时,C运行时库的很多功能在应用程序中是不能使用的。
如果使用main( )函数作为应用程序的主函数,那么可以在源代码中间加入一个空的__gccmain( )函数(用C语言或汇编语言即可)
五、实验操作步骤
1. 创建新的工程,工程名为explasm。 2. 按照参考程序,重新编写源代码文件,并分别保持为 randtest.c、init. s、random. s和ldscript,并把它们加入工程中。
3. 按照编译→汇编器设置→链接器设置→调试器设置来设置新工程,并编译、链接工程。
4.下载调试文件,打开Memrory/Register/Watch/Variable/Call Stack窗口,单步执行程序。通过以上窗口,跟踪程序运行,观察分析并记录运行结果,通过实验学会使用Embest IDE进行应用程序的开发与调试。
六、实验参考程序
1.randtest.c参考源代码 #include /* this function prototype is needed because 'randomnumber' is external */ extern unsigned int randomnumber( void ); int main() { int i; int nTemp; 2.init.s参考源代码 global _start area qq,code,readonly entry _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 unsigned int random[10]; for( i = 0; i < 10; i++ ) { nTemp = randomnumber(); random[i] = nTemp; } return( 0 ); } 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 ). ;#------------------------------------------------------------------------------ global __gccmain __gccmain mov pc, lr 3.random.s参考源代码 AREA |Random$$code|, CODE, READONLY entry 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 */ 4.ldscript参考源代码 SECTIONS { . = 0x0; .text : { *(.text) } .data : { *(.data) } .rodata : { *(.rodata) } .bss : { *(.bss) } } 实验结果 end EOR a3, a3, a1, LSL#12 ; /* (involved!) */ EOR a1, a3, a3, LSR#20 ; /* (similarly involved!)*/ STMIA ip, {a1, a2} MOV pc, lr seedpointer dcd seed DATA GLOBAL seed seed dcq 0x55555555 dcq 0x55555555 END 实验感想 有时候我们很怀疑实验存在的意义,可是谁又能预知 明天会发生什么呢。所以只要虔心的去做每一件事,在未来的某一天总会发现它存在的意义。 因篇幅问题不能全部显示,请点此查看更多更全内容