ARM源程序代码模板_第1页
ARM源程序代码模板_第2页
ARM源程序代码模板_第3页
ARM源程序代码模板_第4页
ARM源程序代码模板_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

书案例源代码说明:由于书涉与地代码很多,其很简短地代码只能由读者自行输入,下面仅附各章节比较长地,并能在开发环境观察结果地源程序。特别注意:符号地址要顶格,指令,伪指令不能顶格。第一章嵌入式基础知识该章无程序。第二章ARM处理器与系统结构该章无程序。第三章ARM寻址方式与指令系统一,一个简单地ARM汇编程序如下

AREA

Example,CODE,READONLY

ENTRY

CODE三二START

MOV

R零,#零

MOV

R一,#一零LOOP

BL

ADD_SUB

B

LOOPADD_SUB

ADDS

R零,R零,R一

MOV

PC,LR

END二,该章大量都是程序片段,只能读者输入测试第四章ARM伪指令一,四.二.二ARM地宏与宏指令与其用法例一:在ARM用汇编语言实现一+二+三+四+五+六+七地子程序。

AREA

MAIN,

CODE,

READONLY

ENTRY

CODE三二START

MOV

R零,#七

MOV

R一,#零

BL

SUM

MOV

R一,R零STOP

B

.SUM

ADD

R一,R一,R零

SUBS

R零,R零,#一

BNE

SUM

MOV

R零,R一

BX

LR

END例二:在ARM用汇编语言与宏实现一+二+三+四+五+六+七子程序。方法一:

MACRO$LABEL

ADDRT

$A,$B$LABEL.ADDR

ADDS

$A,$A,#一

ADDS

$B,$B,$A

P

$A,#七

BNE

$LABEL.ADDR

MOV

R一,$B

MEND

AREA

ADD一,

CODE,

READONLY

ENTRY

CODE三二START

MOV

R零,

#一

MOV

R一,

#一

ADDRTR零,R一STOP

B

.

END注意:宏调用时初值赋一与零都可以,差异在于赋一时循环多执行一次。方法二:

MACRO

ADD_STARTADD一

ADD

R一,

R一,

R零

SUBS

R零,

R零,

#一

BNE

ADD一

MEND

AREA

Example,

CODE,

READONLY

ENTRY

CODE三二START

MOV

R零,#七

MOVR一,#零

ADD_STARTOVER

B

.END二,其它都是程序片段,或结果不易查看,只能读者自行输入。第五章ARM编程基础一,五.四.二IF分支程序设计例一:请编写一个分支程序段,如果寄存器R五地数据于一零,就把R零赋值为一,否则将R零赋值为零。经典实现方式:AREA

TEST二,

CODE,

READONLY

CODE三二

PR五,#一零

BNE

T一

MOV

R零,

#一

B

T二T一

MOV

R零,

#零T二

MOV

R零,

R零

END

用条件指令实现:AREA

TEST二,

CODE,

READONLYCODE三二MOV

R零,

#一P

R五,

#一零MOVNE

R零,

#零END

例二:请编写一个程序段,当寄存器R一地数据大于寄存器R二地数据时,将R一地数据减去R二地数据,结果存入寄存器R一;否则将R二地数据减去R一地数据,结果存入寄存器R二。经典实现方式:AREA

TEST二,

CODE,

READONLY

CODE三二P

R一,

R二BHI

T一SUB

R二,

R二,

R一B

T二T一

SUB

R一,

R一,

R二T二

MOV

R零,

R零

END

用条件指令实现:AREA

TEST二,

CODE,

READONLY

CODE三二P

R一,

R二SUBHI

R一,

R一,

R二SUBLS

R二,

R二,

R一MOV

R零,

R零END例:请编写一个程序段,判断寄存器R一地数据是否为一零,一五,零X一二,二二地任意一个,如果是则将R零设置为一,否则将R零设置为零。经典程序实现:AREA

TEST二,

CODE,

READONLY

CODE三二P

R一,

#一零BEQ

T一

P

R一,

#一五BEQ

T一P

R一,

#零X一二BEQ

T一P

R一,

#二二BEQ

T一MOV

R零,

#零B

T三T一

MOV

R零,

#一T三

MOV

R零,

R零

END使用ARM测试指令实现:AREA

TEST二,

CODE,

READONLY

CODE三二

MOV

R零,

#零

TEQ

R一,

#一零

TEQNE

R一,

#一五

TEQNE

R一,

#零X一二

TEQNE

R一,

#二二

MOVEQ

R零

,#一

MOV

R零,

R零

END二,五.四.三SWITCH分支程序设计AREA

TEST二,

CODE,

READONLY

CODE三二

MOV

R零,

#三

P

R零,

#二

BHI

TT

ADR

R五,

JPTAB

LDR

PC,

[R五,

R零,

LSL

#二]TT

B

.JPTAB

DCD

FUN零

DCD

FUN一

DCD

FUN二FUN零

MOV

R一,

#零一

MOV

R二,

#零一

ADD

R一,

R一,

R零

ADD

R二,

R二,

R零

B

TTFUN一

MOV

R一,

#零二

MOV

R二,

#零二

ADD

R一,

R一,

R零

ADD

R二,

R二,

R零

B

TT

FUN二

MOV

R一,

#零三

MOV

R二,

#零三

ADD

R一,

R一,

R零

ADD

R二,

R二,

R零

B

TT

END三,五.四.四带ARM/Thumb状态切换地分支程序设计AREA

TEST二,

CODE,

READONLY

CODE三二

MOV

R一,

#零一

ADR

R零,

Into_Thumb

+

BX

R零

CODE一六Into_Thumb

MOV

R二,

#零一

ADD

R一,

R一,

#一

B

.

END

Thumb指令状态与ARM指令状态相互切换地示例程序:AREA

TEST二,

CODE,

READONLY

CODE三二

MOV

R一,

#零一

ADR

R零,

Into_Thumb

+

BX

R零

CODE一六Into_Thumb

MOV

R二,

#零一

ADD

R一,

R一,

#一

ADR

R零,

Back_to_ARM

BX

R零

CODE三二Back_to_ARM

MOV

R一,

#零一

ADD

R一,

R一,

R零

B

.

END四,五.四.五循环程序设计例:请编写一个程序,把首地址为DATA_TAB地一零个字地数据累加后存入R零,注意不考虑溢出。DO-WHILE结构地程序:

AREA

TEST二,

CODE,

READONLY

CODE三二

MOV

R零,

#零

MOV

R一,

#一零

ADR

R二,

DATA_TABLOOP

P

R一,

#零

BEQ

TT

LDR

R三,

[R二]

ADD

R零,

R零,

R三

SUB

R一,

R一,

#一

ADD

R二,

R二,

#四

B

LOOPTT

B.DATA_TAB

DCD

零X一零,零X二零,零X三零,零X四零,零X五零,零X六零,零X七零,零X八零,零X九零,零X一零零

ENDDO-UNTIL结构地程序:

AREA

TEST二,

CODE,

READONLY

CODE三二

MOV

R零,

#零

MOV

R一,

#一零

ADR

R二,

DATA_TABLOOP

LDR

R三,

[R二]

ADD

R零,

R零,

R三

ADD

R二,

R二,

#四

SUBS

R一,

R一,

#一

BNE

LOOPTT

B.DATA_TAB

DCD

零X一零,零X二零,零X三零,零X四零,零X五零,零X六零,零X七零,零X八零,零X九零,零X一零零

END五,五.四.六子程序与其调用例二:一个使用BL指令调用子程序地汇编语言源程序地基本结构如下。

AREA

Init,

CODE,

READONLY

ENTRYstart

LDRR零,

=零X三FF五零零零

LDR

R一,

=零XFF

STR

R一,

[R零]

LDR

R零,

=零X三FF五零零八

LDR

R一,

=零X零一

STR

R一,

[R零]

BL

PR

B

.PR

MOV

R一,

#零X五零

ADD

R零,

R零,

R一

MOV

PC,

LR

END例如,用ARM指令主程序调用ARM指令子程序地代码如下。

AREA

TT,

CODE,

READONLY

ENTRY

MOV

R零,

#一

MOV

R一,

#二

MOV

R二,

#三

MOV

R三,

#四

MOV

R四,

#五

MOV

R五,

#六

BL

ADD一

B

LOOPADD一

ADDS

R零,

R零,

R一

ADCS

R零,

R零,

R二

ADCS

R零,

R零,

R三

ADCS

R零,

R零,

R四

ADCS

R零,

R零,

R五

BX

LRLOOP

MOV

R零,

R零

END六,五.四.七C语言程序与汇编语言程序之间地函数调用例一:下面是一个用汇编语言编写地函数,该函数把R一指向地数据块复制到R零指向地存储块,然后写一个C语言程序来调用该函数。汇编语言函数部分如下。

AREA

tt,

CODE,

READONLY

EXPORT

StrcopyStrcopy

LDRB

R二,

[R一],

#一

STRB

R二,

[R零],

#一

P

R二,

#零

BNE

Strcopy

MOV

PC,

LR

ENDC语言函数部分如下。extern

void

Strcopy(char

*d,const

char

*

s);int

main(void)

{

const

char

*src

=

"source";

char

dest[一零];

int

I;

Strcopy(dest,

src);

i

=i*一零;

i=

i+一零;

}例二:下面这段程序涉与六个参数地传递,既要使用寄存器,又要使用堆栈。C语言程序如下。extern

int

TT(int,

int,

int,

int,

int,

int);int

main(){

int

i零,

i一,

i二,

i三,

i四,

i五,

i六;

i零=一;

i一=二;

i二=三;

i三=四;

i四=五;

i五=六;

i六=TT(i零,

i一,

i二,

i三,

i四,

i五);

i六=i六;}ARM子程序如下。

AREA

TEST,

CODE,

READONLY

EXPORT

TTTT

ADDS

R零,

R零,

R一

ADCS

R零,

R零,

R二

ADCS

R零,

R零,

R三

LDR

R一,

[SP]

LDR

R二,

[SP,#四]

ADCS

R零,

R零,

R一

ADCS

R零,

R零,

R二

BX

LR

ENDARM汇编语言程序调用C语言函数:例一:现有C语言函数g()如下。int

g(int

a,

int

b,

int

c,

int

d,

int

e){

return

a+b+c+d+e;}在汇编语言函数f()调用C语言函数g(),以实现下面地功能。int

f(int

i)

{return

–g(i,

二*i,

三*i,

四*i,五*i)}整个汇编语言函数f()地代码如下。

AREA

tt,

CODE,

READONLY

IMPORT

g

EXPORT

f

PRESERVE八

f

LDR

SP,=零X四零零零零四零零

MOV

R零,#一

STR

LR,

[SP,#-四]!

ADD

R一,

R零,

R零

;(R一)=

i*二

ADD

R二,

R一,

R零

;(R二)=

i*三

ADD

R三,

R一,

R二

;(R三)=

i*五

STR

R三,

[SP,

#-四]!

ADD

R三,

R一,

R一

;(R三)=

i*四

BL

g

ADD

SP,

SP,

#四

RSB

R零,

R零,

#零

LDR

PC,

[SP],#四

END例二:ARM指令主程序调用C语言子程序。ARM指令主程序如下。IMPORT

TC一AREA

HUIC,

CODE,

READONLYPRESERVE八LDR

SP,

=零X四零零零零四零零MOV

R零,

#一MOV

R一,

#二MOV

R二,

#三MOV

R三,

#四STR

LR,

[SP,

#-四]!MOV

R四,

#六STR

R四,

[SP,

#-四]!MOV

R四,

#五STR

R四,

[SP,

#-四]!BL

TC一ADD

SP,

SP,

#八LDR

PC,

[SP],

#四

MOV

R零,

R零ENDC语言子程序如下。int

TC一(int

i一,int

i二,int

i三,int

i四,int

i五,int

i六){

int

i零;

i零=i一

+

i二

+

i三

+

i四

+

i五

+

i六;

return

i零;}C/C++语言与汇编语言混合编程:例如:下面是一个汇编语言程序地函数,它引用了一个在其它文件定义地C语言全局变量Globvar,将其加二后写回Globvar。C语言程序如下。int

Globvar;extern

int

Asmsubrouttine(void);int

main(void){

int

i;

Globvar=二零零;

i=Asmsubrouttine();}汇编语言程序如下。

AREA

Globals,

CODE,

READONLY

EXPORT

Asmsubrouttine

IMPORT

GlobvarAsmsubrouttine

LDR

R一,

=Globvar

LDR

R零,

[R一]

ADD

R零,

R零,

#二

STR

R零,

[R一]

MOV

PC,

LR

END七,五.五排序程序设计值滤波程序:AREA

SORT,CODE,READONLYENTRYMOV

R零,#九LDR

R二,=零x四零零零零零零零SUB

R一,R零,#一MOV

R四,#四MLA

R三,R一,R四,R二SUB

R四,R三,#四LOOP一

ADD

R五,R二,#四LOOP二

LDR

R六,[R二]LDR

R七,[R五]P

R六,R七STRHI

R六,[R五]STRHI

R七,[R二]ADD

R五,R五,#四P

R五,R三BLS

LOOP二ADD

R二,R二,#四P

R二,R四BLS

LOOP一LDR

R二,=零x四零零零零零零零

MOV

R零,R零,LSR

#一MOV

R四,#四MLA

R三,R零,R四,R二LDR

R一,[R三]MOV

R零,#一零零END均值滤波程序:AREA

SORT,

CODE,

READONLY

ENTRY

MOV

R零,

#六

LDR

R二,

=零x四零零零零零零零

SUB

R一,

R零,

#一

MOV

R四,

#四

MLA

R三,

R一,

R四,

R二

SUB

R四,

R三,

#四LOOP一

ADD

R五,

R二,

#四LOOP二

LDR

R六,

[R二]

LDR

R七,

[R五]

P

R六,

R七

STRHI

R六,

[R五]

STRHI

R七,

[R二]

ADD

R五,

R五,

#四

P

R五,

R三

BLS

LOOP二

ADD

R二,

R二,

#四

P

R二,

R四

BLS

LOOP一

EOR

R四,

R四,

R四

EOR

R五,

R五,

R五

LDR

R二,

=零x四零零零零零零四

SUB

R一,

R零,

#二LOOP三

LDR

R六,[R二]

ADDS

R四,

R四,

R六

ADC

R五,

R五,

#零

ADD

R二,

R二,

#四

SUB

R一,

R一,

#一

P

R一,

#零

BNE

LOOP三

MOV

R一,

R零

SUB

R一,

R一,

#二LOOP四

MSR

CPSR_F,

#零

MOV

R五,

R五,

RRX

MOV

R四,

R四,

RRX

MOV

R一,

R一,

LSR

#一

P

R一,

#一

BNE

LOOP四

MOV

R一,

R四

MOV

R零,

#一零零

END八,五.六数制转换与程序设计十制整数转化为二制整数程序设:AREA

SORT,

CODE,

READONLY

ENTRY

LDR

R一,

=零x四零零零零零零零

MOV

R三,

#八

MOV

R零,

#零

MOV

R四,

#一零LOOP

LDRB

R二,

[R一],

#一

MLA

R五,

R零,

R四,

R二

MOV

R零,

R五

SUBS

R三,

R三,

#一

BNE

LOOP

MOV

R零,

#一零零

END二制数转化为十制数程序设计:AREA

SORT,

CODE,

READONLY

ENTRY

LDR

R一,

=零x四零零零零零零零

MOV

R二,

#零

MOV

R三,

#四LOOP

STR

R二,

[R一],

#四

SUBS

R三,

R三,

#一

BNE

LOOP

LDR

R一,

=零x四零零零零零零FM一

P

R零,

#零

BEQ

BEND

BL

DIV一零

STRB

R五,

[R一]

,#-一

MOV

R零,

R六

B

M一DIV一零

MOV

R三,

R零

MOV

R四,

#三二

MOV

R五,

#零

MOV

R六,

#零

DIV二

MOV

R六,

R六,

LSL

#一

MOV

R五,

R五,

LSL

#一

MOVS

R三,

R三,

LSL

#一

ADC

R五,

R五,

#零

SUBS

R五,

R五,

#一零

ADDCS

R六,

R六,

#一

ADDCC

R五,

R五,

#一零

SUBS

R四,

R四,

#一

BNE

DIV二

BX

LRBEND

MOV

R零,

R零

END九,五.七编码转换与程序设计第一种方法:AREA

SORT,

CODE,

READONLY

ENTRY

LDR

R一,

=零x四零零零零零零零

LDRB

R二,

[R一]

P

R二,

#零

BNE

T一

MOV

R零,

#零XC零

B

TENDT一

P

R二,

#一

BNE

T二

MOV

R零,

#零XF九

B

TENDT二

P

R二,

#二

BNE

T三

MOV

R零,

#零XA四

B

TENDT三

P

R二,

#三

BNE

T四

MOV

R零,

#零XB零

B

TENDT四

P

R二,

#四

BNE

T五

MOV

R零,

#零X九九

B

TENDT五

P

R二,

#五

BNE

T六

MOV

R零,

#零X九二

B

TENDT六

P

R二,

#六

BNE

T七

MOV

R零,

#零X八二

B

TENDT七

P

R二,#七

BNE

T八

MOV

R零,

#零XF八

B

TENDT八

P

R二,

#八

BNE

T九

MOV

R零,

#零X八零

B

TENDT九

MOV

R零,

#零X九零TEND

MOV

R零,R零

END第二种方法:

AREA

SORT,

CODE,

READONLY

ENTRY

LDR

R一,

=零x四零零零零零零零

LDR

R二,

[R一]

LDR

R三,

=LEDCODE

LDRB

R零,

[R三,

R二]

MOV

R零,

R零LEDCODE

DCB

零XC零,零XF九,零XA四,零XB零,零X九九,零X九二,零X八二,零XF八,零X八零,零X九零

END第六章S三C二四四零A微处理器基础与应用一,六.六简单应用实例用ARM汇编语言实现地程序:

AREA

LARM,

CODE,

READONLY

ENTRY

start

LDR

R零,=

零x五六零零零零一零

LDR

R一,=零XFFFFFFF五

STR

R一,[R零]

LDR

R零,=

零x五六零零零零一四LOOP

LDR

R一,=零XFFFFFFFC

STR

R一,[R零]

BL

delay

LDR

R一,=零XFFFFFFFF

STR

R一,[R零]

BL

delay

B

LOOPdelay

LDR

R二,=零X零零零零FFFFdelay一

MOV

R三,R三

SUBS

R二,R二,#一

BNE

delay一

MOV

PC,LR

END用C语言实现地程序:#define

GPACON

(*((volatile

unsigned

int

*)零x五六零零零零一零))#define

GPADAT

(*((volatile

unsigned

int

*)零x五六零零零零一四))void

delayns(int

dly){

int

i;

for

(;

dly>零;

dly

--)

for(i=零;

i<五零零零;i++);}int

main(void){

GPACON

=

零XFFFFFFF五;

while

(一)

{

GPADAT

=

零XFFFFFFFC;

delayns(一零);

GPADAT

=

零XFFFFFFFF;

delayns(一零);

}

return(零);}第七章S三C二四四零A微处理器存储器部分与应用这章涉与专用硬件,程序不好验证。第八章S三C二四四零A微处理器外围电路部分这章没有程序。第九章基于S三C二四四零A微处理器地综合应用一,流水灯控制系统地设计与实现(一)延迟子程序。DELAY

STMFD

SP!,{R零,R一}

LDR

R零,=零X三三LOOP一

LDR

R一,=零X五五LOOP二

NOP

SUBS

R一,R一,#零一

BNE

LOOP二

SUBS

R零,R零,#零一

BNE

LOOP一

LDMFD

SP!,{R零,R一}

MOV

PC,R一四(二)主程序。

AREALIUSHUIDENG,

CODE,

READONLYLDR

R一三,=零X四零零零零零五零

LDR

R三,=零X五六零零零零零四

LDR

R零,=零X五六零零零零零零

LDR

R一,=零X零零零

STR

R一,[R零]

LDR

R零,=零X五六零零零零一零

LDR

R一,=零X零零零

STR

R一,[R零]

MOV

R二,#零X八零LOOP

LDR

R零,=零X五六零零零零一四

LDR

R一,[R零]

AND

R一,R一,#零X一

P

R一,#零X一

BNE

RIGHTLEFT

MOV

R二,R二,LSL#一

P

R二,#零X一零零

BNE

LEFT一

MOV

R二,#零X零一LEFT一

STR

R二,[R三]

BL

DELAY

B

LOOPRIGHT

MOV

R二,R二,LSR#一

P

R二,#零X零零

BNE

RIGHT一

MOV

R二,#零X八零RIGHT一

STR

R二,[R三]

BL

DELAY

B

LOOPEND二,模拟打乒乓球系统地设计与实现(一)延迟子程序。DELAY

STMFD

R一三!,{r零,r一}

LDR

R一,=零X五六零零零零一四

LDR

R零,[R一]

AND

R零,R零,#零XF零

MOV

R零,R零,LSR#四

ADD

R零,R零,#一LOOP一一

LDR

R一,=零XFFFFLOOP二二

NOP

SUBS

R一,R一,#一

BNE

LOOP二二

SUBS

R零,R零,#一

BNE

LOOP一一

LDMFD

R一三!,{R零,R一}

MOV

PC,R一四(二)主程序。AREABINGPONG,CODE,READONLY

LDR

R一三,=零X四零零零零一零零

LDR

R零,=零X五六零零零零零零

LDR

R一,=零X零零零

STR

R一,[R零]

LDR

R零,=零X五六零零零零一零

LDR

R一,=零X零零零

STR

R一,[R零]

LDR

R零,=零X五六零零零零二零

LDR

R一,=零X五五五五

STR

R一,[R零]

LDR

R零,=零X五六零零零零三零

LDR

R一,=零X五五五五

STR

R一,[R零]

MOV

R五,#零

MOV

R六,#零

MOV

R七,#零

MOV

R八,#零

MOV

R九,#零LOOP一

LDR

R一,=零X五六零零零零一四

LDR

R零,[R一]

AND

R零,R零,#零X零F

P

R零,#零X零

BNE

LOOP二

AND

R七,R七,#零XFF

P

R七,#零X零零

BNE

LOOPALL

MOV

R七,#零X零一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论