第四章 ARM汇编语言程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LDR
R1,
[R0] ;将A的内容读到R1
(2)表达式是一个数值,是一个相对地址的内存表:
MAP 0x04 ,R9 A FIELD 4 ;首地址为R9的值 ;A的长度为4字节,相对位臵为0
B
S ….
FIELD 8
FIELD 96 R9, R0, R2, R9, R1, R9,
;B的长度为8字节,相对位臵为4
用来表示程序设计问题的操作序列或步骤——算法,
即“怎样做?”。 表示方法:1)流程图 2)伪指令
开始
从传感器 读数值
加7
存储结果
延时1小时
否 24个样本了吗? 是
结束
3. 选择适当的指令(按功能)
一、数据传送类指令 二、算术运算指令 三、逻辑操作指令 四、程序控制指令
4. 编写程序(从算法到程序)
EDITOR PROGRAM2
EDITOR PROGRAMn
ASSEMBLER PROGRAM
ASSEMBLER PROGRAM
ASSEMBLER PROGRAM
LINKER PROGRAM
myfile.exe
汇编语言程序设计的基本方法(战术上看)
程序设计步骤(对每一模块)
1. 2. 3. 4. 问题定义 算法设计 选择指令 编写程序
由MAP和FIELD配合定义的内存表有3种:
(1)表达式是一个基于绝对地址的内存表:
MAP 0x100 ;首地址为0x100
A FIELD 4 ;A的长度为4字节,位臵为0x100 B FIELD 4 ;B的长度为4字节,位臵为0x104 S FIELD 16 ;S的长度为16字节,位臵为0x108 …. LDR R0, =A ;读取A的地址0x100
• FIELD
格式:标号 FIELD 表达式
功能: FIELD伪操作用于定义一个结构化的内存表中 的数据域。表达式的值为当前数据域在内存表中 所占的字节数。 FIELD伪操作常与MAP配合使用 来定义结构化的内存表。注意:MAP和FIELD仅 用于定义数据结构,并不实际分配存储单元。
FIELD也可以用 “#‖代替。
(4)按照主要指令的要求,用LDR、STR指令或MOV 指令把数据送到正确的位臵。
顺序程序设计: 已知32位变量X、Y存放在存储器的地址0x90010、 0x90014中,要求实现Z=X+Y,并且Z的值存放在 0x90018中。 AREA Exam,CODE,READONLY ENTRY START LDR R0,=0x90010 LDR R1,[R0], #4 LDR R2,[R0],#4 ADD R1,R1,R2 STR R1,[R0] END
功能:ALIGN可通过添加填充字节的方式,使当前位臵满足 一定的对齐方式。其中,表达式的值用于指定对齐方式, 可能取的值为2的幂,如1、2、4、8、16等。如果没有指 定表达式,则将当前位臵对齐到下一个字的位臵。 … ADD R0,R4,R5 B START
DATA1
DCB ―strin‖
AHale Waihona Puke BaiduIGN 4
分配一片连续的半字存储单元并初始化。
分配一片连续的字存储单元并初始化。 分配一片连续的存储单元并初始化为0。 定义一个结构化的内存表首地址。 定义一个结构化的内存表的数据域。
• DCB
格式:标号 DCB 表达式
功能:DCB伪操作用于分配一片连续的字节存储单 元,并用伪操作中指定的表达式初始化。其 中,表达式可以为0~255的数值或字符串。 DCB也可以用“=‖代替。
分支程序设计: 已知32位有符号数X存放在存储器的地址0x90010 中,要求实现: Y=X (X〉=0)或 Y=-X (X<0) AREA Exam CODE READONLY ENTRY START LDR R1,=0x90010 LDR R2,[R1] MOV R0,#0 CMP R2,R0 SUBLT R2,R0,R2 STR R2,[R1] END
LINKER PROGRAM
myfile.map myfile.exe
4.4 汇编语言程序设计
4.3.1 程序设计步骤 4.3.2 简单程序设计(顺序、分支、循环) 4.3.3 子程序设计 4.3.4 模式切换程序设计 4.3.5 汇编语言和C语言编程
客观世界的算法
客观世界的 对象和操作
客观世界的对象
结构化程序设计(算法设计)
1. 顺序结构
2. 分支结构 3. 循环结构 4. 子程序设计
上机过程(具体实现)
1. 编辑程序 2. 汇编源程序
3. 链接程序
4. 调试源程序
结构化程序设计概述:
写任何程序最成功的方式是先人工的解决问题——找出算
法!
用结构
IF—THEN—ELSE, CASE, REPEAT—UNTIL, WHILE—DO,
START
LDR
R0,[R5]
4.3 汇编语言上机过程 1. 编辑汇编语言源程序 2. 编译源程序 3. 链接汇编程序 4. 调试汇编程序
EDITOR PROGRAM
myfile.asm
ASSEMBLER PROGRAM
myfile.lst myfile.obj myfile.crf Other obj files
示例:
Str DCB ―This is a test!‖
• DCW
格式:标号 DCW 表达式
功能:DCW伪操作用于分配一片连续的半字存储单 元,并用伪操作中指定的表达式初始化。其 中,表达式可以为程序标号或数值表达式。用 DCW分配的存储单元是半字对齐的。 示例: DataTest DCW 1,2,3
AREA Init,CODE,READONLY
ENTRY
… B START
AREA Stack,DATA,READWRITE SAVE START SPACE 20 AREA Init,CODE,READONLY ADD R1,R2,R3
…
… B START
• ALIGN
格式:ALIGN
[表达式[,偏移量]
Start
AREA Init, CODE, READONLY ENTRY Start LDR R0, =0x3FF5000 LDR R1, 0xFF BL PRINT_TEXT …. …. PRINT_TEXT …. …. MOV PC, LR END
;FULL SEGMENT DEFINITION-----Intel 8086 ;-----stack segment-------STACK SEGMENT DB 64 DUP(?) STACK ENDS ;-----data segment-------DATA SEGMENT ;data definitions are placed here DATA ENDS ;-----code segment-------CODE SEGMENT MAIN PROC FAR ASSUME CS: CODE, DS: DATA, SS: STACK MOV AX, DATA MOV DS, AX - ----MOV AH, 4CH INT 21H MAIN ENDP CODE ENDS END MAIN
第四章 ARM汇编语言程序设计
4.1 汇编语言程序格式 4.2 ARM汇编器的伪操作
4.3 汇编语言上机过程 4.4 汇编语言程序设计
4.1 汇编语言程序格式
4.1.1 汇编语言程序的组成
AREA Init, CODE, READONLY ENTRY LDR R0, =0x3FF5000 LDR R1, 0xFF STR R1, [R0] LDR R0, =0x3FF5008 LDR R1, 0x01 STR R1, [R0] …. END
FOR—DO
写算法,然后再将该算法翻译成一种合适的程序设计语 言——结构化的程序设计!
程序设计步骤
1.问题的定义 仔细思考程序所要解决的问题,即用自然语言描述 “做什么?以及程序做这些工作时的时序” 如:1.从传感器读取温度值。 2.加上调整因子。 3.将结果存储在存储单元里。 2.算法及表示方法
•汇编控制伪操作(Assembly Control)
•框架描述伪操作(Frame Description) •其他伪操作(Miscellaneous)
数据定义伪操作
数据定义伪操作用于为特定的数据分配存储单元,同时可完
成已分配存储单元的初始化。
DCB 分配一片连续的字节存储单元并初始化。
DCW
DCD SPACE MAP FIELD
(3)表达式是一个标号,基于PC的内存表:
Data SPACE 100 ;分配100字节的内存单元初始化0
MAP Data
A B S …. LDR R5, FIELD 4 FIELD 4 FIELD 4
;首地址为Data内存单元
;A的长度为4字节,相对位臵为0 ;B的长度为4字节,相对位臵为4 ;S的长度为4字节,相对位臵为8
问题空间
程序员对问题的表达 人们对结果的解释
程序设计语言 的对象和操作
解空间
输出数据
计算机的算法
H.Ledgard模型
模块化的程序设计
(从功能分析——战略上)
主模块
模块1
模块2
模块N
库存更新
输入销售 记录
部分库存 更新
输出结果
打印总库 存
打印各部 门库存
打印订货 清单
EDITOR PROGRAM1
B
;相当于LDR R5,[PC,#4]
其它常用的伪操作
• AREA
格式:AREA 段名 属性1,属性2,…
功能:AREA伪操作定义一个代码段、数据段或特定属性的段。 CODE: 定义代码段。 DATA: 定义数据段。 READONLY: 只读,代码段默认。 READWRITE: 可读可写,数据段默认。 一个汇编程序至少包含一个段,当程序太长时,也可以将程 序分为多个代码段和数据段。
(1)建立算法使用的数据结构
1)数据将存放在存储器还是存放在寄存 器中? 2)数据类型是字节、半字或字? 3)有多少数据项?
4)数据为无符号数还是符号数?
(2)在代码段开始处写出变量、段寄存器、外围设
备等所需要的初始化指令 (3)选择实现算法中每一主要动作所需要的指令,
并决定数据在这些指令中的存放形式。
已知32位有符号数X存放在存储器的地址0x90010中,要求 实现:Y=1(X〉0)或 Y=0 (X=0)或Y=-1(X<0) AREA Exam CODE READONLY ENTRY START LDR R1,=0x90010 LDR R2,[R1] CMP R2,#0 BEQ ZERO BGT PLUS MOV R0,#-1 B FINISH LPUS MOV R0,#1 B FINISH ZERO MOV R0,#0 FINISH STR R0,[R1] END
示例:
DataSpace SPACE 100
• MAP
格式:MAP 表达式 {,基址寄存器}
功能:MAP伪操作用于定义一个结构化的内存表首地
址。表达式可以为程序标号或数值表达式,基
址寄存器为可选项,当基址寄存器选项不存在
时,表达式的值即为内存表的首地址。否则,
内存表的首地址为表达式的值与基址寄存器的 和。也可以用 “^‖代替。 示例: MAP 0x100,R0 ;首地址的值为0x100+R0
4.1.2 汇编语言的语句格式
ARM汇编语言程序的每行语句由1~4部分组成。
[LABEL] 标号域 OPERATION 操作助记符域 [OPERAND] 操作数域 [;COMMENT] 注释域
4.2 ARM汇编器的伪操作
•符号定义伪操作(Symbol Definition) •数据定义伪操作(Data Definition )
• DCD
格式:标号 DCD 表达式
功能:DCD伪操作用于分配一片连续的字存储单
元,并用伪操作中指定的表达式初始化。其
中,表达式可以为程序标号或数值表达式。用
DCD分配的存储单元是字对齐的。DCD也可
以用 “&‖代替。
示例:
Test DCD
4,5,6
• SPACE
格式:标号 SPACE 表达式 功能:SPACE伪操作用于分配一片连续的存储区 域并初始化为0。其中,表达式为要分配的字 节数。SPACE也可以用 “%‖代替。
;S的长度为96字节,相对位臵为12 =0x900 A [R0] =0x2000 B [R1] ;表的首地址为0x904 ;读取A的地址0x904 ;将A的内容读到R2 ;同一表的首地址为0x2004 ;读取B的地址0x2008 ;将R9的内容写到B
LDR ADR LDR …. LDR ADR STR