第4章 GNU汇编伪指令集
汇编语言伪指令
汇编语言伪指令汇编语言作为一种低级编程语言,广泛应用于嵌入式系统、驱动程序开发和操作系统内核等领域。
在进行汇编语言编程时,我们常常会使用到一些伪指令。
本文将介绍一些常见的汇编语言伪指令及其用法。
1. 数据定义伪指令数据定义伪指令用于声明并初始化数据。
在汇编语言中,我们可以使用以下伪指令来定义不同类型的数据:1.1 DB(Define Byte):用于定义一个字节的数据。
例如:DB 10 ;定义一个字节的数据,值为101.2 DW(Define Word):用于定义一个字的数据。
例如:DW 100 ;定义一个字的数据,值为1001.3 DD(Define Doubleword):用于定义一个双字的数据。
例如:DD 1000 ;定义一个双字的数据,值为10001.4 DQ(Define Quadword):用于定义一个四字的数据。
例如:DQ 10000 ;定义一个四字的数据,值为100001.5 DT(Define Ten Bytes):用于定义一个十个字节的数据。
例如:DT 1234567890 ;定义一个十个字节的数据,值为12345678902. 代码段和数据段伪指令在汇编语言中,我们通常需要将代码和数据分开存放,以便于管理和执行。
以下是一些常用的代码段和数据段伪指令:2.1 CODE SEGMENT:用于定义代码段。
例如:CODE SEGMENT;代码段内容CODE ENDS2.2 DATA SEGMENT:用于定义数据段。
例如:DATA SEGMENT;数据段内容DATA ENDS2.3 STACK SEGMENT:用于定义堆栈段。
例如:STACK SEGMENT;堆栈段内容STACK ENDS3. 控制指令伪指令控制指令伪指令用于控制程序的执行流程。
以下是一些常见的控制指令伪指令:3.1 IF-ELSE-ENDIF:用于条件判断。
例如:IF 条件;条件为真时执行的代码ELSE;条件为假时执行的代码ENDIF3.2 REPEAT-UNTIL:用于循环执行一段代码直至满足条件。
第4章(伪指令)
为第二操作数使用的,而ARM对数字常量的第二操作数有诸多
限制(必须为移位后构成的数),给寄存器加载一个任意数往往不 能使用一条指令实现,而使用伪操作LDR则可以解决此类问题。
第4章 嵌入式式程序设计基础
第4章 嵌入式程序设计基础 ·举例
第4章 嵌入式程序设计基础 该指令常用于加载芯片外围功能部件的寄存器地址(32位立 即数),以实现各种控制操作: a. 读控制寄存器 ……
据域(即MAP定义的内存表要和引用内存表的LDR指令相距不超
过4KB)。
第4章 嵌入式程序设计基础
第4章 嵌入式程序设计基础
2.3.2.3 内存单元分配伪操作
a. 功能 该伪指令用来分配一片连续的存储区域并将其初始化为0, 也可以用“%”来代替。 b. 语法
第4章 嵌入式程序设计基础 2.3.2.4 字节分配内存单元伪操作DCB
a. 功能
用来分配一段连续的双字内存单元,并用双精度的浮点数初 始化,DCFD分配的内存字对齐,DCFDU则不一定。 b. 语法
第4章 嵌入式程序设计基础 2.3.2.8 字分配内存单元伪操作DCFS和DCFDU
a. 功能
用来分配一段连续的字内存单元,并用单精度的浮点数初 始化,DCFS分配的内存字对齐,DCFSU则不一定。 b. 语法
• SETL—给一个逻辑变量赋值 • SETS—给一个字符串变量赋值
第4章 嵌入式程序设计基础 d.定义通用寄存器列表名称伪操作
该伪操作定义的寄存器列表主要用在堆栈操作或LDM/STM
多寄存器传送指令中。
第4章 嵌入式程序设计基础 2.2 语法
第4章 嵌入式程序设计基础 2.3 数据定义伪指令
器将其转化为LDR r0, [ PC,#offset ]的形式。
第4章 伪指令及汇编语言源程序
第 4章
符号定义伪指令
2、 等号伪指令 = = 伪指令的格式与功能和 EQU 类似。不同的是, 在同一个程序中 = 可以对一个符号重复定义, EQU不能对同一个符号重复定义。 Y1=7 Y1=128 的定义是正确的。 而 Y1 EQU 7 Y1 EQU 128 的定义是错误的。
2019/4/12
24
第 4章
组合类型
组合类型规定本段与其他段的关系,有 4 种方式(默 认方式为NONE): NONE:连接时,表示本段与其他段在逻辑上没有 关系。 PUBLIC:连接时,本段将与其他同名、同类别的段 相邻地连接在一起,形成一个物理段,段的长度为 各PUBLIC段长度之和。 COMMON:连接时,本段将与其他同名、同类别 的段相覆盖,形成一个物理段,段的长度为最长的 COMMON段的长度。 STACK:表示此段为堆栈段,连接方式与PUBLIC 段相同。
2019/4/12
偏移地址低字节
偏移地址高字节
偏移地址低字节 偏移地址高字节
段地址低字节
段地址高字节
图4.2
15
第 4章
操作数是字符串
操作数为字符串时,内存中存放的是各字符的ASCII码。 例4-5 下面3个定义语句是等价的。 STR1 DB ‘ABCD’ STR1 DB ‘A’, ‘B’, ‘C’, ‘D’ STR1 DB 41H,42H,43H,44H 例4-6 下面2个定义语句是等价的 STR2 DB ‘AB’ STR2 DW ‘BA’ 当定义的字符串中字符多于2个时,只能使用DB定义,不 能使用DW。 STR3 DW ‘ABCD’ 是错误的定义方式。
2019/4/12
5
第 4章
操作码与操作数
汇编 第四章伪指令及汇编语言源程序结构
MOV AL, BUF1
ADD AL, BUF2 MOV SUM, AL
;取第一个加数
;两数加 ;和放入SUM单元
3
伪指令(指 示性)语句: 提供相关辅 助信息。
指令性语句: 完成一定功 能,能翻译 成机器码。
伪指令语句
DATA SEGMENT ;DATA段定义开始 BUF1 DB 34H BUF2 DB 27H SUM DB ? DATA ENDS ;DATA段定义结束 CODE SEGMENT ;CODE段定义开始 ASSUME CS:CODE ASSUME DS:DATA ;段性质规定 START: MOV AX,DATA MOV DS,AX ;给DS赋值 MOV AL, BUF1 ;取第一个加数 ADD AL, BUF2 ;两数加 MOV SUM, AL ;和放入SUM单元 MOV AH,4CH INT 21H ;返回DOS CODE ENDS ;CODE段定义结束 END START ;源程序结束
14
二、= 等号伪指令
格式:符号名 = 表达式 功能:为常量、表达式及其他各种符号定义一个等价的符号 名,并能对所定义的符号多次重复定义,且以最后一次定义 的值为准。 例:COST = 20 M = MOV LOST = COST+10 ;30→LOST M = ADD ;M=ADD 注 : “ = ” 伪 指 令 的 格 式 和 功 能 与 EQU 类 似 。 二者区别:在同一程序中,“=”可以对一个符号重 复定义,EQU不能对同一符号重复定义。
26
三、变量、标号的分析运算和合成运算
例:DATA SEGMENT A DB ‘ABCDEF’ B DW 10 DUP(1,2DUP(2)) C DB 3,20 DUP(0) DATA ENDS ┆ MOV AX,LENGTH A ;1→AX MOV BX,LENGTH B ;10→BX MOV CX,LENGTH C ;1→CX ┆
完整版汇编语言中常用的伪指令档
完整版汇编语言中常用的伪指令档汇编语言是一种低级的程序设计语言,它用于编写底层计算机程序。
在汇编语言中,伪指令是一类特殊的指令,它们在程序运行时不会被计算机执行,而是在编译或汇编时被处理器或汇编器解释和展开。
伪指令在汇编语言中起到辅助编程、优化代码和声明常量等作用。
本文将介绍完整版汇编语言中常用的伪指令档。
一、伪指令的定义和作用伪指令是汇编语言中的一类特殊指令,它们不是真正的指令,不会被计算机执行,而是在编译或汇编的过程中被汇编器或处理器解释和处理。
伪指令主要用于辅助编程、优化代码和声明常量等作用。
伪指令的格式一般与真正的指令相似,但一般不包含操作码。
在一些汇编语言中,伪指令以特殊的标记或符号来区分,比如以“.”开头的指令。
二、常用的伪指令档1. ORG指令ORG指令用于指定程序的起始地址。
在汇编程序中,使用ORG指令可以将程序的代码段或数据段放置在指定的内存地址处。
其格式一般为:ORG 地址其中,地址为16进制数或表示内存单元的符号。
2. EQU指令EQU指令用于定义符号常量或符号变量。
它将一个符号与一个数值或地址进行关联,使得在程序中使用该符号时可以被汇编器或处理器替换为对应的数值或地址。
其格式一般为:符号 EQU 数值或地址其中,符号为一个标识符,数值或地址可以是16进制数、10进制数或表示内存单元的符号。
3. DB指令DB指令用于定义字节型数据。
它可以用于声明字符、整数等字节型数据,并将这些数据存储在指定的内存地址中。
其格式一般为:标号 DB 表达式其中,表达式可以是一个字节常量、字符常量或表示内存单元的符号。
4. DW指令DW指令用于定义字型数据。
它可以用于声明无符号整数等字型数据,并将这些数据存储在指定的内存地址中。
其格式一般为:标号 DW 表达式其中,表达式可以是一个字常量或表示内存单元的符号。
5. DD指令DD指令用于定义双字型数据。
它可以用于声明无符号双字整数等双字型数据,并将这些数据存储在指定的内存地址中。
第4章 ARM程序设计基础-伪指令2
操作结果为{FALSE}或{TRUE}
Assemble Language of ARM
17
3、 字符串表达式及运算符
第4章 ARM程序设计基础
4.2 汇编语言的语句格式
ARM(Thumb)汇编语言的语句格式为: {标号} {指令或伪指令} {;注释} 标号必须从一行的行头开始,并且符号中不能包含空格。 指令不能从一行的行头开始,即在一行语句中,指令的前面必须有 空格或者标号。 在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或 全部用小写,但不允许在一条指令中大、小写混用。 寄存器可以大写或小写。 伪指令有些必须在一行的开头顶格书写,另外一些必须留有空格。 注释以分号“;”开头,到行末结束。 如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾 用“\”表示下一行与本行为同一条语句。 在源程序中,语句之间可以插入空行,增强可读性。
Assemble Language of ARM 8
变量替换的特殊情况: 如果需要字符$,则用$$来表示。 包含在两个竖线(|)之间的$不进行变量替换,但如果竖线是 在双引号内,则将进行变量替换。 使用“.”来表示变量名称的结束。
例如 STR1
SETS
“STRING”
STR2
SETS
X X X X X X X
= Y > Y < Y >= Y <= Y /= Y <> Y
;表示X等于Y ;表示X大于Y ;表示X小于Y ;表示X大于等于Y ;表示X小于等于Y ;表示X不等于Y ;表示X不等于Y
第四章 汇编语言和伪指令
2、条件汇编伪指令 .if、.elseif、.else、.endif伪指令告诉汇编器按照表达 if、 elseif、 else、 endif伪指令告诉汇编器按照表达 式的计算结果对代码块进行条件汇编。 式的计算结果对代码块进行条件汇编。 标志条件块的开始, .if expression — 标志条件块的开始,仅当条件为真 (expression的值非0即为真)时汇编代码。 expression的值非0即为真)时汇编代码。 的值非 标志若.if条件为假 条件为假, elseif条 .elseif expression — 标志若.if条件为假,而.elseif条 件为真时要汇编代码块。 件为真时要汇编代码块。 标志若.if条件为假时要汇编代码块 条件为假时要汇编代码块。 .else — 标志若.if条件为假时要汇编代码块。 标志条件块的结束,并终止该条件代码块。 .endif — 标志条件块的结束,并终止该条件代码块。
5.调试工具 软件仿真器(Simulator) 软件仿真器(Simulator) .out文件调入到一个计算机的软件模拟窗口 将.out文件调入到一个计算机的软件模拟窗口 DSP代码进行软件模拟和调试及程序验证 代码进行软件模拟和调试及程序验证, 下,对DSP代码进行软件模拟和调试及程序验证, 它不需目标硬件支持,只需在计算机上运行。 它不需目标硬件支持,只需在计算机上运行。 硬件仿真器(XDS510) 硬件仿真器(XDS510) 通过仿真头将PC PC机中的用户程序代码下载到 通过仿真头将PC机中的用户程序代码下载到 目标系统的存储器中进行调试和程序验证。 目标系统的存储器中进行调试和程序验证。 TI公司推出的 公司推出的CCS集成环境将上述各步骤集成在一 公司推出的 集成环境将上述各步骤集成在一 个窗口环境下,大大方便了软件设计。 个窗口环境下,大大方便了软件设计。
第四章 伪指令
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT) 表达式1,表达式2,… 表达式1,表达式2……是给变量或指定的存储单元赋予初值,它们有以下几种形式: (a)数值表达式 数据定义伪指令可以为一个或连续的存储单元设置数值初值。 (b)字符串表达式 对于DB伪指令,字符串的长度允许超过2个字符,但不能超过255个字符,字符 串必须用单引号括起来,它可为字符串中的每个字符分配1字节单元,字符串 从左至右以字符的ASCII码形式按地址递增的顺序依次存放。 (c)?表达式 不带引号的?,用于为变量预留内存单元,暂时不存入数据,即表示所定义的 变量无确定的初值。 例如:A DW ?,?为变量A预留2个字单元。 (d)地址表达式 操作数为地址表达式时,只适用于DW和DD这两种数据定义伪指令。如果地址表 达式为一变量(标号)名,用DW伪指令则是取它的偏移地址来初始化变量;用 DD伪指令则是取它的段首地址和偏移地址来初始化变量。 (e)带DUP的表达式 格式为:n DUP (表达式),其中n为重复因子,只能取正整数,它表示定义了 n个相同的数据存储单元。
在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算
符、数值返回运算符、属性运算符和字节分离运算符。
(一)、表达式
(1)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意 义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它 只有大小而没有属性。
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT)
Байду номын сангаас
表达式1,表达式2,„
其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址; DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。 DB定义的是字节类型的变量,每个表达式被分配1个字节单元。 DW定义的是字类型的变量,每一个表达式被分配1个字单元(2个字节)。 DD定义的是双字类型的变量,每一个表达式被分配2个字单元(4个字节)。 DQ定义的是四字类型的变量,每一个表达式被分配4个字单元(8个字节)。 DT定义的是十字节类型的变量,每一个表达式被分配10个字节单元。
GNU 汇编伪指令简介
GNU汇编伪指令简介1 ARM GNU汇编伪指令简介(1)abort.abort 停止汇编(2)align.align absexpr1,absexpr2 以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或32. 第二个表达式值表示填充的值(3)if...else...endif.if.else.endif: 支持条件预编译(4)include.include "file": 包含指定的头文件, 可以把一个汇编常量定义放在头文件中(5)comm.comm symbol, length:在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接会为它留出空间(6)data.data subsection: 说明接下来的定义归属于subsection数据段(7)equ.equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间(8)global.global symbol: 定义一个全局符号, 通常是为ld使用(9)ascii.ascii "string": 定义一个字符串并为之分配空间(10)byte.byte expressions: 定义一个字节, 并为之分配空间(11)short.short expressions: 定义一个短整型, 并为之分配空间(12)int.int expressions: 定义一个整型,并为之分配空间(13)long.long expressions: 定义一个长整型, 并为之分配空间(14)word.word expressions: 定义一个字,并为之分配空间, 4 bytesword expression就是在当前位置放一个word型的值,这个值就是expression举例来说,_rWTCON:.word 0x15300000就是在当前地址,即_rWTCON处放一个值0x15300000翻译成intel的汇编语句就是:_rWTCON dw 0x15300000例如:ldr r1, _rWTCON_rWTCON:.word 0x15300000不是把地址0x1530 0000 上的内容传递到r1,是把地址_rWTCON上的内容放到r1,而地址_rWTCON上的内容是0x15300000。
汇编语言伪指令
汇编语言伪指令在汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,它们没有对应的机器码。
这些助记符在源程序中的作用是完成汇编程序的各种准备工作,包括定义变量、分配数据存储空间、控制汇编过程、定义程序入口等。
它们仅仅在汇编的过程中起作用,一旦汇编过程结束,它们的使命也就完成了。
这些助记符称为伪指令,它们所完成的操作称为伪操作。
不同汇编器的伪指令可能存在少量的区别,并非所有的伪指令在任何编译器上都能被识别。
一、符号定义伪指令符号定义(Symbol Definition)伪指令用于定义ARM汇编程序中的变量,对变量赋值和定义寄存器别名等,如表1所列。
表1 符号定义伪指令实例:GBLL P_ON ; 定义全局逻辑变量P_ON P_ON SETL {TRUE} ; 给全局逻辑变量P_ON赋值为真LCLA NUM ; 定义局部数字变量NUM NUM SETA 100 ; 给全局数字变量NUM赋值为100RegList RLIST {R0-R5,R8,R10} ; 定义一个寄存器列表RegList,可用微处理器系统结构与嵌入式系统设计(第3版)2; LDM/STM指令访问该列表二、数据定义伪指令数据定义(Data Denfinition)伪指令一般用于为特定的数据分配存储单元,同时完成对已分配存储单元的初始化工作。
数据定义伪指令如表2所示。
表2 数据定义伪指令从使用方法上来讲,数据定义伪指令可以分为以下3类。
1.SPACE伪指令SPACE用于分配一片连续的存储区,并初始化为0。
其中表达式中的数字表示分配的字节数。
SPACE也可以用%代替。
实例:DataSpace SPACE 100 ; 分配连续100字节的存储单元并初始化为0 2.MAP和FIELD伪指令MAP和伪指令FIELD经常结合在一起使用。
MAP用于定义一个结构化的内存表的首地址,可以用“^”替代。
FIELD用于定义一个结构化的内存表中的数据域,可以用“#”代替。
第09讲第04章1.31版_51_060512_汇编伪指令
2006年3月21日
南京大学计算机系 俞建新
4.1.3 数据项
常数 数值常数 字符串常数 变量 段属性 偏移量属性 类型属性 标号 段属性 偏移量属性 距离属性
第9讲 第8页 2006年3月21日 南京大学计算机系 俞建新
4.2 MASM中的表达式
MASM中使用了6类运算符,即: 算术运算符(Arithmetic Operators) 逻辑运算符(Logical Operators) 关系运算符(Relational Operators) 数值返回运算符(Value-Returning Operators) 修改属性运算符(Modifying attribute Operators) 其它运算符(Other Operators)
伪指令语句没有对应的机器代码,并不 像指令语句那样由CPU来执行,它是由 MASM汇编程序对源程序汇编期间进行 处理的。主要完成变量定义,存储器分 配,指示程序开始和结束,段定义,段 分配等。
第9讲 第28页
2006年3月21日
南京大学计算机系 俞建新
伪指令的类型
伪指令语句有如下几种类型:
数据定义语句 DB,DW,DD 符号赋值语句 EQU,= 段定义语句 SEGMENT…ENDS 段分配语句 ASSUME 过程定义语句 PROC…ENDP 程序开始结束语句 ORG,END, 俞建新
数值返回运算符SIZE
格式:SIZE 变量 功能:返回该变量包含的总字节数。 SIZE=LENGTH*TYPE 例4-9 对例4-8定义的M1,M2,M3
MOV CX,SIZE M1 MOV BL,SIZE M2 MOV AL,SIZE M3 汇编时形成指令 MOV CX,200 ;返回此变量包含200个字节单元 MOV BL,2 MOV AL,1
GNUARM汇编伪操作(Directives)命令集
GNUARM汇编伪操作(Directives)命令集本⽂是原创,转载请注明出处1.符号定义伪操作操作符语法格式说明.equ .equ symbol,expr 将symbol定义为expr.set .set symbol,expr 和equ相同(.set=.equ).equiv .equiv symbol 将symbol定义为expr,若symbol已定义则出错.global .global symbol 将symbol定义为全局标号.globl .globl symbol 和.global相同(.globl=.global).extern .extern symbol 声明symbol为⼀个外部变量2.数据定义伪操作.byte .byte expr {,expr}… 分配⼀段字节内存单元,并⽤expr初始化字节内存单元(8bit).hword .bword expr {,expr}… 分配⼀段半字内存单元,并⽤expr初始化半字内存单元 (16bit).short .short expr {,expr}… 同.hword(16bit).word .word expr {,expr}… 分配⼀段字内存单元,并⽤expr初始化字内存单元(32bit).int .int expr {,expr}… 同.word(32bit).long .long expr {,expr}… 同.word(32bit).ascii .ascii expr{,expr}…分配⼀段字符串内存单元,并⽤expr初始化字符串内存单元(⾮零结束符).asciz .asciz expr{,expr}…分配⼀段字符串内存单元,并⽤expr初始化字符串内存单元(零结束符).string .string expr {,expr}… 同.asciz(零结束符).quad .qua expr {,expr}… 分配⼀段双字内存单元,并⽤expr初始化双字内存单元.octa .octa expr{,expr}… 分配⼀段四字内存单元,并⽤expr初始化四字内存单元.float .float expr{,expr}… 分配⼀段字内存单元,并⽤32位IEEE单精度浮点数expr初始化内存单元.single .single expr{,expr}… 同.float.double .double expr{,expr}… 分配⼀段双字内存单元,并⽤64位IEEE双精度浮点数expr初始化内存单元.fill .fill repeat{,size}{,value} ⽤size个字节value填充repeat次(size默认为1,value默认为0).zero .zreo size ⽤0填充size个字节的内存单元.space .space size{,value} ⽤value填充size个字节的内存单元(value默认为0).skip .space size{,value} 同.space.ltorg .ltorg 声明⼀个数据缓冲池(literal pool)3.汇编与反汇编代码控制伪操作.arm .arm 定义⼀下代码使⽤ARM指令集编译.code 32 .code 32 作⽤同.arm.thumb .thumb 定义⼀下代码使⽤Thumb指令集编译.code 16 .code 16 作⽤同.thumb.section .section expr 定义域中包含的段。
第四章伪指令
第四章伪指令汇编语言源程序由一系列语句构成,这些语句既可以是指令,也可以是伪指令。
指令是由CPU负责执行的,每一条指令都和一条机器语言相对应。
而伪指令是由汇编程序负责执行,完成一些内存单元分配、段之间的连接关系等操作,所以伪指令并不会生成机器指令,也就不会被CPU执行。
在本章中,重点讲解一些常用的伪指令及其功能。
4.1伪指令的分类及伪指令语句格式伪指令又称为伪操作,它虽然不会被CPU执行,但却可以指示汇编程序按照用户的意图,完成数据的定义、存储器的分配、指示程序结束等功能。
所以伪指令在汇编语言程序设计过程中具有重要的意义,希望读者在学习过程中应该加以高度重视。
4.1.1 伪指令的分类8088/8086的伪指令大致可分为以下八类:·数据定义伪指令;·符号定义伪指令;·段定义伪指令;·过程定义伪指令;·结束伪指令;·条件汇编伪指令;·结构、记录定义伪指令;·其他伪指令。
其中,条件汇编伪指令与结构、记录定义伪指令将在第八章予以介绍。
4.1.2 伪指令语句格式伪指令语句格式一般由四部分组成。
语句格式: [变量] 伪指令助记符参数1,参数2····参数n[;注释]说明:伪指令助记符规定了伪指令的功能。
一般伪指令都有参数,用于说明伪指令的操作对象,参数的类型和个数随着伪指令的不同而不同。
有时参数是常数或数值表达式,有时参数是一般的符号,有时是具有特殊意义的符号。
伪指令语句中的变量可有可无,如果伪指令语句中出现变量,则汇编程序使其记以第一个字节的偏移地址。
注释部分也是可有可无的,用于说明该伪指令的功能。
例如 VAR1 DW 1234H,5678H ;定义VAR1为字变量该语句中的VAR1为变量;DW为伪指令助记符;1234H与5678H为参数;分号后面给出的文字为注释。
4.2汇编语言中的数据项数据项是指令或伪指令语句操作对象的基本组成部分。
第4章 GNU汇编伪指令集
• 8.重复 • 作用:重复执行后面的命令 • 格式:
– .rept count commands .endr
重复次数
命令序列
.rept 3 .long 0 .endr
.long 0 .long 0 .long 0
陈付龙:嵌入式系统
21
4.1.4 汇编控制伪操作
• 控制汇编程序的执行流程
陈付龙:嵌入式系统
– Symbol .equ expr
start .equ 0x40 start .equ 0x50 mov r1, #start r1
0据定义伪指令
• 为特定的数据分配存储单元 • 初始化存储单元
陈付龙:嵌入式系统
13
• 1.字节分配
• 作用:在存储器中分配一个字节,用指定 的数据对其初始化 • 格式:
– 汇编控制伪操作
• if, else, endif, macro, endm, exitm
– 杂项伪操作
• align, section, data, text, include, arm, code, thumb, weak, end
–…
陈付龙:嵌入式系统
7
4.1.2 符号定义伪指令
• 定义全局变量或局部变量 • 给全局变量或局部变量赋值
陈付龙:嵌入式系统
4
4.1.1 伪指令概念
• 在ARM汇编语言程序中,有一些特殊指令助记符, 这些助记符与指令系统的助记符不同,没有相对应 的操作码,通常称这些特殊指令助记符为伪操作标 识符(directive),它们所完成的操作称为伪操作。 • 它既不控制机器的操作也不被汇编成机器代码,只 能为汇编程序所识别并指导汇编如何进行。 将相对 于程序或相对于寄存器的地址载入寄存器中。 • 伪指令在源程序中的作用是为了完成汇编程序做各 种准备工作的,这些伪操作仅在汇编过程中起作用, 一旦汇编结束,伪操作的使命就完成。
第4章 伪指令与源程序格式汇总
第4章伪指令与源程序格式汇编语言程序的语句有三种,即指令、伪指令,还可以有宏指令。
关于宏指令将在第7章介绍,本章介绍部分常用的伪指令(又称伪操作)。
这些伪指令在程序中是必不可少的,主要用来定义数据变量和程序结构。
本章还介绍指令中的操作数和运算符,通过本章的学习,可以学会使用简便而有效率的指令格式,正确定义数据变量,熟知源程序的格式,编写完整的汇编语言程序。
4.1 伪指令伪指令和指令不同的是,指令是在程序运行期间由计算机的CPU来执行的,而伪指令是在汇编程序对源程序进行汇编期间由汇编程序处理的操作。
它们可以完成如定义数据、定义程序模式、分配存储区、指示程序结束、处理器选择等功能。
这里只介绍一些常用的伪指令。
有些和宏汇编有关的伪指令在介绍宏汇编时再作说明。
4.1.1 处理机选择伪指令由于80x86的所有处理器都支持8086指令系统,但每一种高档的机型又都增加了一些新的指令。
为了能使用这些新增指令,在编写程序时要用处理机选择伪指令对所用的处理机作出选择,也就是说,要告诉汇编程序应该选择哪一种指令系统。
处理机选择伪指令有以下几种:.8086 选择8086指令系统.286 选择8O286指令系统.286P 选择保护方式下的80286指令系统.386 选择80386指令系统.386P 选择保护方式下的8O386指令系统.486 选择80486指令系统.486P 选择保护方式下的8O486指令系统.586 选择Pentium指令系统.586P 选择保护方式下的Pentium指令系统指令中的点‘.’是需要的。
这类伪指令一般放在整个程序的最前面。
如不给出,则汇编程序认为其默认选择是8086指令系统。
4.1.2 段定义伪指令我们结合第2章已介绍的程序实例2来看段定义,注意有分号的注释行,程序如下:例4.1data segment ;定义数据段datastring db ‘hello,world!$’data endscode segment ;定义代码段codeassume cs:code,ds:data ;指定段寄存器和段的关系start:mov ax,data ;对ds赋data段基地址mov ds,axmov dx,offset stringmov ah,9int 21hmov ah,4chint 21hcode endsend start ;汇编结束, 程序起始点start:1.段定义伪指令汇编程序在把源程序转换为目标程序时,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,连接程序对针目标程序把不同的段和模块连接在一起,确定各个段的段地址。
汇编语言伪指令
汇编语言伪指令在编写汇编语言程序时,会用到另一类指令,这类指令仅供汇编程序将源程序翻译成目标程序时使用,本身并不形成机器码,这类指令称为伪指令。
由此可知,指令有二类:(1)汇编指令:是编译后产生气器码的指令。
(2)伪指令:仅供汇编程序使用,编译后不产生气器码的指令。
下面简洁介绍5条伪指令。
1. 汇编起点指令ORG(Origin)指令格式:ORG nn作用:将ORG nn 后的程序机器码或数据存放以nn为首地址的存储单元中。
如在下面的例4-1中,伪指令ORG 2000H 将目标程序从地址2000H处开头存放。
2. 定义字节指令DB (Define Byte)指令格式:[LABEL] DB N1,N2,…,Nm作用:将DB后的8位字节数据N1,N2,…,Nm依次存入以标号LABEL为首地址的存储单元中。
若无标号,则N1,N2,…Nm依次存放在DB上一条指令之后的存储单元中。
如在例4-1中伪指令DB 将字节数据55,38依次存放到以标号LABEL3为首地址的存储单元2100H~2101H中。
3. 定义字指令DW (Define Word)指令格式:[LABEL] DW NN1,NN2,…,NNm作用:将DW后的16位字数据NN1,NN2,…,NNm依次存放到以标号LABEL为首地址的存储单元中,若无标号,则NN1,NN2,…,NNm依次存放在DW上一条指令之后的存储单元中。
在例4-1中,伪指令DW 同样可将字数据5538存放到以标号LABEL3为地址的存储单元2100H~2101H中。
4. 等值指令EQU (Equate)指令格式:LABEL EQU nn作用:将16位地址nn赋给标号LABEL,在例4-1中,伪指令LABEL0 EQU 2100H将地址2100H赋给标号LABEL0。
5. 结束汇编指令END作用:汇编程序编译源程序时,遇到伪指令END,不管END下面是否还有其它指令都将停止编译。
例1 将地址为2100H存储单元中内容55与地址为2101H存储单元内容38进行十进制数相加,运算结果93存放在地址为2102H的存储单元中。
GNU环境下的伪指令
• • • • • • • • • • • •
MOVR0,#0X3000 MOV R2,#100 MOV R9,#0 MOV R8,#0 loop_2 LDR ADDS ADC SUBS BNE Stop B END Stop ;文件结束 R1,[R0],#4 R8,R1,R8 R9,R9,#0 R2,R2,#1 loop_2
格式:.include "file_name" 说明 • 用于将一个源文件包含到当前的源文件中, 所包含的文件在.include指令的位置处进行 汇编处理。
(2)条件编译伪操作.if
格式
.if logical_expression 程序代码段A {.else 程序代码段B } . .endif
• 例如:
abc SETS "one "" double quote" improb SETS "literal":CC:(abc:LEFT:4)
6)局部标号
• 局部标号是一个0~99之间的十进制数 字,可重复定义。局部标号后面可以紧 接一个通常表示该局部变量作用范围的 符号。局部变量的作用范围为当前段, 也可以用伪操作ROUT来定义局部标号 的作用范围。 • 局部变量命名语法:n{routname} • 局部变量引用的语法格式: %{F|B}{A|T}n{routname} 汇编器默认搜索:先向后搜索,再向前 搜索。从当前层次到宏最高层次,比当
Stop: .end
B @文件结束
4.4 ADT IDT集成开发环境
• ADT 嵌入式开发环境由ADT Emulator for ARM 和ADT IDE for ARM组成。 • ADT Emulator for ARM 通过JTAG 实现 主机和目标机之间的调试支持功能。目标 程序直接在目标板上运行,通过ARM 芯 片的JTAG 边界扫描口进行调试。 • ADT IDE for ARM 为用户提供高效明晰的 图形化嵌入式应用软件开发环境,包括一 整套完备的面向嵌入式系统的开发和调试 工具:源码编辑器、工程管理器、工程编 译器(编译器、汇编器和连接器)、集成 调试环境、ADT Emulator for ARM 调试
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
a: .string “abc” //分配了4字节(含\0) a: .ascii “abc” //分配了3字节 a: .asciz “abc” //分配了4字节
陈付龙:嵌入式系统
20
a
0x1234
陈付龙:嵌入式系统
short a=0x1234;
15
• 3.四字节分配 • 作用:在存储器中分配4个字节,并初始化 • 格式:
– label: .word expr – label: .long expr
-2^16~2^32-1的数字 程序标号
a: .word 0x12345678
a 0x12345678
• 作用:
– ADR伪指令为小范围地址读取伪指令。ADR伪指令将基于PC相对偏移地 址或基于寄存器相对偏移地址值读取到寄存器中,当地址值是字节对齐 时,取值范围为−255~255,当地址值是字对齐时,取值范围为−1020~ 1020。当地址值是16字节对齐时其取值范围更大。 – 相于PC寄存器或其它寄存器的小范围转移。
陈付龙:嵌入式系统
5
伪指令格式
.伪指令
陈付龙:嵌入式系统
6
伪指令种类
• 在GNU平台无关的汇编程序中,伪指令主要有
– 符号定义伪操作
• global, local, set, equ
– 数据定义伪操作
• byte, short, word, long, quad, float, space, skip, string, ascii, asciz, rept
22
• 1.选择 • 作用:根据条件判断,决定是否执行某个指令序列 • 格式:
– .if logical-expression commands [ .else commands] .endif – .if logical-expression commands .elseif logical-expression commands [.elseif logical-expression commands] .endif
陈付龙:嵌入式系统
25
4.1.5 杂项伪操作
• • • • • • • • • • • • align section data text include arm code 32 code 16 thumb extern weak end
陈付龙:嵌入式系统
26
• 1.align • 格式:
– .align abs-expr
– .extern symbol
• 作用:声明一个外部符号
陈付龙:嵌入式系统
34
• 9.weak • 格式:
– .weak symbol
• 作用:声明一个弱符号
陈付龙:嵌入式系统
35
• 10.end • 格式:
– .end
• 作用:汇编结束
陈付龙:嵌入式系统
36
4.2 GNU汇编器支持的ARM伪指令
陈付龙:嵌入式系统
38
• 使用说明:
– ADR伪指令被汇编器编译成一条指令。汇编器 通常使用ADD指令或SUB指令来实现伪操作的地 址装载功能。如果不能用一条指令来实现ADR 伪指令的功能,汇编器将报告错误。
• 示例:
LDR R4,=data+4*n ; code MOV pc,lr data DCD value0 ; n-1条 DCD 伪操作 DCD valuen ;更多 DCD 伪操作 ;n是汇编时产生的变量
陈付龙:嵌入式系统
8
• 1.全局标号定义 • 作用:定义一个全局符号,通常是为连接 器ld使用 • 格式:
– .global symbol – .globl symbol
陈付龙:嵌入式系统
9
• 2.局部标号定义
• 作用:定义对外部不可见的局部符号,作 用域仅在当前文件中 • 格式:
– .local symbol
• ARM汇编器支持ARM伪指令
– ADR – ADRL – LDR 它们在汇编阶段被编译成ARM或Thumb指令(指 令序列)
陈付龙:嵌入式系统
37
4.2.1 ADR伪指令
• 格式:
ADR{cond}{.W} <register> , =<expression> – ① cond,可选的指令执行条件 – ② .W,可选项。指定指令宽度(Thumb-2指令集支 持) – ③ register,目标寄存器 – ④ expression ,基于PC或具有寄存器的表达式。
陈付龙:嵌入式系统
4
4.1.1 伪指令概念
• 在ARM汇编语言程序中,有一些特殊指令助记符, 这些助记符与指令系统的助记符不同,没有相对应 的操作码,通常称这些特殊指令助记符为伪操作标 识符(directive),它们所完成的操作称为伪操作。 • 它既不控制机器的操作也不被汇编成机器代码,只 能为汇编程序所识别并指导汇编如何进行。 将相对 于程序或相对于寄存器的地址载入寄存器中。 • 伪指令在源程序中的作用是为了完成汇编程序做各 种准备工作的,这些伪操作仅在汇编过程中起作用, 一旦汇编结束,伪操作的使命就完成。
陈付龙:嵌入式系统
int a=0x12345678;
16
• 4.八字节分配 • 作用:在存储器中分配8个字节,并初始化 • 格式:
– label: .quad expr
程序标号
-2^32~2^64-1的数字
a: .quad 0x1234567812345678
long a=0x1234567812345678;
31
• 6.arm • 格式:
– .arm
• 作用:定义一下代码使用arm指令集编译, 功能等价于.code32
陈付龙:嵌入式系统
32
• 7.thumb • 格式:
– .thumb
• 作用:定义一下代码使用thumb指令集编译, 功能等价于.code16
陈付龙:嵌入式系统
33
• 8.extern • 格式:
– Symbol .equ expr
start .equ 0x40 start .equ 0x50 mov r1, #start r1
0x50
陈付龙:嵌入式系统
12
4.1.3 数据定义伪指令
• 为特定的数据分配存储单元 • 初始化存储单元
陈付龙:嵌入式系统
13
• 1.字节分配
• 作用:在存储器中分配一个字节,用指定 的数据对其初始化 • 格式:
.long \from .if \to-\from sum "(\from+1)",\to .endif .endm
sum 0,5
.long .long .long .long .long
1 2 3 4 5
24
陈付龙:嵌入式系统
举例
.macro SHIFTLEFT a, b .if \b < 0 mov \a, \a, ASR #-\b .exitm .endif mov \a, \a, LSL #\b .endm
– 汇编控制伪操作
• if, else, endif, macro, endm, exitm
– 杂项伪操作
• align, section, data, text, include, arm, code, thumb, weak, end
–…
陈付龙:嵌入式系统
7
4.1.2 符号定义伪指令
• 定义全局变量或局部变量 • 给全局变量或局部变量赋值
陈付龙:嵌入式系统
23
• 2.宏 • 作用:定义宏代码段,.macro: 定义一段宏 代码, .macro表示代码的开始, .endm表示代 码的结束, .exitm跳出宏 参数 宏名 • 格式:
– .macro macroname macArgs commands .long 0 .macro sum from=0, to=5 .endm
Richard Stallman
/binutils/docs-2.12//Pseudo-Ops.html#Pseudo%20Ops
陈付龙:嵌入式系统
3
/binutils/docs-2.12//Pseudo-Ops.html#Pseudo%20Ops
• 作用:通过填充字节的方式,使当前位置 满足一定的对齐方式
a
.align 2 .string “abcde”
2^2字节对齐
b c d e
陈付龙:嵌入式系统
27
• 2.section • 格式:
– .section sectioname
• 作用:定义一个段
陈付龙:嵌入式系统
28
• 3.data • 格式:
– label: .space size, expr – label: .skip size, expr
程序标号 内存字节数 4字节之内的值
a: .space 8,0x1
char a[8]={0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1};
陈付龙:嵌入式系统
19
• 7.字符串定义 • 作用:定义一个字符串 • 格式:
陈付龙:嵌入式系统
10
• 3.变量赋值 • 作用:给一个全局变量或局部变量赋值 • 格式:
– .set symbol, expr
.set start, 0x40 .set start, 0x50 mov r1, #start r1
0x50
陈付龙:嵌入式系统
11
• 4.宏替换 • 作用:给一个全局变量或局部变量赋值 • 格式: