八、ARM 汇编程序格式和程序控制

发布时间:2023-07-11  

8.1 汇编程序格式

  • 源程序中的语句可以分为两种类型:指令性语句、指示性语句

  • 指示性语句就是一些伪操作,在 MDK 编译环境下的伪操作有下面几种:

    • 符号定义伪操作

    • 数据定义伪操作

    • 汇编控制伪操作

    • 其他伪操作

8.1.1 符号定义伪操作

  • 符号定义伪操作用于定义 ARM 汇编程序中的 “变量”,此变量不会在内存上分配空间,只是用来辅助编译器工作,帮助我们用于循环控制、逻辑运算和条件判断等等操作

    • 用于定义全局变量的 GBLA、GBLL 和 GBLS

    • 用于定义局部变量的 LCLA、LCLL 和 LCLS

    • 用于对变量赋值的 SETA、SETL、SETS

    • 为一个通用寄存器列表定义别名:RLIST(List    RLIST {R0-R3})

    • 为一个协处理器的寄存器定义名称:CN  (Power    CN   6)

    • 为一个协处理器定义名称:CP

    • 为一个双精度的 VFP 寄存器定义名称:DN

    • 为一个单精度的 VFP 寄存器定义名称:SN

    • 为一个浮点寄存器定义名称:FN

  • 注意:全部变量用于程序体中,而局部变量用于宏定义中,常用于循环控制,逻辑运算,条件判断中,不会分配空间,这些变量是在编译器的预处理阶段进行的。

8.1.2 数据定义伪操作

  • 数据定义伪操作:用于为特定的数据分配存储单元, 同时可完成已配存储单元的初始化

  • DCD DCW DCB:用于分配一片连续的字、半字、字节的存储单元并用指定的数据初始化(初始化的全局数组)

  • SPACE:用于分配一片连续的存储单元,并用 0 初始化(相当于 C 语言中的未初始化全局数组)

  • MAP:用于定义一个结构化的内存表首地址,与 FIELD 配合使用(相当于 C 语言中的结构体)

  • FIELD:用于定义一个结构化的内存表中的数据域

  • LTORG:用于声明一个数据缓冲池(文字池) 的开始,如果没有使用 LTORG 声明文字池,则汇编器会在程序末尾自动声明


1 Str DCB "This is Test!" Data DCD 1,2,3

2 DataSpace SPACE 10

3 MAP 0x40000000

4 A FIELD 4

5 B FIELD 4

6 符号描述: DCB(=) DCD(&) SPACE(%) MAP(^) FILED(#)

8.1.3 汇编控制伪操作

  • 汇编控制伪操作:用于控制汇编程序的执行流程,如: 条件汇编、 宏定义、 重复汇编控制等

  • IF 、 ELSE 、 ENDIF ([ | ])

  • WHILE 、 WEND

  • MACRO 、 MEND 、 MEXIT


1 CONFIG EQU 16 MACRO

2 IF {CONFIG}=16 MAX $data1,$data2

3 ADD R0,R0,R1 ......

4 ELSE MEND

5 SUB R0,R0,R1 MAX 1,2

6 ENDIF

8.1.4 其他伪操作

  • AREA--用于定义一个代码段或数据段

  • ALIGN--通过添加填充字节的方式, 定义边界对齐方式, 默认的情况下, 代码段和数据段是 4 字节对齐的

  • CODE16、 CODE32--伪操作通知编译器, 其后的指令序列通过 16 位的还是 32 位来编译

  • ENTRY --用于指定汇编程序的入口

  • END--用于通知编译器已经到了源程序的结尾

  • EQU--用于为程序中的数字常量、 标号等定义一个等效的字符名称, 相当于 C 中的 define

  • EXPORT(或 GLOBAL ) --用于在程序中声明一个全局的标号

  • IMPORT(EXTERN ) --用于通知编译器要使用一个在其他的源文件中定义的标号

  • GET (或 INCLUDE ) --用于将一个源文件包含到当前的源文件中

  • 例子:

  • AREA Buf,DATA,READWRITE ;符号 AREA 和 END 都不能顶格写, 只有标号可以而且必须顶格写

  • 注意:

    • 伪操作不会产生机器指令, 它是辅助编译器工作的, 在不同环境下伪代指令的描述是不一样的(对比 GNU)符号可以代表地址、 数值、 变量

    • 当符号代表地址时又称为标号,符号代表某个特定数值时又称为符号常量,符号代表变量时又称为变量名

    • 标号: 基于 PC, 基于寄存器(MAP R0), 绝对地址

    • 常量: 与 EQU 搭配使用

    • 变量: 变量名是一个符号地址, 系统会给每一个变量名分配一个内存地址

    • 在 MDK 中的伪操作都可以通过 Help - uVision Help(ARM Development Tools) 查找

8.2 程序控制

  • 顺序结构: 程序流程无分支, 无循环, 无转移, 以直线方式一条指令接着一条指令顺序执行

  • 选择结构: 根据不同的条件, 分成若干个分支路, 配合条件码使用

  • 循环结构: 在顺序和选择控制中, 任一语句执行次数最多一次, 循环控制中可以多次。

  • 循环结构一般分成四部分: 1, 初值 2, 循环体 3, 修改初值 4, 判断条件

  • 在 MDK 中的伪操作都可以通过 Help - uVision Help(ARM Development Tools) 查找

  


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>