嵌入式系统原理与应用 课件 第4章 Cortex M3汇编语言程序设计基础1_第1页
嵌入式系统原理与应用 课件 第4章 Cortex M3汇编语言程序设计基础1_第2页
嵌入式系统原理与应用 课件 第4章 Cortex M3汇编语言程序设计基础1_第3页
嵌入式系统原理与应用 课件 第4章 Cortex M3汇编语言程序设计基础1_第4页
嵌入式系统原理与应用 课件 第4章 Cortex M3汇编语言程序设计基础1_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式系统设计西安邮电大学计算机学院王忠民基于ARMCortexM3IP核的程序设计(1)4.1ARM汇编语言的程序结构4.2ARM汇编器伪指令 4.2.1段定义伪指令 4.2.2数据定义伪指令 4.2.3过程定义伪指令 4.2.4宏定义伪指令 4.2.5其他伪指令4.3ARM汇编语言程序设计

4.3.1顺序程序

4.3.2分支程序

4.3.3循环程序

4.3.4过程(子程序)调用第4章基于ARMCortexM3IP核的程序设计---学习内容基于ARMCortexM3IP核的程序设计(2)4.4C与汇编混合编程

4.4.1ARM架构过程调用标准AAPCS

4.4.2C程序内嵌汇编代码 4.4.3C程序调用汇编过程 4.4.4汇编程序调用C函数 4.4.5C与汇编程序变量互访

本章介绍ARM汇编程序设计的基本知识,包括汇编程序的格式,汇编器伪指令,顺序结构、分支结构、循环结构、子程序设计等。

在进行嵌入式软件开发时,为了兼具实时性和代码编写简洁的特点,还需要汇编与C的混合编程,本章对C中嵌套汇编,以及汇编和C相互调用进行了较详细的介绍。

本章是全书的重点之一,无论是从事底层开发还是从事上层应用软件开发的读者都需要掌握本章的内容。第4章基于ARMCortexM3IP核的程序设计---学习内容4.1ARM汇编语言的程序结构例4.1X1为无符号字型变量,位于ROM区(属性为READONLY),初始化赋值5个元素,编写程序计算这5个无符号数的累加和,并将结果存放到变量X2中,变量X2位于RAM区(属性为READWRITE)。程序代码如下(为了说明方便,每行前面加了行号):1 STACK_TOP EQU 0x20005000 ;宏定义主堆栈指针STACK_TOP,要顶格写2 AREA RESET, CODE,READONLY ;在ROM区定义名为RESET的代码段3 DCD STACK_TOP 4 DCD start 5 ENTRY 6 start

7 LDR R0,=X1 ;变量X1的地址送R0 8 MOV R1,#5 ;循环次数送R2 10 MOV R2,#0 ;累加和放R2寄存器,初值送011 loop1 LDR R3,[R0],#4 ;X1变量的元素送R3,地址指针R0加4指向下一个元素

13 ADD R2,R2,R3 ;累加结果送R2 14 SUBS R1,R1,#1 ;循环次数减115 BNE loop1 ;循环次数不到转loop1继续循环16 LDR R0,=X2 ;变量X2的地址送R017 STR R2,[R0] ;累加和存变量X2中18 deadloop B deadloop AREA MYDATA1,DATA,READONLY ;在ROM区定义名为MYDATA1数据段

22 X1 DCD 1,2,3,4,5 24 AREA MYDATA2,DATA,READWRITE ;在RAM区定义名为MYDATA2数据段X2 DCD 0 26 END

li4_1_leijia第4章基于ARMCortexM3IP核的程序设计---程序举例

每个ARM汇编程序均由指令和汇编器伪指令构成,在例4-1中,黑色表示的内容均为指令,蓝色表示的内容均为汇编器伪指令。①指令语句:在汇编后能产生目标代码的语句,CPU可以执行并能完成一定的功能,例如MOV,ADD等;②汇编器伪指令:在汇编后不产生目标代码的语句,仅在汇编过程中告诉汇编器如何汇编。汇编器伪指令的作用包括:定义数据、分配存储区、定义段、定义宏、定义子程序等。一旦汇编结束,它们的使命就完成了。第4章基于ARMCortexM3IP核的程序设计---学习内容基于ARMCortexM3IP核的程序设计(1)4.1ARM汇编语言的程序结构4.2ARM汇编器伪指令 4.2.1段定义伪指令 4.2.2数据定义伪指令 4.2.3过程定义伪指令 4.2.4宏定义伪指令 4.2.5其他伪指令4.3ARM汇编语言程序设计

4.3.1顺序程序

4.3.2分支程序

4.3.3循环程序

4.3.4过程(子程序)调用第4章基于ARMCortexM3IP核的程序设计---学习内容第4章基于ARMCortexM3IP核的程序设计---段定义伪指令4.2.1段定义伪指令语法格式:AREA 段名,属性1,属性2,……属性名作用CODE定义代码段,默认为READONLYDATA定义数据段,默认为READWRITEREADONLY指定本段为只读READWRITE指定本段为可读可写ALIGN=nn的取值范围为0~31,本段装入时首地址的对齐方式为2n,默认为字对齐,即n=2COMMON定义一个通用数据段,各个源文件中同名的COMMON段共享一段存储单元。使用示例:

AREAtest,CODE,READONLY,ALIGN=4

该伪指令定义了一个代码段,段名为test,属性为只读,装入内存时,要求从A3A2A1A0为0000单元开始装入该段。

一个汇编程序至少应该有一个代码段,由具体的设计需求,也可由多个代码段和数据段组成,多个段在程序汇编链接时最终形成一个可执行的映象文件。可执行映象文件通常由以下几部分构成:

①一个或多个代码段,代码段的属性为只读。②零个或多个包含初始化数据的数据段,数据段的属性为只读。③零个或多个不包含初始化数据的数据段,数据段的属性为可读写。第4章基于ARMCortexM3IP核的程序设计---数据定义伪指令4.2.2数据定义伪指令在ARM汇编器中,数据定义伪指令用于在汇编代码中定义和初始化数据。这些指令可以帮助程序员在代码中定义常量、数组、字符串、文字池等数据或开辟储存空间,以便在程序执行过程中使用。一些常用的ARM汇编器数据定义伪指令如下表所示:使用示例:

AREAMYDATA1,DATA,READONLY,ALIGN=4 my_byte DCB 0x12,0x88my_halfwordDCW 0x1234my_word DCD 0x12345678my_doublewordDCQ 0x123456789ABCDEF0序号伪指令名作用应用示例1字节定义伪指令DCB(DefineConstantByte)定义字节常数my_byteDCB0x12,0x882字定义伪指令DCW(DefineConstantWord)定义半字(两个字节)常数my_halfwordDCW0x12343双字定义伪指令DCD(DefineConstantDoubleword)定义字(四个字节)常量my_wordDCD0x123456784八字节定义伪指令DCQ(DefineConstantQuadword)定义双字(八个字节)常量my_doublewordDCQ0x123456789ABCDEF06SPACE伪指令在数据区域分配指定数量的未初始化的连续内存空间见例4.2,:SPACE1024*5;分配

1024*5字节的连续内存空间7LTORG在当前位置自定义文字池见例4.2第4章基于ARMCortexM3IP核的程序设计---段定义伪指令my_bytemy_doublewordmy_wordmy_halfwordLTORGLTORG用于声明一个文字池,用来存放常量,特别是不符合8位位图数据标准的常数。第4章基于ARMCortexM3IP核的程序设计---伪指令使用“LTORG”伪指令在此处开辟文字池;注意此时出现的警告信息:mycode.s(9):warning:A1471W:DirectiveLTORGmaybeinanexecutableposition第4章基于ARMCortexM3IP核的程序设计---程定义伪指令4.2.3过程定义伪指令过程(或称为子程序、函数)在程序设计中扮演着重要的角色。它们允许将代码划分为逻辑上独立的块,每个块执行特定的任务。这样做的好处包括提高代码的可读性、可维护性和可重用性。语法格式:过程名 PROC ;过程体

BX LR ENDPPROC伪指令开始定义一个过程,ENDP用于结束过程定义。注意:若使用了PROC和ENDP伪指令,过程应该放到另一个代码段中,否则执行有问题;若不使用这两个伪指令(也能完成过程的功能),可与与被调代码在同一个段中。li4_4_Procedure图4.3过程定义伪指令举例调用过程ADDR0R1定义过程ADDR0R1第4章基于ARMCortexM3IP核的程序设计---段定义伪指令4.2.4宏定义伪指令在ARM汇编中,宏定义允许开发者定义一个可重用的代码片段,并在需要的地方通过调用这个宏来插入该代码片段。宏定义可以简化代码的编写,减少重复,并提高代码的可读性和可维护性。通过使用宏定义,开发者可以更容易地组织和管理汇编代码,特别是在处理复杂的算法或重复的任务时。语法格式:

MACRO

宏名 [$参数1][,$参数2]……

宏体

MENDMACRO伪指令开始定义一个宏,引用宏时需使用宏名,并传递实参。MEND用于结束宏定义。使用示例:

例如:以下定义一个宏,实现参数x与参数y相加结果放在参数z中,三个参数均为寄存器操作数。宏定义: MACRO ADDXY$X,$Y EOR R0,R0 ADD R0,R0,$X ADD R0,R0,$Y MEND宏调用:

MOV R1,#1 MOV R2,#2 MOV R3,#3 ADDXY R1,R2 ;R0寄存器的值为3 ADDXY R1,R3 ;R0寄存器的值为4 ADDXY R2,R3 ;R0寄存器的值为5li4_4_macro第4章基于ARMCortexM3IP核的程序设计---段定义伪指令4.2.5其他伪指令(1)ALIGN

作用:设置对齐方式。它用于确保后续的代码或数据按指定的边界对齐,以提高性能或满足特定的硬件要求。语法格式:ALIGN=expression

其中,expression是一个数值,表示对齐的边界值,例如ALIGN=4表示地址边界的低4位为0。---定义段时对段起始地址的要求若是在定义变量时对变量起始地址的要求,格式为:ALIGNn;2x=n,x为低位为0的位数,如n=256,则下面变量的起始地址低8位为0(2)ENTRY作用:指定程序的入口点。它告诉链接器程序的执行应该从哪里开始。每个工程都要有一个入口,在汇编语言源程序中使用ENTRY伪指令指定程序入口。在C或C++程序中则是用main()函数来指定程序入口。语法格式:ENTRY(3)END

作用:标记汇编程序的结束。它告诉汇编器汇编语言源程序的结束位置。语法格式:END(4)EQU作用:用于定义符号常量,为一个符号赋一个地址、常数或者表达式。类似于在C中使用#define来定义常量。语法格式:symbol EQU expression其中symbol是要定义的符号名称,expression是一个常数、地址或者表达式,用来给符号赋值。例如,下面两条语句实现把常量2赋给符号abc,把地址label+8赋给符号xyz。STACK_TOP EQU 0x20005000Abc EQU 2 xyz EQU label+8 第4章基于ARMCortexM3IP核的程序设计---段定义伪指令4.2.5其他伪指令(5)EXPORT与GLOBAL作用:EXPORT和GLOBAL伪指令都是用来声明当前程序中的符号(标号名、变量名、过程名等)为全局符号,使得这些符号可以在其他编译单元中被引用。这两个伪指令的作用是等价的。语法格式:EXPORT/GLOBAL symbol_name其中,symbol_name是要导出的符号的名称。例如下面程序在名为Example的代码段中定义了一个过程Doadd,为了使该过程能够被外部别的模块调用,使用“EXPORTDoAdd”进行了允许导出的声明。

AREAExample,CODE,READONLY

EXPORT DoAdd

;Exportthefunctionnametobeusedbyexternalmodules.DoAdd ADDr0,r0,r1(6)IMPORT

与EXTERN作用:IMPORT和EXTERN伪指令用来导入在别的模块中定义的符号(标号名、变量名、过程名等),从而使得在当前文件中可以引用这些在其他文件中定义的符号。

这两个伪指令的区别在于,IMPORT无条件导入符号,不论该符号是否在当前程序中引用;而EXTERN只有在当前程序中引用该符号时,才使用EXTERN导入符号。语法格式:IMPORT/EXTERN symbol_name其中,symbol_name是要导入的符号的名称。例如下面程序在名为MYCODE的代码段中调用位于其他模块中名为fun1的过程,使用“IMPORTfun1”进行了允许导入的声明。

IMPORT fun1 AREA MYTEST, CODE, READONLY

ENTRY

Start MOV R0,#5

LDR R10,=fun1 BLX R10Deadloop B deadloop 语句的格式ARM汇编语言程序的每行语句由1~4部分组成。[LABEL] OPERATION[OPERAND] [;COMMENT]标号域 操作助记符域操作数域 注释域第4章基于ARMCortexM3IP核的程序设计---汇编语言的规范语句书写时需遵循以下规则所有标号必须在一行的顶格书写,其后不需要添加“:”号;所有的指令均不能顶格写;每一条指令的助记符可以全部用大写、或全部用小写,但不能在一条指令中大、小写混用。注释使用分号“;”。第4章基于ARMCortexM3IP核的程序设计---汇编语言的规范标号

在汇编语言程序设计中,可以使用各种标号表示指令的目标地址。例如:Loop1 LDR R3,[R0],#4 …… BNE loop1 ;如果ZF不为1,则转向loop1处

以下为标号命名规则:标号不应与系统保留字(指令或伪指令)同名标号在其作用范围内必须唯一。标号区分大小写,同名的大、小写标号被视为两个不同的标号。第4章基于ARMCortexM3IP核的程序设计---汇编语言的规范常量和变量

程序中的常量是指其值在程序的运行过程中不能被改变的量,变量是指其值在程序的运行过程中可以改变的量。ARM汇编程序支持逻辑量、数字和字符串。数字一般为32位的整数,无符号数取值范围为0~232-1,带符号数取值范围为-231~231-1。逻辑量只有两种取值:真或假。字符串用于在程序的运行中保存一个字符串,其长度不应超出字符串变量所能表示的范围。第4章基于ARMCortexM3IP核的程序设计---汇编语言的规范基于ARMCortexM3IP核的程序设计(1)4.1ARM汇编语言的程序结构4.2ARM汇编器伪指令 4.2.1段定义伪指令 4.2.2数据定义伪指令 4.2.3过程定义伪指令 4.2.4宏定义伪指令 4.2.5其他伪指令4.3ARM汇编语言程序设计

4.3.1顺序程序

4.3.2分支程序

4.3.3循环程序

4.3.4过程(子程序)调用第4章基于ARMCortexM3IP核的程序设计---学习内容4.2.1顺序程序 已知32位字变量X=1,Y=2,要求实现Z=X+Y,结果存放在Z中。

EXPORT mycode AREA ADDCODE,CODE,READONLY

mycode LDR R0,=X LDR R1,[r0] LDR R0,=Y LDR R2,[r0]

ADD R1,R2

LDR R0,=Z STR R1,[R0]deadloop B deadloop

AREA MYDATA1,DATA,READONLY X DCD 1Y DCD 2 AREA MYDATA2,DATA,READWRITEZ DCD 0 END第4章基于ARMCortexM3IP核的程序设计---顺序结构li4_5_shunxu问题:变量X和Y存放在存储空间的什么位置?变量Z存放在存储空间的什么位置?4.2.2分支程序

例4.6

在数据段中定义变量X1并赋初值(本例赋值为5),判断X1的值是偶数还是奇数,若为偶数,给变量X2送0,若为奇数,给变量X2送1。

EXPORTmycode

AREA ADDCODE,CODE,READONLY

mycode LDR R0, =X1 LDR R1, [R0] TST R1, #1 BEQ _even MOV R2, #1 B _end _even MOV R2,#0 _end LDR R0, =X2 STR R2, [R0] deadloop B deadloop AREA MYDATA1,DATA,READONLY X1 DCD 5 AREA MYDATA2,DATA,READWRITEX2 DCD 0 END第4章基于ARMCortexM3IP核的程序设计---分支结构li4_6_Branch4.2.3循环程序设计计数控制:当循环次数已知时,通常使用计数控制法。

MOV Rn,#N ;循环初值部分

… LOOPA … ;循环体

… … SUBS Rn,Rn,#1 ;修改部分

BGT LOOPA ;控制部分 直到Rn=0时,循环结束。第4章基于ARMCortexM3IP核的程序设计---循环程序设计

结束条件已知:每循环一次计数其加一,直到满足结束条件时结束。

MOV Rn,#0 ;循环初值部分

… LOOPA … ;循环体

… … ADDS Rn,Rn,#1 ;修改部分

CMP Rn,#N BNE LOOPA ;控制部分 直到Rn=N时,循环结束。第4章基于ARMCortexM3IP核的程序设计---循环程序设计例4.7字节型变量xx中存放了10无符号数,从中找出最大者送入yy单元中。

EXPORTmycode AREA MYADD, CODE, READONLY mycode LDR R0,=xx MOV R1,#0 MOV R2,#10 loop1 LDRB R3,[R0],#1 CMP R1,R3 BHS LOOP2 MOV R1,R3LOOP2 SUBS R2,R2,#1 BNE loop1 LDR R0,=yy STRB R1,[R0] deadloop B deadloop

AREA MYDATA1,DATA,READONLY xx DCB 1,2,3,4,5,10,6,7,8,9 AREA MYDATA2,DATA,READWRITEyy DCB 0 END第4章基于ARMCortexM3IP核的程序设计---循环程序设计举例li4_7_loop1问题:xx变量存4G空间的哪个区域?yy变量存4G空间的哪个区域?例如:编制程序使S=1+2*3+3*4+4*5+…+N(N+1),直到N等于10为止。

EXPORTmycode AREA ADDCODE,CODE,READONLY mycode MOV R0,#0 MOV R1,#1 MOV R2,#0 MOV R3,#1 LDR R4,=X LDR R5,[R4] ADD R5,#1 REPEAT ADD R0,R1 ADD R2,#1 ADD R3,#1 MUL R1,R2,R3 SUBS R5,#1 BNE REPEAT LDR R4,=Y STR R0,[R4]deadloop B deadloop AREA FZDATA1,DATA,READONLYX DCD 10 AREA FZDATA2,DATA,READWRITEY DCD 0 END第4章基于ARMCortexM3IP核的程序设计---循环程序设计举例5_5问题:X变量存4G空间的哪个区域?Y变量存4G空间的哪个区域?程序的功能?条件控制:有些情况下,循环次数事先无法确定,但它与某些条件有关。例4.8

计算1+2+3+……+n,当计算结果大于等于10000时停止循环,在数据段中定义sum和n两个变量,并将加法和存放到sum单元,将最后一个加数存放到n单元。

第4章基于ARMCortexM3IP核的程序设计---循环程序设计举例

EXPORTmycode AREA MYADD,CODE,READONLY Mycode MOV R0, #0 MOV R1, #0 addnum ADD R1, R1, #1 ADD R0, R0, R1 LDR R2,=10000 CMP R0,R2 BLO addnum Stop LDR R2, =sum STR R0, [R2] LDR R2, =n STR R1, [R2]

deadloop B deadloop

AREA NUM, DATA, READWRITE sum DCD 0n DCD 0 END第4章基于ARMCortexM3IP核的程序设计---循环程序设计举例li4_8_loop2多重循环第4章基于ARMCortexM3IP核的程序设计---多重循环多重循环即循环体内嵌套循环。设计时可以从外层循环到内层循环,一层一层的进行。通常在设计外层时,仅把内层看成一个处理粗框,然后再将该粗框细化成置初值、工作、修改和控制等四个部分。例:在以BUF为首地址的字存储区中存放有10个无符号数0x0FF,0x00,0x40,0x10,0x90,0x20,0x80,0x30,0x50,0x70现需将他们按从小到大的顺序排列在BUF中,使编写其程序。分析:“冒泡排序法”。 寄存器分配如下:

R0:指示缓冲区初始地址

R1:外循环计数器

R2:内循环计数器

R3:外循环地址指针

R4:内循环地址指针

R5:内循环下一个数地址指针

R6:存放内循环一轮比较的最小值

R7:存放内循环取出的下一个比较值源程序如下:N EQU 10 AREA BlockData1,DATA,READONLYBUF1 DCD 10,9,8,7,6,5,4,3,2,1 AREA BlockData2,DATA,READWRITEBUF2 SPACE 80 END第4章基于ARMCortexM3IP核的程序设计---多重循环

EXPORTmycode AREA ADDCODE,CODE,READONLY Mycode LDR R0,=BUF1 LDMIA R0!,{R1-R10} LDR R0,=BUF2 STMIA R0!,{R1-R10}

LDR R0,=BUF2 ;指向数组的首地址

MOV R1,#0 ;外循环计数器

MOV R2,#0 ;内循环计数器LOOPI ADD R3,R0,R1,LSL#2 ;外循环首地址放入R3 MOV R4,R3 ;内循环首地址放入R4 ADD R2,R1,#1 ;内循环计数器初值

MOV R5,R4 ;内循环下一地址初值

LDR R6,[R4] ;取内循环第一个值R4LOOPJ ADD R5,R5,#4 ;内循环下一地址值

LDR R7,[R5] ;取出下一地址值R7 CMP R6,R7 ;比较

BLT NEXT ;小则取下一个

;SWP R7,R6,[R5] ;大则交换,最小值R6---用以下两条指令替换

ldr r7,[r5] str r6,[r5] MOV R6,R7 ;R6

温馨提示

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

最新文档

评论

0/150

提交评论