嵌入式程序复习Word文档格式.doc

上传人:b****2 文档编号:14567150 上传时间:2022-10-23 格式:DOC 页数:17 大小:452.50KB
下载 相关 举报
嵌入式程序复习Word文档格式.doc_第1页
第1页 / 共17页
嵌入式程序复习Word文档格式.doc_第2页
第2页 / 共17页
嵌入式程序复习Word文档格式.doc_第3页
第3页 / 共17页
嵌入式程序复习Word文档格式.doc_第4页
第4页 / 共17页
嵌入式程序复习Word文档格式.doc_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

嵌入式程序复习Word文档格式.doc

《嵌入式程序复习Word文档格式.doc》由会员分享,可在线阅读,更多相关《嵌入式程序复习Word文档格式.doc(17页珍藏版)》请在冰豆网上搜索。

嵌入式程序复习Word文档格式.doc

传送CPSR的内容到R0

13.MOVR2,R0;

指令实现的功能是将寄存器R0的值传送到寄存器R2。

14.ADDR1,R1,#3;

指令实现的功能是将R1+3的结果送R1是保存。

15.ADDR2,R1,[R0];

指令实现的功能是将以R0中的内容为地址的单元中的值与R1相加,结果送R2保存。

16.LDRR1,[R0+4];

指令实现的功能是将R0的内容加4后送R1。

17.LDRR1,[R0+4]!

指令实现的功能是将R0的内容加4后送R1,然后R0的内容自增4个字节。

18.ANDR0,R0,#3;

该指令保持R0的0、1位,其余位清零。

19.B0x1200;

跳转到绝对地址0x1200处执行。

20.CMNR1,R2;

指令实现的功能是将寄存器R1的值与寄存器R2的值相加,根据结果设置CPSR的标志位。

1、写一条ARM指令,完成操作r1=r2*4

MOVR1,R2,LSL#2

2.写一条ARM指令,完成操作r1=r2*3

ADDR1,R2,R2,LSL#1

3.初始值R1=23H,R2=0FH执行指令BICR0,R1,R2,LSL#1后,寄存器R0,R1的值分别是多少?

R0=21H,R1=23H

4.初始值R2=5,R3=9,R4=3,执行指令SUBSR2,R3,R4,LSR#2后,寄存器R2,R3的值分别是多少?

R2=9,R3=9

5.ADD R0,R0,R0,LSL#2 ;

执行结果R0=5*R0

ADD R5,R3,R1,LSL#2 ;

R5←R3+R1*4

SUBR1,R1,R2,LSR#2;

R1=R1-R2÷

4,因为R2右移2位相当于R2除以4。

LSL #n ;

逻辑左移n位(1≤n≤31),低端空位补0。

LSR #n ;

逻辑右移n位(1≤n≤32),高端空位补0

6.LDRR2,[R3,#0x0C];

前变址,传数前计算地址

;

读取R3+0x0C地址上的存储单元的内容,放入R2。

STRR1,[R0,#-4]!

;

[R0-4]←[R1],R0=R0-4,符号“!

”表明指令在完成数据传送后应该更新基址寄存器,否则不更新;

属于回写前变址。

LDRR0,[R1],#4 

 

后变址:

先进行R1->

R0操作然后R1+4->

R1,操作完毕后,R1=R1+4。

不需要"

!

"

号。

7.多寄存器寻址即是一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器。

多寄存器寻址指令举例如下:

LDMIAR1!

,{R2-R7,R12}

将R1指向的单元中的数据读出到R2~R7、R12中

(R1自动增加)

LDMIA 

R0!

 

{R1, 

R2, 

R3, 

R4}

R1←[R0] 

R2←[R0+4] 

R3←[R0+8] 

R4←[R0+12] 

STMIAR0!

将寄存器R2~R7、R12的值保存到R0指向的存储单元中,

(R0自动增加)

,{R1—R7}

将R1~R7的数据保存到存储器中。

存储指针在保存第一

个值之后增加,增长方向为向上增长

R0←R1

[R0+4]←R2

[R0+8]←R3

[R0+12]←R4

[R0+16]←R5

[R0+20]←R6

[R0+24]←R7

R0保持自动增值

8.LDRR2,[R3,#0x0C]

读取R3+0x0C地址上的一个字数据内容,放入R2。

属前变址。

参看教材第125页。

[R0-4]←[R1],R0=R0-4,符号“!

属回写前变址。

LDRR1,[R0,R3,LSL#1]

将R0+R3×

2地址上的存储单元的内容读出,存入R1。

9写一段ARM汇编程序:

循环累加队列myarray中的所有元素,直到碰上零值元素,结果放在r4中。

程序框架如下,补充代码完成上述功能。

AREAtotal,CODEREADONLY

ENTRY

start

MOV r4,#0

ADR r0,myarray

在此补充代码

loop

LDRr1,[r0],#4

ADD r4,r4,r1

CMP r1,#0

BNE loop

stop

B stop

myarray

DCD0x11

DCD 0x22

……

DCD0x0

END

10并编写了如下的汇编程序:

问:

现执行上述程序,请列出R0,R1,R2的最终值,并告知整个程序的功能。

R0=1

R1=2

R2=1

功能:

对R0和R1分别赋值0,1,在R1为5的条件下循环给R0赋值R0和R1之和,给R1加1,

取得RESULT的地址赋值于R2,将R0的值保存在RESULT中

11读如下程序

test.s:

test.c:

请列出上述程序执行后R0,R1的值,并说明上述程序的作用。

R0=31

R1=23

test.c调用s_program函数,将54赋值R0,23赋值R1,两者相减后,赋值给R0,R0作为返回值赋值给num,然后输出num。

12有如下C语言定义的函数mypro

intmypro(inta,intb)

{

a=a*b;

return(a);

}

请补充完成调用上述函数的汇编程序,实现11与22相乘,并要求将结果保存在地址为0x40001000处:

areatest3,code,readonly

importmypro

entry

code32

start

movr0,#11

(1)

movr1,#22

(2)

BLmypro(3)

Ldrr3,=0x40001000(4)

Strr0,[r3](5)

END

13程序段如下,实现下面流程图,试补充编写ARM汇编代码。

\

程序段:

MOVr2,#15

MOVr3,#9

补充代码

Bstop

程序:

Start:

CMPr2,r3

SUBLTr3,r3,r2

SUBGTr2,r2,r3

BNEstart

14明指令STMIA r8!

{r0-r7}的操作功能。

将R0-R7八个寄存器中的32位数据,存储到R8地址指针为起始地址的内存中,地址的操作方式是先操作、后增加,并更新地址。

15汇编程序调用C程序的方法为:

首先在汇编程序中使用IMPORT伪指令事先声明将要调用的C语言函数;

然后通过BL指令来调用C函数。

(写出注释能把程序写出来,给出程序能将注释写出来)

例如在一个C源文件中定义了如下求和函数:

intprom(intx,inty){

return(x&

y);

调用prom()函数的汇编程序结构如下:

IMPORTprom;

声明要调用的C函数

MOVr0,1

MOVr1,2

BLprom;

调用C函数prom

16C程序调用汇编子程序的方法为:

首先在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用;

然后在C程序中使用extern关键字声明要调用的汇编子程序为外部函数。

例如在一个汇编源文件中定义了如下求和函数:

EXPORTprom;

声明prom子程序将被外部函数调用

prom;

求与子程序prom

ANDr0,r0,r1

MOVpc,lr

在一个C程序的main()函数中对prom汇编子程序进行了调用:

externintprom(intx,inty);

//声明prom为外部函数

voidmain(){

inta=1,b=2,c;

c=prom(a,b);

//调用prom子程序

综合编程

1、教材第六章关于GPIO的应用,列举了一个I/O管脚控制4个LED发光二极管的例子,但我们实验箱所提供的LED发光二极管位于不同的引脚,它们分别使用了S3C2410的GPC5,GPC6,GPC7,如下图,请修改原程序段以实现三个灯的交替闪烁(注:

未用引脚设置为input状态)。

(写出注释能把程序写出来,给出程序能将注释写出来)

博创经典版LED接线原理图

相关寄存器定义:

#definerGPCCON(*(volatileunsigned*)0x56000020)

#definerGPCDAT(*(volatileunsigned*)0x56000024)

#definerGPCUP(*(volatileunsigned*)0x56000028)

端口初始化:

voidport_init(void)

rGPCCON=0x56aa;

rGPCUP=0xff;

//GPF所有端口都不加上拉电阻

所有LED交替亮灭:

voidled_on_off(void)

inti;

rGPCDAT=0;

//所有LED全亮

for(i=0;

i<

100000;

i++);

rGPCDAT=0xE0;

//所有

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1