第四章 ARM汇编语言程序设计
第4章ARM汇编语言程序设计.
第4章ARM汇编语言程序设计本章介绍如何编写ARM和thumb汇编语言程序。
同时介绍ARM汇编编译器armasm的使用方法。
4.1伪操作ARM 汇编语言源程序中语句由指令、伪操作和宏指令组成。
在ARM中伪操作称为derective,这里为保持和国内在IBM PC汇编语言中对名词翻译的一致性derective称为伪操作;同样在ARM中宏指令被称为pseudo-instructlon,这里将其称为宏指令,宏指令也是通过伪操作定义的。
本节介绍伪操作和宏指令。
伪操作不像机器指令那样在计算机运行期间由机器执行,它是在汇编程序肘源程序汇编期间由汇编程序处理的。
宏是一段独立的程序代码。
在程序中通过宏指令调用该宏。
当程序被汇编时,汇编程序将对每个宏调用作展开,用宏定义体取代源程序中的宏指令。
本节介绍以下类型的ARM伪操作和宏指令。
●符号定义(Symbol definition伪操作。
●数据定义(Data definition)伪操作。
●汇编控制(Assembly control)伪操作。
●框架描述(Frame description)伪操作。
●信息报告(Reporting)伪操作。
●其他(Miscellaneous)伪操作。
4.1.1符号定义伪操作符号定义(Symbol definition)伪操作用于定义ARM汇编程序中的变量,对变量进行赋值以及定义寄存器名称。
包括以下伪操作。
●GBLA、GBLL及GBLS声明全局变量。
●LCLA.LcLL及LCLS 声明局部变量。
●SETA.SETL及SETS 给变量赋值。
●RLIST为通用寄存器列表定义名称。
●CN为协处理器的寄存器定义名称。
●CP为协处理器定义名称。
●DN及SN为VFP的寄存器定义名称。
FN为FPA的浮点寄存器定义名称。
1 GBLA GBLL及GBLSGBLA GBLL及GBLS伪操作用于声叫个ARM程序中的全局变量,并将其初始化。
GBLA伪操作声明一个全局的算术变量,并将其初始化成0。
第四章 ARM汇编程序设计
R0,=0x3FF5000 R1,0xFF R1,[R0] R0,=0x3FF5008 R1,0x01 R1,[R0] PRINT_TEXT
PRINT_TEXT …… MOV PC,LR …… END
第五节 ARM汇编程序示例
start MOV r0, #3 MOV r1, #3 MOV r2, #2 BL arithfunc stop MOV r0, #0x18 LDR r1, =0x20026 SWI 0x123456 arithfunc CMP r0, #num MOVHS pc, lr ADR r3, JumpTable ADR LDR JumpTable DCD DCD DoAdd ADD MOV DoSub SUB MOV r3, JumpTable pc, [r3,r0,LSL#2] DoAdd DoSub
第一节 ARM汇编指示命令
其他常用的汇编指示命令 – 边界对齐:ALIGN – 段定义:AREA – 指令集定义:CODE16和CODE32 – 汇编结束:END – 程序入口:ENTRY – 常量定义:EQU – 声明一个符号可以被其他文件引用:EXPORT和GLORBAL – 声明一个外部符号:IMPORT和EXTERN
第四节 ARM汇编程序结构
顺序 分支 循环
– –
–
–
MOV r0,#10 loop … SUBS r0,r0,#1 BNE loop
子程序
第四节 ARM汇编程序结构
子程序
AREA ENTRY Start LDR LDR STR LDR LDR STR BL …… Init,CODE,READONLY
第一节 ARM汇编指示命令
ARM汇编语言程序设计基础.ppt
一个汇编程序至少应该有一个代码段,由具体的设计需求,也可由多个 代码段和数据段组成,多个段在程序汇编链接时最终形成一个可执行的 映象文件。可执行映象文件通常由以下几部分构成: ① 一个或多个代码段,代码段的属性为只读。
② 零个或多个包含初始化数据的数据段,数据段的属性为可读写。 ③ 零个或多个不包含初始化数据的数据段,数据段的属性为可读写。
嵌入式系统 原理与应用
第四章 ARM汇编语言程序设计基础
XUPT
目 录
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 汇编语言的规范
;定义代码段,名字为 ;定义数据段,名字为
AREA伪指令用于定义一个代码段或数据段。其中,段名若以数字开头 ,则该段名需用 “ | ” 括起来,如 |1_data| 。属性字段表示该代 码段(或数据段)的相关属性,例如:CODE(定义代码段), DATA(定义数据段),READONLY(只读),READWRITE(读 写)。多个属性用逗号分隔。
num_d
0xFB 0xFF 0xFF 0xFF 0xEF 0xCD 0xAB 0x90
SPACE 语法格式:标号 SPACE 表达式 SPACE用于分配一片连续的存储区域并初始化为0。其中,表达式为 要分配的字节数。例如: data SPACE 1024 ;分配1024个字节空间并初始化为0 LTORG LTORG用于声明一个文字池,用来存放常量,特别是不符合8位位图 数据标准的常数。其使用情景及实例见本章的4.2.1节。
第4章ARM汇编语言程序设计
例 4.9
LCLA Test3 LCLL Test4
使用示例:
Test3 ;声明一个局部的数值变量,变量名为Test3 SETA 0xaa ;将该变量赋值为0xaa Test4 ;声明一个局部的逻辑变量,变量名为Test4 SETL {TRUE} ;将该变量赋值为真
4.2.2数据定义伪操作
DCB DCW(DCWU) DCD(DCDU) DCDO DCI DCQ(DCQU) DCFS(DCFSU) DCFD(DCFDU) SPACE FIELD MAP LTORG
1.AREA
格 式:AREA 段名 属性1,属性2,……
功 能:AREA伪操作用于定义一个代码段、 数据段或特定属性的段。 其中,段名若以数值开头,则该段名需用 “|”括起来,如|1_test|,用C的编译器产生 的代码一般也用“|”括起来。属性字段表示 该代码段(或数据段)的相关属性,多个 属性用逗号分隔。
4.1汇编语言程序格式
• • • • 4.1.1汇编语言的基本概念 4.1.2汇编语言源程序的组成 4.1.3汇编语言程序中常用的符号 4.1.4汇编语言程序中的表达式和运算符
4.1.1汇编语言的基本概念
4.1.2汇编语言源程序的组成
1.汇编语言源程序的结构
AREA Init,CODE,READONLY ENTRY Start LDR R0,=0x3FF5000 LDR R1,#0xFF STR R1,[R0] LDR R0,=0x3FF5008 LDR R1,#0x01 STRR1,[R0] … END
4.1.3汇编语言程序中常用的符号
在汇编语言程序设计中,经常使用各种符号表 示变量、常量和地址 符号由大小写字母、数字以及下划线组成。 符号区分大小写,同名的大、小写符号会被 编译器认为是两个不同的符号。 符号在其作用范围内必须唯一,即在其作用 范围内不可有同名的符号。 自定义的符号名不能与系统的保留字相同。 符号名不应与指令或伪指令同名。
ARM汇编语言程序设计
使用局部标号的例子:
例1 无作用范围字符 01 SUBS r0,r0,#1
BNE %B 01
;每次循环使r0=r0-1 ;跳转到01标号去执行
例2 作用范围字符为NAME
ROUT NAME
; NAME作用范围
01NAME SUBS r0,r0,#1
;每次循环使r0=r0-1
BNE %B 01NAME ;跳转到01NAME标号去执行
Labeladd add r0,r0,r1
;
Str1
SETS
“This is a string.”
BKPT ;断点
标签: welcomefun , strarm , Labeladd, Str1
指令/伪操作/伪指令: STMFD , DCB , add , SETS
操作数:其他部分
9
注意: ARM程序中,指令、伪指令、伪操作、寄存 器助记符可以全部为大写或小写,但大小写不能混合 使用。
; “Welcom to ARM world!”字符串
LDMFD
sp!,{pc}
;恢复寄存器值
7
Adrstrarm ;adrstrarm标签
DCD strarm ;保存strarm的地址
AREA constdatasec, DATA, READONLY,ALIGN=0
;数据段,名称为constdatasec, 属性为只读
ENDP ;函数main结束
EXPORT main
;导出main函数供外部调用
;引入三个C运行时库函数和ARM库
IMPORT _main
IMPORT __main
IMPORT _printf
IMPORT ||Lib$$Request$$armlib||, WEAK
ARM嵌入式系统 第4-1章 ARM汇编语言程序设计
15
符号定义伪指令Ⅳ
3. SETA、SETL、SETS 、 、
格式: 格式:变量名 SETA/SETL/SETS 表达式
说明: 说明:
SETA:给一个数字变量赋值; :给一个数字变量赋值; SETL:给一个逻辑变量赋值; :给一个逻辑变量赋值; SETS:给一个字符串变Ⅳ量赋值; :给一个字符串变Ⅳ量赋值;
在宏内定义局部变量后, 在宏内定义局部变量后,则在宏外使用该指令时编 13 译会出错。 译会出错。
符号定义伪指令Ⅲ
2. GBLA、GBLL、GBLS 、 、
格式: 格式:GBLA/GBLL/GBLS 变量名
伪操作定义一个汇编程序中的全局变量,并初始化, 伪操作定义一个汇编程序中的全局变量,并初始化, 其中: 其中:
Array1 DCB 1,2,3,4,5 ;数组 str1 DCB “Your are welcome!” ;构造 ! 字符串并分配空间。 字符串并分配空间。
22
2. DCW/DCWU:
标号/变量 标号 变量 DCW/DCWU 表达式
DCW分配一段半字存储单元并用表达式值初 分配一段半字存储单元并用表达式值初 始化,它定义的存储空间是半字对齐的。 始化,它定义的存储空间是半字对齐的。 DCWU功能跟 功能跟DCW类似,只是分配的字存储 类似, 功能跟 类似 单元不严格半字对齐。 单元不严格半字对齐。 例如: 例如:
所有的标签必须在一行的开头顶格写, 所有的标签必须在一行的开头顶格写,前面不能留 空格,后面也不能跟C语言中的标签一样加上 ” 语言中的标签一样加上“ 空格,后面也不能跟 语言中的标签一样加上“:”; ARM汇编器对标识符的大小写敏感 书写标号及指 汇编器对标识符的大小写敏感,书写标号及指 汇编器对标识符的大小写敏感 令时字母的大小写要一致; 令时字母的大小写要一致; 注释使用“ ”符号,注释的内容从“ ” 注释使用“;”符号,注释的内容从“;”开始到该 行的结尾结束。 行的结尾结束。 例:
第4章ARM程序设计
第4章ARM程序设计
4
4.1 ARM工程(续)
汇编语言 源文件
C/C++语言 源文件
头文件
汇编器
编译器
目标文件 目标文件
C/C++库文件
连接器
可执行文件
第4章ARM程序设计
5
4.1 ARM工程(续)
ARM提供的开发工具Code Warrior for ARM中包含的编译器如下:
编译器 语言种类 源文件类型 源文件扩展名 目标文件类型
3
4.1 ARM工程(续)
用汇编语言或C/C++语言编写的程序 叫做源程序,对应的文件叫做源文件。
一个ARM工程应由多个文件组成,其 中包括扩展名为.S的汇编语言源文件、扩 展名为.C的C语言源文件,扩展名为.CPP 的C++源文件、扩展名为.H的头文件等。
ARM工程的各种源文件之间的关系, 以及最后形成可执行文件的过程如下:
代码段,当程序较长时,可以分割为
多个 代码段和数据段。
第4章ARM程序设计
12
4.2.1 段(续)
以下是一个汇编语注言意程:序教段材的上基的本结构:
程序有误
AREA Init, CODE, READONLY ;只读的代码段
Init
ENTRY
;程序入口点
start LDR R0,=0X3FF5000
2
4.1 ARM工程
由于 C 语言便于理解,有大量的 支持库,所以它是当前 ARM 程序设计 所使用的 主要编程语言。
对硬件底系统层的操初始作化、CPU 状态
设定、中断使能、主频设定以及 RAM 控制参数初始化等 C 程序力所不能及 的 底层操作,还是要由 汇编语言程 序来完成。
第4章-ARM汇编程序设计-20151008
1.符号定义伪操作
1) GBLA、GBLL、GBLS
2) 作用:声明一个ARM程序中的全局变量 • 语法格式:<GBLX> Variable • 例: GBLA arithmetic arithmetic SETA 0xFF SPACE arithmetic GBLL logical logical SETL {TRUE} GBLS string1 string1 SETD expr {,expr}…
分配一段字内存单元。
{label} DCDO expr{,expr}… 分配一段字对齐的字内存单元。
{label} DCFD {U}fpliteral{, fpliteral}… {label} DCFS {U} fpliteral {, fpliteral}…
FIELD
SPACE DCB DCD/ DCDU DCDO DCFD/ DCFDU DCFS/ DCFSU DCI DCQ/ DCQU DCW/ DCWU
{label} FIELD expr
{label} SPACE expr
定义一个结构化内存表中的数据域。
分配一块连续内存单元,并用0初始化。
{label} DCB expr{, expr} 分配一段字节内存单元,并用expr初始化。
• 例: • short DCB 1 ;为short分配了一个字节,并初始 • 化为1。 • string DCB ―string‖,0 ;构造一个以0结尾的字 • 符串
• 5)DCD、DCDU • (1)DCD ——也可以用符号”&”表示 • 用于分配一段字内存单元(分配的内存单元 都是字对齐的)并初始化。 • 语法格式: • {label} DCD expr{,expr}…… • 或 {label} & expr{,expr}…… • 其中: – expr:数字表达式或程序中的标号。
ARM汇编语言程序设计
DCB
语法格式: {标号} DCB 体现式
体现式取值范围:-128~255旳数字或字符串。 DCB:“=”
Nullstring DCB “Null string”,0 ;构造一种以0结尾旳字符串
DCW(或DCWU)
语法格式: {标号} DCW(或DCWU) 体现式
DCW:半字对齐 DCWU:不严格半字对齐。 体现式取值范围:-32768~65535
SPACE objectsize
;全局旳数字变量objectsize ,为0 ;将该变量赋值为0xff ;引用该变量
statusB
GBLL statusB ;全局旳逻辑变量statusB ,为{False} SETL {TRUE} ;将该变量赋值为真
全局:作用范围为包括该变量旳源程序
LCLA、LCLL和LCLS
;包括源文件file1.s ;包括源文件file2.s ;包括源文件file3.s
伪指令
ADR ADRL LDR NOP
ADR-小范围旳地址读取伪指令
语法格式 ADR{cond} register, expr cond:可选旳指令执行条件 register:目旳寄存器 expr:基于PC或寄存器旳地址体现式,取值范围: 地址非字对齐,-255~255 地址字对齐,-1020~1020
{寄存器列表}
Context RLIST {r0-r6,r8,r10-r12,r15}
;将寄存器列表名称定义为Context ,可在ARM指令 LDM/STM中经过该名称访问寄存器列表。排列顺序无 关
数据定义伪操作
DCB DCW(DCWU) DCD(DCDU) DCFD(DCFDU) DCFS(DCFSU) SPACE MAP FIELD
第4章ARM汇编语言程序设计
(4)定义结构化内存表首地址/数据域
•
•
•
•
格式 MAP expr{,base_register} {label} FIELD expr 示例 定义一个内存表,其首地址为0x100。该表包含3个 域:A的长度为16个字节,位置为0x100;B的长度为 32个字节,位置为0x110;S的长度为256个字节,位 置为0x130。 MAP 0x100 A FIELD 16 B FIELD 32 S FIELD 256 一个寄存器相关的首地址定义结构化内存表。 MAP 0,R9;将结构化内存表的首地址设为R9的值 FIELD 4 LAB FIELD 4 LDR r0,LAB;相当于LDR R0,[R9,#4] 23
第4章 ARM汇编语言程序设计
(3)分配存储空间SPACE
• • • •
格式 {label} SPACE expr 说明 Label-可选的程序标号; Expr-分配的字节数。 示例 分配连续100字节的存储单元并初始化为0。 DataSpace SPACE 100
22
第4章 ARM汇编语言程序设计
14
第4章 ARM汇编语言程序设计
1)符号定义伪操作
(1)全局变量定义GBLA、GBLL及GBLS (2)局部变量定义LCLA、LCLL及LCLS 格式:GBLA/ GBLL/ GBLS variable 格式:LCLA/ GCLL/ GCLS variable 说明 • variable -全局/局部变量名称 • A-算术变量(初始化为0) • L-逻辑变量(初始化为假F) • S-字符串变量(初始化为空)
两种常用的ARM编译开发环境
•
ADS/SDT、RealView MDK等ARM公司推出的 开发工具 GNU ARM开发工具 ARM汇编语言的伪操作、宏指令在不同 的编译环境下有不同的编写形式和规则
第四章ARM汇编语言程序设计-PPT精选文档
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
示例:
Str DCB “This is a test!”
• DCW
第四章ARM汇编语言程序设计
数据定义伪操作
数据定义伪操作用于为特定的数据分配存储单元,同时可完
成已分配存储单元的初始化。
DCB
分配一片连续的字节存储单元并初始化。
DCW
分配一片连续的半字存储单元并初始化。
DCD
分配一片连续的字存储单元并初始化。
SPACE
分配一片连续的存储单元并初始化为0。
MAP
定义一个结构化的内存表首地址。
的数据域。表达式的值为当前数据域在内存表中 所占的字节数。 FIELD伪操作常与MAP配合使用 来定义结构化的内存表。注意:MAP和FIELD仅 用于定义数据结构,并不实际分配存储单元。 FIELD也可以用 “#”代替。 由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 LDR R1, [R0] ;将A的内容读到R1
(2)表达式是一个数值,是一个相对地址的内存表:
MOV AH, 4CH
INT 21H
MAIN
ENDP
CODE
ENDS
END MAIN
4.1.2 汇编语言的语句格式
ARM汇编语言程序的每行语句由1~4部分组成。
[LABEL] OPERATION [OPERAND] [;COMMENT]
标号域
操作助记符域 操作数域
注释域
4.2 ARM汇编器的伪操作 •符号定义伪操作(Symbol Definition) •数据定义伪操作(Data Definition ) •汇编控制伪操作(Assembly Control) •框架描述伪操作(Frame Description) •其他伪操作(Miscellaneous)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
示例:
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 汇编语言的语句格式