版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
书案例源代码说明:由于书涉与地代码很多,其很简短地代码只能由读者自行输入,下面仅附各章节比较长地,并能在开发环境观察结果地源程序。特别注意:符号地址要顶格,指令,伪指令不能顶格。第一章嵌入式基础知识该章无程序。第二章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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 果园桃树健康栽培技术指南
- 小学二年级数学100以内加减法竖式计算综合练习试题带答案
- 糖尿病病人的护理:口腔健康保护
- 秋冬季旅游健康小常识
- 商业地产开发项目财务效益分析
- 522风险考试附有答案
- 福建宇宏第一次总监模拟答辩考试试题附有答案
- 学校教代会活动方案策划书
- 智能家居系统的用户体验与交互设计
- 企业社会责任与企业可持续发展研究
- 投资顾问报告
- 渣土运输车辆挂靠合同(两篇)
- 鲁教版 地理选择性必修1 第一单元 地球运动的意义第一节 地球自转的意义
- 关系数据库规范化理论教学课件
- 陪审员培训刑事课件
- 地质聚合物的性能与应用发展前景
- 总结护理人员服务意识与沟通技巧课件
- 非物质文化遗产数字化保护商业计划书
- 消防宣传工作培训课件
- 《暑假法纪安全教育》课件
- 《教师数字素养》标准解读
评论
0/150
提交评论