当前位置:
文档之家› 第四章 ARM汇编语言程序设计
第四章 ARM汇编语言程序设计
示例:
DataSpace SPACE 100
• MAP
格式:MAP 表达式 {,基址寄存器}
功能:MAP伪操作用于定义一个结构化的内存表首地
址。表达式可以为程序标号或数值表达式,基
址寄存器为可选项,当基址寄存器选项不存在
时,表达式的值即为内存表的首地址。否则,
内存表的首地址为表达式的值与基址寄存器的 和。也可以用 “^‖代替。 示例: MAP 0x100,R0 ;首地址的值为0x100+R0
(1)建立算法使用的数据结构
1)数据将存放在存储器还是存放在寄存 器中? 2)数据类型是字节、半字或字? 3)有多少数据项?
4)数据为无符号数还是符号数?
(2)在代码段开始处写出变量、段寄存器、外围设
备等所需要的初始化指令 (3)选择实现算法中每一主要动作所需要的指令,
并决定数据在这些指令中的存放形式。
EDITOR PROGRAM2
EDITOR PROGRAMn
ASSEMBLER PROGRAM
ASSEMBLER PROGRAM
ASSEMBLER PROGRAM
LINKER PROGRAM
myfile.exe
汇编语言程序设计的基本方法(战术上看)
程序设计步骤(对每一模块)
1. 2. 3. 4. 问题定义 算法设计 选择指令 编写程序
第四章 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
用来表示程序设计问题的操作序列或步骤——算法,
即“怎样做?”。 表示方法:1)流程图 2)伪指令
开始
从传感器 读数值
加7
存储结果
延时1小时
否 24个样本了吗? 是
结束
3. 选择适当的指令(按功能)
一、数据传送类指令 二、算术运算指令 三、逻辑操作指令 四、程序控制指令
4. 编写程序(从算法到程序)
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
示例:
Str DCB ―This is a test!‖
• DCW
格式:标号 DCW 表达式
功能:DCW伪操作用于分配一片连续的半字存储单 元,并用伪操作中指定的表达式初始化。其 中,表达式可以为程序标号或数值表达式。用 DCW分配的存储单元是半字对齐的。 示例: DataTest DCW 1,2,3
(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
• FIELD
格式:标号 FIELD 表达式
功能: FIELD伪操作用于定义一个结构化的内存表中 的数据域。表达式的值为当前数据域在内存表中 所占的字节数。 FIELD伪操作常与MAP配合使用 来定义结构化的内存表。注意:MAP和FIELD仅 用于定义数据结构,并不实际分配存储单元。
FIELD也可以用 “#‖代替。
结构化程序设计(算法设计)
1. 顺序结构
2. 分支结构 3. 循环结构 4. 子程序设计
上机过程(具体实现)
1. 编辑程序 2. 汇编源程序
3. 链接程序
4. 调试源程序
结构化程序设计概述:
写任何程序最成功的方式是先人工的解决问题——找出算
法!
用结构
IF—THEN—ELSE, CASE, REPEAT—UNTIL, WHILE—DO,
功能:ALIGN可通过添加填充字节的方式,使当前位臵满足 一定的对齐方式。其中,表达式的值用于指定对齐方式, 可能取的值为2的幂,如1、2、4、8、16等。如果没有指 定表达式,则将当前位臵对齐到下一个字的位臵。 … ADD R0,R4,R5 B START
DATA1
DCB ―strin‖
ALIGN 4
已知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
•汇编控制伪操作(Assembly Control)
•框架描述伪操作(Frame Description) •其他伪操作(Miscellaneous)
数据定义伪操作
数据定义伪操作用于为特定的数据分配存储单元,同时可完
成已分配存储单元的初始化。
DCB 分配一片连续的字节存储单元并初始化。
DCW
DCD SPACE MAP FIELD
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
[表达式[,偏移量]
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
B
;相当于LDR R5,[PC,#4]
其它常用的伪操作
• AREA
格式:AREA 段名 属性1,属性2,…
功能:AREA伪操作定义一个代码段、数据段或特定属性的段。 CODE: 定义代码段。 DATA: 定义数据段。 READONLY: 只读,代码段默认。 READWRITE: 可读可写,数据段默认。 一个汇编程序至少包含一个段,当程序太长时,也可以将程 序分为多个代码段和数据段。
分支程序设计: 已知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
由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
• DCD
格式:标号 DCD 表达式
功能:DCD伪操作用于分配一片连续的字存储单
元,并用伪操作中指定的表达式初始化。其
中,表达式可以为程序标号或数值表达式。用
DCD分配的存储单元是字对齐的。DCD也可
以用 “&‖代替。
示例:
Test DCD
4,5,6
• SPACE
格式:标号 SPACE 表达式 功能:SPACE伪操作用于分配一片连续的存储区 域并初始化为0。其中,表达式为要分配的字 节数。SPACE也可以用 “%‖代替。
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
4.1.2 汇编语言的语句格式