- 1、本文档共68页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章 ARM汇编语言程序设计基础
目 录
4.1 ARM汇编语言的程序结构
4.2 ARM汇编语言程序设计
4.3 C与汇编混合编程
本章小结
2
4.1 ARM汇编语言的程序结构
本章通过一个完整的ARM汇编例子入手,给出了ARM汇编程序的基本框架,并详细介绍了编写汇编程序常用的汇编器伪指令,具备了这些基础知识,学生就能自己动手编写汇编程序。
4.1.1 一个简单的ARM汇编程序例子
4.1.2 汇编器伪指令
4.1.3 汇编语言的规范
4.1.1 一个简单的ARM汇编程序例子
4
一段完整的ARM汇编语言程序,由若干个段组成,段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的变量。
程序框架可抽象如下:
AREA 代码段名字, CODE, READONLY
ENTRY
CODE32
;添加用户代码
AREA 数据段名字, DATA, READWRITE
;添加用户数据
END
指令和汇编器伪指令的比较
① 指令语句:在汇编后能产生目标代码的语句,CPU可以执行并能完成一定的功能,例如MOV,ADD等;
② 汇编器伪指令:在汇编后不产生目标代码的语句,仅在汇编过程中告诉汇编器如何汇编。汇编器伪指令的作用包括:定义数据、分配存储区、定义段、定义宏、定义子程序等。一旦汇编结束,它们的使命就完成了。
4.1.2 汇编器伪指令
在 ARM 的汇编程序中,有如下几种汇编器伪指令:符号定义伪指令,数据定义伪指令,段定义伪指令,模块控制伪指令,汇编控制伪指令,宏处理伪指令等。
段定义相关伪指令
AREA
语法格式: AREA 段名 属性1, 属性2, ……
程序4-1中使用如下语句定义段:
AREA MAIN, CODE, READONLY ;定义代码段,名字为MAIN
AREA NUM, DATA, READWRITE ;定义数据段,名字为NUM
AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头,则该段名需用 “ | ” 括起来,如 |1_data| 。属性字段表示该代码段(或数据段)的相关属性,例如:CODE(定义代码段),DATA(定义数据段),READONLY(只读),READWRITE(读写)。多个属性用逗号分隔。
一个汇编程序至少应该有一个代码段,由具体的设计需求,也可由多个代码段和数据段组成,多个段在程序汇编链接时最终形成一个可执行的映象文件。可执行映象文件通常由以下几部分构成:
① 一个或多个代码段,代码段的属性为只读。
② 零个或多个包含初始化数据的数据段,数据段的属性为可读写。
③ 零个或多个不包含初始化数据的数据段,数据段的属性为可读写。
ENTRY
ENTRY用于指示程序的入口,其后紧跟着第一条可执行语句。
CODE16/CODE32
CODE16用于通知汇编器,本语句后面的指令序列为16位的Thumb指令。CODE32用于通知汇编器,本语句后面的指令序列为32位的ARM指令。
END
END用于指示程序的结束,每一个汇编源程序都必须以END语句结束,以通知汇编器结束汇编。
2. 数据定义伪指令
DCB(Define ? Byte)
语法格式(方括号内的内容为可选项):
标号 DCB 表达式 [, 表达式]……
DCB用于在内存中分配一片连续的字节单元,并用表达式进行初始化。每个表达式可以是数字或字符串,数字的范围在0~255内,也可以为算术表达式,例如:
Str DCB “Hello World!”
num_b DCB 2+3, 3*5
字符串只能用DCB定义。
DCW(Define ? Word)
语法格式:标号 DCW 表达式 [, 表达式]……
DCW用于在内存中分配一片连续的半字单元,并用指定的表达式进行初始化。这些分配的内容是半字对齐的。其中表达式可以为程序标号或者数字表达式。例如:
num_w DCW 0x1234,0x5678
DCD(Define ? Double word)
语法格式:标号 DCD 表达式 [, 表达式]……
DCD用于在内存中分配一片连续的字单元,并用指定的表达式进行初始化。这些分配的内容是字对齐的。其中表达式可以为程序标号或者数字表达式。例如:
num_d DCD -5,0x90abcdef
SPACE
语法格式:标号 SPACE 表达式
SPACE用于分配一片连续的存储区域并初始化为0。其中,表达式为要分配的字节数。例如:
data SPACE 1024 ;分配1024个字节空间并初始化为0
LTORG
LTORG用于声明一个文字池,用来存放常量,特别是不符合8位位图数据标准的常数。其使用情景及
文档评论(0)