第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章(伪指令)

第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章   伪指令及汇编语言源程序
2019/4/12 9
第 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

第4章 ARM程序设计基础-伪指令2
X:LAND:Y X:LOR:Y :LNOT:Y X:LEOR:Y ;表示将X和Y作逻辑与的操作 ;表示将X和Y作逻辑或的操作 ;表示将Y作逻辑非的操作 ;表示将X和Y作逻辑异或的操作
操作结果为{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个字节单元。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– label: .string str – label: .ascii str – label: .asciz str
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.宏替换 • 作用:给一个全局变量或局部变量赋值 • 格式:
相关文档
最新文档