安徽理工大学计算机汇编教程-ARM汇编程序设计
安徽理工大学计算机汇编教程-数据运算程序设计
17
计算机科学与技术系
《汇编语言程序设计》
10.1 多精度的加减运算
and ah,01h
10.1.2 压缩型BCD码加减运算
;ah←截取ah中的CF位
or ah,30h
mov [di],ah mov ah,02h mov cx,04h next: mov dl,[di] int 21h dec di loop next mov ax,4c00h int 21h
2019/4/1
第10章
数据运算程序设计
4
计算机科学与技术系
《汇编语言程序设计》
10.1 多精度的加减运算
10.1.1 二进制加减运算
分解为 寄存器加 al al + [bx] [bx] + cy (进cf)al (进cf)al
2019/4/1
第10章
数据运算程序设计
5
计算机科学与技术系
《汇编语言程序设计》
name data asc1 asc2 Result data code exp10-4.asm segment db ‘2’, ‘3’, ‘8’ ;定义被加数 db ‘1’, ‘5’, ‘6’ ;定义加数 db 4 dup(?) ;定义结果和存放单元 ends segment assume cs:code,ds:data,es:data start: mov ax,data mov ds,ax mov es,ax cld ;清方向标志DF=0为增量串操作
2019/4/1
10.1.2 压缩型BCD码加减运算
;清进位标志 ;取被减数 ;对应位相减 ;十进制减法调整 ;保存求差的结果 ;修改地址偏移量 ;循环运算4个字节 ;返回DOS
第10章
安徽理工大学计算机汇编教程-汇编语言与CC++的混合编程
02.04.2019
第 1章
汇编语言基础知识 13章汇编
4
13.1 C/C++语言参数调用协议
13.1.1 入口参数传递规则
表13.1
类型 char
C语言中各种类型变量在栈中所占的字节数
堆栈中大小 字 字 字 类型 unsigned long float double 堆栈中大小 双字 双字 四字
02.04.2019
第 1章
汇编语言基础知识 13章汇编
6
13.1 C/C++语言参数调用协议
13.1.2 返回参数传递规则
表13.2 C程序返回值与汇编语言寄存器对应关系 C程序中的数据类型 int/char/near* long int far * 汇编语言返回值存储单元 AX 高字在DX中,低字在AX中 段值在DX中,偏移量在AX中
02.04.2019
第 1章
汇编语言基础知识 13章汇编
15
13.2 汇编语言与C/C++语言的连接
13.2.2嵌入式汇编法
Turbo C的嵌入式汇编可以满足用户的各种愿望,可以将汇 编码直接放入C语言程序的任何位置,嵌入的汇编码可以全 面地访问C语言程序中的常量、变量、甚至函数,嵌入式汇 编可以极大地改善程序的性能,与用严格的汇编语言编写出 的程序几乎具有同样强大的功能。在Turbo C的高性能函数 库中有相当一部分的程序代码是使用嵌入式汇编完成的。
02.04.2019
第 1章
汇编语言基础知识 13章汇编
3
13.1 C/C++语言参数调用协议 13.1.1 入口参数传递规则 例如在C语言源程序中有子程序max(a,b,c),则是参数c最 先入栈,然后是参数b入栈,最后是参数a入栈,且位于栈顶, 堆栈的地址变化是向下增长的,最后一个进入堆栈的参数总在 内存的低端.它的地址=BP+偏移量。其中偏移量在小/紧凑 模式下是4,在中/大/巨模式下是6。C传递到汇编的参数若是 基本数据类型之一,则该参数实际值被拷贝到堆栈中,执行汇 编语言子程序时,将从堆栈中取出其参数的值,对于结构类型 变量,如数组等,则将指向该结构变量的地址指针传送到堆栈 中。表13.1指出了各基本数据类型在堆栈中所占的字节数。
ARM汇编语言程序设计
ARM汇编语言程序设计1.ARM汇编语言概述2.ARM寄存器3.ARM指令ARM指令包括数据处理指令、传输指令、分支指令和其他特殊指令。
(1)数据处理指令:包括算术运算、逻辑运算、移位和旋转、比较和测试等。
(2)传输指令:用于数据的加载和存储,包括复制、分配和堆栈操作等。
(3)分支指令:用于控制程序流,包括无条件跳转、条件跳转和中断处理等。
4.ARM程序设计(1)初始化:程序开始时需要进行系统和寄存器的初始化。
可以将堆栈指针初始化,设置另外的寄存器和内存变量等。
(2)输入输出:程序可能需要从外部设备读取数据或向外部设备写入数据。
可以使用传输指令实现数据的输入和输出。
(3)运算处理:根据程序的需求,进行各种运算处理。
可以使用数据处理指令实现数据的加减乘除、逻辑运算等。
(4)循环和条件控制:根据需要,使用分支指令控制程序的流程。
可以使用无条件跳转、条件跳转和循环指令实现程序的循环和条件控制。
(5)结束:在程序执行完毕后,可以进行清理工作,例如释放内存、关闭设备等。
5.ARM程序设计实例下面是一个简单的ARM汇编程序示例,实现从数组中找到最大值并输出:.global _start.section .dataarray: .word 1, 3, 5, 2, 4max: .word 0.section .text_start:loop:next:在上述示例中,程序首先将数组的地址和最大值的地址加载到寄存器中。
然后使用循环和条件控制指令依次比较数组元素,找到最大值并将其存储在max变量中。
最后将最大值输出,并结束程序。
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
第3章ARM汇编语言程序设计
2.局部变量定义伪操作LCLA、LCLL和LCLS
(1)语法格式 LCLA、LCLL和LCLS伪指令用于定义一个 ARM程序中的局部变量并将其初始化。 语法格式如下: <lclx> <variable> (2)使用说明 (3)示例
3.变量赋值伪操作SETA、SETL和SETS
(1)语法格式 伪指令SETA、SETL和SETS用于给一个已 经定义的全局变量或局部变量赋值。 语法格式如下: Variable <setx> expr (2)使用说明 (3)示例
(2)用于定义局部变量的LCLA、LCLL和 LCLS。
(3)用于对变量赋值的SETA、SETL和 SETS。
(4)为通用寄存器列表定义名称的RLIST。
1.全局变量定义伪操作GBLA、GBLL和GBLS
(1)语法格式 GBLA、GBLL和GBLS伪操作用于定义一个 ARM程序中的全局变量并将其初始化。 语法格式如下: <gblx> <variable> (2)使用说明 (3)示例
4.通用寄存器列表定义伪操作RLIST
(1)语法格式 RLIST伪操作可用于对一个通用寄存器列 表定义名称,使用该伪操作定义的名称可在 ARM指令LDM/STM中使用。 语法格式如下: Name RLIST {list-of-registers} (2)使用说明 (3)示例
3.2.3 数据定义(Data Definition)伪操作
{label} DCFS{U} fpliteral{,fpliteral}
(2)使用说明 (3)示例
5.DCFD(或DCFDU)
(1)语法格式 DCFD(或DCFDU)伪指令用于为双精度
的浮点数分配一片连续的字存储单元并用伪指 令中指定的表达式初始化。
ARM教材第5章ARM汇编程序设计.
第5章ARM汇编程序设计ARM编译器,如ADS集成开发环境,一般都支持汇编语言的程序设计。
本章介绍ARM 程序设计的一些基本概念,如ARM汇编语言的伪指令、汇编语言的语句格式和汇编语言的程序结构等到,并在些基础上介绍一些常用的ARM汇编子程序的设计。
4.1 ARM伪指令ARM汇编程序由汇编指令、伪指令和宏指令组成,伪指令不介汇编指令那样在处理器的运行期间执行,而是在汇编器对汇编程序进行汇编时处理。
宏是一段独立的汇编程序代码,它是通过伪指令定义的,在程序中宏指令即调用宏指令。
当程序被汇编时,汇编程序对每个宏调用进行展开,用宏定义代汇编程序中的宏指令。
由于指令也发球汇编伪指令的一部分,因此本书将宏指令放在汇编伪一起介绍。
与单片机汇编程序设计一样,在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,它们没有相对应的操作友码,通常称这些特殊指令助记符为伪指令,它们所完成的操作称为伪操作。
伪指令在源程序中的作用是为完成汇编程序做各种准备工作,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成了。
在ARM的光荣称号程序中,有如下几种伪指令:符号定义伪指令、数据定义伪指令、汇编控制伪指令以及其他伪指令。
4.1.1 符号定义(Symbol Definition)伪指令符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。
常见的符号定义伪指令有以下几种:●用于宝玉局变量的GBLA、GBLL和GBLS;●用于定义局部变量的LCLA、SETL、LCLS;●用于对变量赋值的SETA、SETL、SETS;●为通用寄存器列表定义名称的RLIST;●为一个协处理器的寄存器定义名称的伪指令CN;●为一个协处理器定义名称的伪指令CP;●为一个CFP寄存器定义名称的伪指令DN和SN;●为一个FPA浮点寄存器定义名称的伪指令FN。
1.GBLA、GBLL和GBLS语法格式:GBLA(GBLL或GBLS) 全局变量名GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并半其初始化。
安徽理工大学计算机汇编教程-ARM系统结构-精选文档
与用户模式类似,但具有可以 直接切换到其它模式等特权
2019/2/17
第 1章
汇编语言基础知识 16章 ARM 系统结构
9
计算机科学与技术系
《汇编语言程序设计》
• 异常模式
处理器模式 用户 系统 (usr) (sys) 说明 正常程序工作模式 用于支持操作系统的特 权任务等 备注 不能直接切换到其它模式 与用户模式类似,但具有可以 直接切换到其它模式等特权
7
计算机科学与技术系
《汇编语言程序设计》
16.2
用户 系统
ARM微处理器的工作模式
说明 正常程序工作模式 用于支持操作系统的特 权任务等 支持高速数据传输及通 道处理 用于通用中断处理 操作系统保护代码 用于支持虚拟内存和/或 存储器保护 支持硬件协处理器的软 件仿真 第 1章 备注 不能直接切换到其它模式 与用户模式类似,但具有可以 直接切换到其它模式等特权 FIQ异常响应时进入此模式 IRQ异常响应时进入此模式 系统复位和软件中断响应时进 入此模式 在ARM7TDMI没有大用处 未定义指令异常响应时进入此 模式
第15章 ARM CPU 概述
16.1 ARM微处理器的工作状态
16.2 16.3
16.4 16.5
2019/2/17
ARM微处理器的工作模式 ARM微处理器的寄存器组织
ARM异常处理 ARM体系中的存储系统
第 1章 汇编语言基础知识 16章 ARM 系统结构
6
计算机科学与技术系
《汇编语言程序设计》
字 32为(必须分配为占用4各字节)
1
2
3
4
2019/2/17
第 1章
汇编语言基础知识 16章 ARM 系统结构
安徽理工大学计算机汇编教程-ARMThumb汇编语言
;读取R3+0x0C地址上的存储单元的内容,放入R2 ;先 R0=R0-4,然后把R1的值寄存到保存到 R0指定的
存储单元
0x4000000C 将R3+0x0C作 为地址装载数 据 LDR
2019/2/24
0xAA
R3 0x40000000 R2 0xAA 0x55 R2,[R3,#0x0C]
;R0=1 ;R2与0x0f,结果保存
;读取R1地址上的存储单
2019/2/24
第 1章
汇编语言基础知识 17章 ARM /Thumb汇
7
17.1.3
ARM指令基本语法格式
(2) 寄存器方式 在寄布器寻址方式下,操作数即为寄存器的数值。 寄存器方式应用举例: MOV R3,R2 ;将R2的数值放到R3中 ADD R0,Rl,R2 ;R0数值等于R1的数值加上R2的数值
16
第 1章
汇编语言基础知识 17章 ARM /Thumb汇
17.2
ARM指令的寻址方式
• 寻址方式分类——多寄存器寻 址 多寄存器寻址一次可传送几个寄存器值,允许一条指令传送16 个寄存器的任何子集或所有寄存器。多寄存器寻址指令举例如下:
LDMIA STMIA R1!,{R2-R7,R12} R0!,{R2-R7,R12} ;将R1指向的单元中的数据读出到 ;R2~R7、R12中(R1自动加1) ;将寄存器R2~R7、R12的值保存到R0指向的存储单元中 ;(R0自动加1)
STMIA R0!,{R1-R7} ;将R1~R7的数据保存到存储器中。 ;存储指针在保存第一个值之后增加, ;增长方向为向上增长。
STMIB
arm汇编语言程序设计
arm汇编语言程序设计ARM汇编语言程序设计一、引言ARM汇编语言是一种低级语言,用于编写底层程序,如操作系统、嵌入式系统等。
它具有高效、灵活、可移植等特点,被广泛应用于各种嵌入式设备中。
本文将介绍ARM汇编语言程序设计的基本概念、语法规则以及常用指令,以帮助读者快速入门和理解该领域的知识。
二、基本概念1. 寄存器:ARM处理器具有16个通用寄存器,分别用R0~R15表示。
这些寄存器用于存储数据、地址和中间结果,并且在程序执行过程中可以被读取和写入。
2. 指令:ARM汇编语言的指令包括数据处理指令、分支指令、加载存储指令等。
这些指令用于执行各种操作,如算术运算、逻辑运算、条件判断等。
3. 标志位:ARM处理器的标志位用于记录执行过程中的状态信息,如进位标志、溢出标志等。
这些标志位对于程序的正确执行非常重要。
三、语法规则1. 指令格式:ARM汇编指令由操作码和操作数组成,其中操作码表示指令的类型,操作数表示指令的操作对象。
指令格式一般为“操作码操作数1, 操作数2, ...”。
2. 注释:注释以分号开头,用于对指令进行解释和说明。
注释对于程序的可读性和维护性非常重要,应当充分利用。
3. 标签:标签用于标识程序中的某个位置或标记某个指令,以便在其他地方进行引用。
标签一般以英文字母开头,后面可以跟随数字或下划线等字符。
4. 伪指令:伪指令是一种特殊指令,用于约定程序的起始地址、存储空间的分配等。
伪指令一般以句点开头,如“.data”表示数据段,“.text”表示代码段。
四、常用指令1. 数据处理指令:数据处理指令用于进行算术运算、逻辑运算等操作。
例如,“ADD”指令用于将两个操作数相加,并将结果存放在目标寄存器中。
2. 分支指令:分支指令用于实现程序的跳转和循环等控制流程。
例如,“B”指令用于无条件跳转到指定标签处执行。
3. 加载存储指令:加载存储指令用于实现数据的读取和写入。
例如,“LDR”指令用于将指定地址处的数据加载到寄存器中。
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
安徽理工大学计算机汇编教程-ARM指令系统
17
计算机科学与技术系
《汇编语言程序设计》 汇编语言程序设计》
18.3
STR
单寄存器存取指令
助记符 Rd, addressing 说明 存储字数据 操作 [addressing]←Rd, [addressing]←Rd, addressing索引 addressing索引 [addressing]←Rd, [addressing]←Rd, addressing索引 addressing索引 条件码位置 STR{cond}
2012-3-11
第18章 ARM 指令系统 章
3
计算机科学与技术系
《汇编语言程序设计》 汇编语言程序设计》
第18章 ARM指令系统 18章 ARM指令系统
18.1 18.2 18.3 18.4 18.5 18.6 18.7 18.8 18.9 18.10 18.11
2012-3-11
概述 ARM指令的格式和条件码 ARM指令的格式和条件码 单寄存器存取指令 多寄存器存取指令 数据交换指令 数据处理指令 乘法指令与乘加指令 ARM分支指令 ARM分支指令 软件中断指令 程序状态寄存器访问指令 ARM伪指令 ARM伪指令
《汇编语言程序设计》 汇编语言程序设计》
ARM指令的格式 18.2.1 ARM指令的格式
• ARM指令集——第2个操作数
ARM指令的基本格式如下:
<opcode> {<cond>} {S} <Rd> ,<Rn>{,<operand2>}
பைடு நூலகம்
灵活的使用第2个操作数“operand2”能够提高代码 效率。它有如下的形式: #immed_8 ——常数表达式 #immed_8r——常数表达式; 常数表达式; Rm——寄存器方式 Rm——寄存器方式; 寄存器方式; Rm,shift——寄存器移位方式; Rm,shift——寄存器移位方式; 寄存器移位方式
arm汇编语言程序设计步骤
arm汇编语言程序设计步骤ARM汇编语言程序设计步骤一、概述ARM汇编语言是一种基于ARM架构的低级语言,用于编写底层程序和驱动程序。
在进行ARM汇编语言程序设计时,我们需要按照以下步骤进行。
二、确定需求在开始编写ARM汇编语言程序之前,我们需要明确程序的需求和目标。
这包括确定程序要实现的功能、输入和输出的格式、程序的性能要求等。
三、了解ARM架构在编写ARM汇编语言程序之前,我们需要了解ARM架构的特点和指令集。
ARM架构是一种精简指令集计算机(RISC)架构,具有高效的指令执行和低能耗的特点。
四、选择开发工具在进行ARM汇编语言程序设计时,我们需要选择合适的开发工具。
常用的开发工具包括ARM汇编器、调试器和模拟器。
这些工具可以帮助我们编译、调试和运行ARM汇编语言程序。
五、编写程序在编写ARM汇编语言程序时,我们需要按照以下步骤进行:1. 定义数据段:首先,我们需要定义程序的数据段。
数据段用于存储程序中使用的变量和常量。
在ARM汇编语言中,我们可以使用伪指令来定义数据段。
2. 定义代码段:然后,我们需要定义程序的代码段。
代码段包含程序的指令和算法。
在ARM汇编语言中,我们可以使用伪指令和指令来定义代码段。
3. 编写算法:在编写ARM汇编语言程序时,我们需要根据需求编写相应的算法。
算法是程序的核心部分,用于实现程序的功能和逻辑。
4. 调用系统服务:在ARM汇编语言中,我们可以通过调用系统服务来实现一些常用的功能,如输入输出、内存管理等。
调用系统服务需要使用特定的指令和参数。
5. 进行优化:在编写ARM汇编语言程序时,我们可以进行一些优化操作,以提高程序的性能和效率。
优化操作包括减少指令数量、减少内存访问次数、合并循环等。
六、编译和调试在完成ARM汇编语言程序的编写后,我们需要进行编译和调试。
编译是将汇编语言程序转换为机器码的过程,可以使用ARM汇编器进行编译。
调试是对程序进行测试和调试的过程,可以使用调试器和模拟器进行调试。
安徽理工大学计算机汇编教程-输入输出程序设计
2019/4/1
第6章 输入/输出程序设计
9
计算机科学与技术系
《汇编语言程序设计》
6.2 CPU与外设传送数据的控制方式
6.1 输入/输出指令
6.2 CPU与外设传送数据的控制方式
6.3 程序查询传送方式
6.4 中断传送方式
2019/4/1
第6章 输入/输出程序设计
19
计算机科学与技术系
《汇编语言程序设计》
6.4 中断传送方式 6.4.1中断的概念 1.中断的引入
中断功能已经成为计算机不可缺少的组成部分。中断的引入具有较多的优点: (1)分时操作 (2)实现实时处理 (3)故障处理
数据 状态 控制
数据 状态 控制
CPU
接口
外 部 设 备
图6.2 主机与外设间传送的信息
2019/4/1
第6章 输入/输出程序设计
10
计算机科学与技术系
《汇编语言程序设计》
6.2 CPU与外设传送数据的控制方式
【例】向打印机输出字符。
打 印 机 控 制 器
C P U
DB AB
DB STB BUSY
计算机科学与技术系
《汇编语言程序设计》
8086/8088和ARM核 汇编语言程序设计
第6章 输入/输出程序设计
2019/4/1
第6章 输入/输出程序设计
1
计算机科学与技术系
《汇编语言程序设计》
第6章 输入/输出程序设计
6.1 输入/输出指令
ARM汇编语言程序设计教学学习教案
➢ 标号是一个自行设计的标识符或 名称,语句标号可以是大小写字 母混合,通常以字母开头,由字 母、数字(shùzì)、下划线等组成。
➢ 语句标号不能与寄存器名、指令 助记符、伪指令(操作)助记符、 变量名同名。
➢ 语句标号必须第8页在/共164一页 行的开头书写, 不能留空格。
➢
8_24第175页表/共16示4页 一个八进制数。
➢ ASCII的表示:有些值可以使用
第十六页,共164页。
➢ 逻辑常量只有两种取值情况: {TRUE}和{FALSE},注意带大 括号。
➢ 字符串常量为一个固定的字符 串,一般(yībān)用于程序运行时 的信息提示。
➢ 字符常量由单引号表示,包括C 语言中的转义字符,如’\n’。
常见的符号定义伪操作有如下(rúxià) 几种:
GBLA、GBLL、GBLS LCLA、LCLL和LCLS
第20页/共164页
SETA、SETL、SETS
第二十一页,共164页。
1. 全局变量声明(shēngmíng)GBLA、 GBLL和GBLS
格 式:GBLA(GBLL或GBLS)全局变量名 功 能:GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中
第3页/共164页
第四页,共164页。
4.1.1汇编语言(huì biān yǔ yán)的基本概念
第4页/共164页
第五页,共164页。
4.1.2汇编语言(huì biān y1.ǔ 汇yá编n语)源言(程huì序biā的n yǔ组yá成n)源程
序的结构
AREA Init,CODE, READONLY
LCLS Test6 ;定义一个局部的字符串变量,变量 名为Test6 Test6 SETS “Testing” ;将该变量赋值为“Testing”
第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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
为通用寄存器列表定义名称的RLIST。
2013-7-27
第20章 ARM汇编程序设计
4
计算机科学与技术系
《汇编语言程序设计》
1、 GBLA、GBLL和GBLS 语法格式: GBLA(GBLL或GBLS) 全局变量名 GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并将其初 始化。其中: GBLA伪指令用于定义一个全局的数字变量,并初始化为0; GBLL伪指令用于定义一个全局的逻辑变量,并初始化为F(假); GBLS伪指令用于定义一个全局的字符串变量,并初始化为空; 由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名 必须唯一。 使用示例: GBLA Test1 定义一个全局的数字变量,变量名为Test1 Test1 SETA 0xaa ;将该变量赋值为0xaa GBLL Test2 ; 定义一个全局的逻辑变量,变量名为Test2 Test2 SETL {TRUE} ;将该变量赋值为真 GBLS Test3 ; 定义一个全局的字符串变量,变量名为Test3 Test3 SETS “Testing” ;将该变量赋值为“Testing”
2013-7-27
第20章 ARM汇编程序设计
7
计算机科学与技术系
《汇编语言程序设计》
4、 RLIST 语法格式: 名称 RLIST {寄存器列表} RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该 伪 指 令 定 义 的 名 称 可 在 ARM 指 令 LDM/STM 中 使 用 。 在 LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的 编号由低到高,而与列表中的寄存器排列次序无关。 使用示例: RegList RLIST {R0-R5,R8,R10} ;将寄存器列表名称定义为RegList,可在ARM指令LDM/STM 中通过该名称访问寄存器列表。
2013-7-27
第20章 ARM汇编程序设计
6
计算机科学与技术系
《汇编语言程序设计》
3、 SETA、SETL和SETS 语法格式: 变量名 SETA(SETL或SETS) 表达式 伪指令SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。 SETA伪指令用于给一个数学变量赋值; SETL伪指令用于给一个逻辑变量赋值; SETS伪指令用于给一个字符串变量赋值; 其中,变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变 量的值。 使用示例: LCLA Test3 ;声明一个局部的数字变量,变量名为Test3 Test3 SETA 0xaa ;将该变量赋值为0xaa LCLL Test4 ;声明一个局部的逻辑变量,变量名为Test4 Test4 SETL {TRUE} ;将该变量赋值为真
2013-7-27
第20章 ARM汇编程序设计
14
计算机科学与技术系
《汇编语言程序设计》
20.1.3 汇编控制(Assembly Control)伪指令
汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控 制伪指令包括以下几条: — IF、ELSE、ENDIF
—
—WLeabharlann ILE、WENDMACRO、MEND MEXIT
2013-7-27
第20章 ARM汇编程序设计
5
计算机科学与技术系
《汇编语言程序设计》
2 LCLA、LCLL和LCLS 语法格式: LCLA(LCLL或LCLS) 局部变量名 LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量,并将其初 始化。其中: LCLA伪指令用于定义一个局部的数字变量,并初始化为0; LCLL伪指令用于定义一个局部的逻辑变量,并初始化为F(假); LCLS伪指令用于定义一个局部的字符串变量,并初始化为空; 以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯 一。 使用示例: LCLA Test4 ;声明一个局部的数字变量,变量名为Test4 Test3 SETA 0xaa ;将该变量赋值为0xaa LCLL Test5 ;声明一个局部的逻辑变量,变量名为Test5 Test4 SETL {TRUE} ;将该变量赋值为真 LCLS Test6 ;定义一个局部的字符串变量,变量名为Test6 Test6 SETS “Testing” ;将该变量赋值为“Testing”
2013-7-27
第20章 ARM汇编程序设计
10
计算机科学与技术系
《汇编语言程序设计》
3、 DCD(或DCDU) 语法格式: 标号 DCD(或DCDU) 表达式 DCD(或DCDU)伪指令用于分配一片连续的字存储单元并用伪指令中指定 的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用 “&”代替。 用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严 格字对齐。 使用示例: DataTest DCD 4,5,6 ;分配一片连续的字存储 单元并初始化。 4 DCFD(或DCFDU) 语法格式: 标号 DCFD(或DCFDU) 表达式 DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单 元并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。 用DCFD分配的字存储单元是字对齐的,而用DCFDU分配的字存储单元并不 严格字对齐。 使用示例: FDataTest DCFD 2E115,-5E7 ;分配一片连续的字存储单元并初 始化为指定的双精度数。
2013-7-27
第20章 ARM汇编程序设计
8
计算机科学与技术系
《汇编语言程序设计》
20.1.2
—
数据定义伪指令
DCB用于分配一片连续的字节存储单元并用指定的数据初始化。
数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已 分配存储单元的初始化。常见的数据定义伪指令有如下几种:
— DCW(DCWU) 用于分配一片连续的半字存储单元并用指定的 数据初始化。
—
2013-7-27
MAP
用于定义一个结构化的内存表首地址
第20章 ARM汇编程序设计
FIELD
用于定义一个结构化的内存表的数据域
9
计算机科学与技术系
《汇编语言程序设计》
1、 DCB 语法格式: 标号 DCB 表达式 DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初 始化。其中,表达式可以为0~255的数字或字符串。DCB也可用“=”代替。 使用示例: Str DCB “This is a test!” ;分配一片连续的字节存储单元并 初始化。 2、 DCW(或DCWU) 语法格式: 标号 DCW(或DCWU) 表达式 DCW(或DCWU)伪指令用于分配一片连续的半字存储单元并用伪指令中指 定的表达式初始化。其中,表达式可以为程序标号或数字表达式。。 用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不 严格半字对齐。 使用示例: DataTest DCW 1,2,3;分配一片连续的半字存储单元并 初始化。
8 MAP 语法格式:MAP 表达式{,基址寄存器} MAP伪指令用于定义一个结构化的内存表的首地址。MAP也可用“^”代 替。 表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄 存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内 存表的首地址为表达式的值与基址寄存器的和。 MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。 使用示例: MAP 0x100,R0 ;定义结构化内存表首地址的值为 0x100+R0。
2013-7-27
第20章 ARM汇编程序设计
12
计算机科学与技术系
《汇编语言程序设计》
7 SPACE 语法格式:标号 SPACE 表达式 SPACE伪指令用于分配一片连续的存储区域并初始化为0。其中,表达式为 要分配的字节数。SPACE也可用“%”代替。 使用示例: DataSpace SPACE 100 ;分配连续100字节的存储单元并初始化为 0。
— DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据 初始化。 — DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储 单元并用指定的数据初始化。 — DCFS(DCFSU)用于为单精度的浮点数分配一片连续的字存储 单元并用指定的数据初始化。 — DCQ(DCQU)用于分配一片以8字节为单位的连续的存储单元 并用指定的数据初始化。 — SPACE 用于分配一片连续的存储单元
2013-7-27
第20章 ARM汇编程序设计
13
计算机科学与技术系
《汇编语言程序设计》
9、 FILED 语法格式: 标号 FIELD 表达式 FIELD伪指令用于定义一个结构化内存表中的数据域。FILED也可用“#”代替。 表达式的值为当前数据域在内存表中所占的字节数。 FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表。MAP伪指令 定义内存表的首地址,FIELD伪指令定义内存表中的各个数据域,并可以为每 个数据域指定一个标号供其他的指令引用。 注意MAP和FIELD伪指令仅用于定义数据结构,并不实际分配存储单元。 使用示例: MAP 0x100 ;定义结构化内存表首地址的值为0x100。 A FIELD 16 ;定义A的长度为16字节,位置为0x100 B FIELD 32 ;定义B的长度为32字节,位置为0x110 S FIELD 256 ;定义S的长度为256字节,位置为0x130
计算机科学与技术系
《汇编语言程序设计》
8086/8088和ARM核 汇编语言程序设计
第20章 ARM汇编程序设计
2013-7-27
第20章 ARM汇编程序设计
1
计算机科学与技术系
《汇编语言程序设计》
第20章 ARM汇编程序设计
20.1 ARM汇编器所支持的伪指令
20.2
汇编语言的程序结构
2013-7-27