汇编语言中常用的伪指令档
伪指令

南京航空航天大学信息科学与技术学院 石燕
DCW ( DCWU )
语法格式: 语法格式: 标号 DCW (或 DCWU ) 表达式 DCW (或 DCWU)伪指令用于分配一片连续的 ) 半字存储单元并用伪指令中指定的表达式初始化。 半字存储单元并用伪指令中指定的表达式初始化。 其中,表达式可以为程序标号或数字表达式。 其中,表达式可以为程序标号或数字表达式。 分配的字存储单元是半字对齐的, 用 DCW 分配的字存储单元是半字对齐的,而用 DCWU分配的字存储单元并不严格半字对齐。 分配的字存储单元并不严格半字对齐。 分配的字存储单元并不严格半字对齐 使用示例: 使用示例: DataTest DCW 1 , 2 , 3 分配一片连续的半字存储单元并初始化。 分配一片连续的半字存储单元并初始化。
南京航空航天大学信息科学与技术学院 石燕
SPACE
语法格式: 语法格式: 标号 SPACE 表达式 SPACE 伪指令用于分配一片连续的存储区域 并初始化为 0。其中,表达式为要分配的字节 。其中, 数。 代替。 也可用 “ % ” 代替。 使用示例: 使用示例: DataSpace SPACE 100 分配连续 100 字节的存储单元并初始化为 0
南京航空航天大学信息科学与技术学院 石燕
SETA 、 SETL 、 SETS
语法格式: 语法格式: 变量名 SETA ( SETL 或 SETS ) 表达式 伪指令 SETA 、 SETL 、 SETS用于给一 用于给一 个已经定义的全局变量或局部变量赋值。 个已经定义的全局变量或局部变量赋值。 SETA 伪指令用于给一个数学变量赋值 SETL 伪指令用于给一个逻辑变量赋值 SETS 伪指令用于给一个字符串变量赋值
南京航空航天大学信息科学与技术学院 石燕
51单片机汇编指令及伪指令小结

51单片机汇编指令及伪指令小结51单片机汇编指令及伪指令小结51单片机是一种广泛应用的基于汇编语言的微控制器。
它的汇编指令集非常丰富,包括了基本的数据处理、逻辑运算、分支跳转、数据存储和输入输出等指令。
汇编指令的灵活运用可以实现各种复杂的功能,因此掌握51单片机的汇编指令是开发嵌入式系统的重要基础。
1. 基本数据处理指令51单片机汇编指令集包括了一系列基本的数据处理指令,如加法(add)、减法(sub)、乘法(mul)、除法(div)等。
这些指令用于实现对数据的基本运算操作。
2. 逻辑运算指令逻辑运算指令用于实现各种逻辑运算,如与(and)、或(or)、非(not)、异或(xor)等。
这些指令通常用于处理数据的开关控制、状态判断等功能。
3. 分支跳转指令分支跳转指令用于实现程序的流程控制。
常用的分支跳转指令包括无条件跳转(jmp)、条件跳转(jz、jnz、jc、jnc等)、循环跳转(loop)等。
这些指令可以根据条件和需求设置程序的执行流程,实现各种循环、分支等功能。
4. 数据存储指令数据存储指令用于实现数据的存储和加载操作。
常用的存储指令包括将数据存储到寄存器或内存中(mov)、将数据从寄存器或内存中加载(ld)等。
这些指令通过对数据的存储和加载,实现对数据的读写操作。
5. 输入输出指令输入输出指令用于实现与外设的数据通信。
常用的输入输出指令包括从端口输入(instr)、输出到端口(outstr)等。
这些指令通过与外部设备的数据交互,实现嵌入式系统与外设的连接。
除了以上的基本指令外,51单片机还提供了一些伪指令,用于程序的组织和调试。
这些伪指令包括宏指令、条件编译指令、调试指令等。
1. 宏指令宏指令是一种通过宏展开的方式来扩展汇编代码的指令。
它通过提前定义一些宏,并在代码中使用这些宏来生成更复杂的汇编代码。
宏指令的好处是可以简化代码的书写,使得程序的逻辑更清晰。
2. 条件编译指令条件编译指令用于根据编译时的条件来选择性地编译代码。
汇编 第四章伪指令及汇编语言源程序结构

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 ┆
ARM汇编语言伪指令

鲁东大学 LUDONG UNIVERSITY
VersionNumber
Example
GBLA VersionNumber SETA 21
Debug
GBLL Debug SETL {TRUE}
GBLS VersionString VersionString SETS "Version 1.0"
鲁东大学 LUDONG UNIVERSITY
MEND
数据定义伪指令
鲁东大学 LUDONG UNIVERSITY
数据定义指令(Data definition directives):用于进行 数据空间分配。
SPACE DCB DCD, DCDU
MAP, FIELD
SPACE
鲁东大学 LUDONG UNIVERSITY
The SPACE directive reserves a zeroed block of memory.
伪指令举例
鲁东大学 LUDONG UNIVERSITY
AREA ThumbSub, CODE, READONLY ENTRY CODE32 ;ARM
header ADR r0, start + 1 CODE16 ;Thumb.
start MOV r0, #10
doadd MOV pc, lr
END
GBLA, GBLL, GBLS LCLA, LCLL, LCLS SETA, SETL,SETS
全局变量声明
鲁东大学 LUDONG UNIVERSITY
GBLA, GBLL, GBLS
-- 声明一个全局的算术、逻辑和串变量
Directives GBLA
Variable Type arithmetic
第二部分 汇编语言程序设计——伪指令

例3.2:数据定义综合应用-2/2
.code .startup mov bl,bvar mov ax,word ptr dvar[0] mov dx,word ptr dvar[2] ;取双字到DX.AX mov dx,offset msg mov ah,09h CALLDOS .exit 0 end
运算符
算术运算符 + - * / MOD 逻辑运算符 AND OR XOR NOT 移位运算符 SHL SHR 关系运算符 EQ NE GT LT GE LE 高低分离符 HIGH LOW HIGHWORD LOWWORD
地址型参数
汇编语言程序中,指令参数还有地址型,
它的主要形式是标号和名字(变量名、段 名、过程名等) 硬指令的操作数有存储单元;存储单元就 应该用地址型参数(存储器操作数)表达
定义字节单元伪指令DB
DB伪指令用于分配一个或多个字节单元, 并可以将它们初始化为指定值 初值表中每个数据一定是字节量 (Byte),存放一个8位数据: 可以是0~255的无符号数 或是-128~+127带符号数 也可以是字符串常数
data X Y data
segment ;数据段 db 'a',-5 db 2 dup(100),? db 'ABC' ends
例3.4:属性及其应用-2/5
.code .startup mov al,byte ptr v_word ;用PTR改变v_word的类型,否则类型不匹配 dec al mov v_byte,al ;对v_word的头一个字节操作,原为32H、现为31H n_label: cmp flag,1 jz s_label ;flag单元为1转移 inc flag jmp n_label ;进行短转移
汇编器伪指令

汇编器伪指令本章讲解汇编器的伪指令。
说明如何定义符号和怎样控制代码和数据在程序存储器中的位置。
简介Ax51汇编器有一些伪指令,可以让我们定义符号值,预留和初始化内存,以及控制代码的位置。
不要把伪指令与指令相混淆。
伪指令不产生可执行的代码,除DB,DW和DD之外,它们对代码存储器的内容没有直接的影响。
这些伪指令改变汇编器的状态,定义用户符号,以及添加信息到目标文件。
下表是对汇编器伪指令的一个汇总。
关于每条伪指令的详细信息,请点击相应链接查看。
伪指令 格 式 说 明BIT符号 BIT 位地址 在位数据空间定义一个位地址。
BSEG BSEG [AT 绝对地址] 在位地址空间定义一个绝对地址段。
CODE符号 CODE 代码地址 为代码空间内的一个指定地址分配一个符号名。
CSEG CSEG [AT 绝对地址] 在代码地址空间定义一个绝对地址段。
DATA符号 DATA 数据地址 给一个指定的片内数据地址分配一个符号名。
DB [标号:] DB 表达式[, 表达式...]定义一列字节型数值。
DBIT[标号:] DBIT 表达式 在位单元中预留一个空间。
DD [标号:] DD 表达式[, 表达式...]定义一列双字型数值。
DS[标号:] DS 表达式 在字节空间预留空间。
DSB[标号:] DSB 表达式 在字节空间预留空间。
DSD[标号:] DSD 表达式 在双字空间预留空间。
DSEG DSEG [AT 绝对地址] 在间接寻址内部数据空间定义一个绝对段。
DSW[标号:] DSW 表达式 在字空间预留空间;增加当前段的位置计数器。
DW [标号:] DW 表达式[, 表达式...]定义一列字数值。
END END 指示程序的结束。
EQU EQU 表达式 永久设置符号值。
__ERROR____ERROR__ 文本 产生一条标准的出错信息。
罗亩按:前后均是两条下划线(_)。
EVEN EVEN 确保变量的字对齐。
EXTRN EXTRN 存储空间类型 [:数据类型] (符号 [, ...])定义在当前模块中引用的在其它模块中定义的符号。
ch4-1汇编语言程序设计(伪指令)

由汇编程序执行的“指令系统” 用于定义变量、分配存储区、定义逻辑段、
指示程序开始和结束等 在汇编时被解释执行,不产生任何目标代码
常用伪指令分类
数据定义伪指令 符号定义伪指令 段定义伪指令 过程定义伪指令 宏命令伪指令 结束伪指令
第四章 汇编语言程序设计
第四章 汇编语言程序设计
data SEGMENT
名字 Hello DB ‘Hello, world!’,0DH,0AH,’$’
data ENDS prog SEGMENT
伪指令
ASSUME CS:prog ,DS:data
start: MOV AX,data
MOV DS,AX
标号
LEA DX,hello
MOV AH,9
INT 21H 指令码 MOV AH,4CH
NUM:ADD AL,30H
RET
第四章 汇编语言程序设计
2.汇编语言与高级语言
• 汇编语言是一种依赖于计算机微处理器的语言 • 汇编语言一般不具有通用性和可移植性 • 进行汇编语言程序设计必须熟悉机器的硬件资
源和软件资源 • 高级语言是面向过程的语言 • 高级语言具有很好的通用性和可移植性
第四章 汇编语言程序设计
INT 21H
prog ENDS
操作数
END start
(4)操作数
常量 变量或标号 表达式 寄存器 存储器单元
第四章 汇编语言程序设计
第四章 汇编语言程序设计
表达式: 算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算
有数字表达式和地址表达式两种。 汇编时按优先规则对表达式进行计算,计算出
注意:
名字和标号: 标号后有冒号,在指令性语句前;名字后不加
8086伪指令

8086伪指令(汇编语言程序格式)汇编语言程序中的语句可以由指令、伪指令和宏指令组成。
上一章我们介绍了8086指令系统中的6类指令,每一条指令都对应一种CPU操作。
伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。
宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。
宏指令将在第七章中介绍。
伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。
和各种指令一样,伪指令也是程序设计不可缺少的工具。
下面介绍一些常用的伪指令。
4.2.1 段定义伪指令段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。
4.2.1.1 完整的段定义伪指令完整段定义伪指令的格式如下:段名 SEGMENT...段名 ENDS段名由用户命名。
对于数据段、附加段和堆栈段来说,段内一般是存储单元的定义、分配等伪指令语句;对于代码段中则主要是指令及伪指令语句。
定义了段还必须说明哪个段是代码段,哪个段是数据段。
ASSUME伪指令就是建立段和段寄存器关系的伪指令,其格式为:ASSUME 段寄存器名: 段名,…段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT定义的段名。
·定位类型:说明段的起始边界值(物理地址)。
·组合类型:说明程序连接时的段组合方法。
·类别:在单引号中给出连接时组成段组的类型名。
连接程序可把相同类别的段的位置靠在一起。
例4.1; * * * * * * * * * * * * * * * * * * * * * * *data_seg1 segment ; 定义数据段...data_seg1 ends; * * * * * * * * * * * * * * * * * * * * * * *data_seg2 segment ; 定义附加段...data_seg2 ends; * * * * * * * * * * * * * * * * * * * * * * *code_seg segment ; 定义代码段assume cs:code_seg, ds:data_seg1, es:data_seg2start: ; 程序执行的起始地址; set DS register to current data segmentmov ax, data_seg1 ; 数据段地址mov ds, ax ; 存入DS寄存器; set ES register to current extra segmentmov ax, data_seg2 ; 附加段地址mov es, ax ; 存入ES寄存器...code_seg ends ; 代码段结束; * * * * * * * * * * * * * * * * * * * * * * * * * *end start由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:MOV AX,DATA_SEG1 ; 数据段地址MOV DS,AX ; 存入DS寄存器MOV AX,DATA_SEG2 ; 附加段地址MOV ES,AX ; 存入ES寄存器如果程序中还定义了堆栈段STACK_SEG,也需要把段地址装入SS中:MOV AX,STACK_SEG ; 堆栈段地址MOV SS,AX ; 存入ES寄存器注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入CS寄存器了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言中常用的伪指令
分类: 软件相关2013-01-23 20:13 515人阅读 评论(0) 收藏 举报
areaequ伪指令常用汇编语言
汇编语言中,指令语句在源程序汇编时会产生可供计算机执行的指令代码,即目标代码。汇
编程序除指令语句外,还需要提供一些指令,用于辅助源程序的汇编。比如指定程序或数据
存放的起始地址,为数据分配一段连续的内存单元等。这些指令在汇编时并不生成目标代码,
不影响程序执行,因此称之为伪指令。本文简单总结了常用的伪指令,如下。
1、EQU(Equate)
一般格式为: 标号: EQU 操作数
指令功能为将操作数赋予标号,两边的值完全相等。使用EQU伪指令给一个标号赋值后,
此标号在整个源文件中值固定。
AREA: EQU 1000H ;将标号AREA赋值为1000H
2、ORG(Origin)
一般格式为: ORG xxxxH(绝对地址或标号)
XxxxH决定此语句后第一条指令(或数据)的地址。该段源程序或数据被连续存放在此后
的地址内,直到下一条ORG指令为止。
ORG 8000H ;此后目标代码存储在存储器中以0x8000h开始的地址空间
中。
ADD R1, #1
MOV R2, #2
3、DB(Define Byte)
一般格式为: 标号: DB 字节常数或字符或表达式
标号字段可有可无,字节常数或字符是指一个字节数据。此伪指令的功能是把字节常数或字
节串存放至内存连续的地址空间中。
ORG 8000H
DATA1: DB 43H,09H,08H
DATA2: DB 07H
伪指令DB指定了43H,09H,08H 顺序存放在8000H开始的存储单元中,DATA2中
的07H紧挨着DATA1的地址空间存放,即07H存放在8003H单元中。
注:DW(Define Word)指令定义与DB类似,区别在于DW定义一个字,DB定义一个字
节。
4、END
一般格式为: 标号: END 地址或标号
地址或标号可以忽略。此伪指令用于指示汇编语言程序段结束。因此一个源程序中仅有一个
END,且一般放在程序最后。若END放在程序中间,则END后面的语句将不再被汇编。
5、AREA
一般格式为: 标号 sectionname{,attr}{,attr}……
Sectionname指定节的名称。节是不可分的已命名独立代码模块或数据模块,由连接器进
行处理。
Attr则是一个或多个用逗号分隔的节的属性。属性有多种,比如:
ALIGN=expression。默认条件下节以四字节边界对齐。Expression取值范围为0-31.表征
的对齐边界是2的expression平方。
CODE 包含机器指令。默认值为READONLY
DATA 包含数据但不包含指令。默认值为READWRITE
READONLY 指示此节只读。代码区域默认值。
READWRITE 指示此节可读可写。数据区域默认值。
AREA Example, DATA, READWRITE
;data
以上代码定义了名为Example的可读写数据节。
6、PUBLIC
一般格式为: PUBLIC 标识符1,标识符2……
在开发较为复杂的应用程序时,其执行文件的生成一般由多个目标文件链接而成。多个目标
文件之间一般存在数据交互,汇编语言中通过伪指令PUBLIC及EXTRN来解决模块之间的
联系。PUBLIC用来说明当前模块中可被其他模块所引用的公共标识符。
PUBLIC _STARTUP
声明标识符_STARTUP可被其他模块所引用。
7、EXTRN或EXTERN
一般格式为: EXTRN 标识符1:类型1,标识符2:类型2…….
表明标识符1、2是外部标识符,其已经在其他模块中被定义为类型1、类型2等。在一个
模块中,可用多条EXTRN来说明本模块中所引用的外部标识符。实质为汇编器提供一个并
未在当前汇编文件中定义的名称。
注:EXTRN所声明的标识符必须在其定义的模块中被PUBLIC声明为公共标识符,且声明
的标识符类型需与该标识符定义类型一致。
类似:EXPORT或GLOBAL
声明一个符号,链接器可以使用此符号解析不同对象和库文件中的符号引用。即,可使其他
文件中的代码能够访问当前文件中的符号。
8、PROC
一般格式为: <过程名> PROC [类型]
此指令为过程定义指令。过程即子程序,一个过程可以被其他程序调用(CALL指令)。
<过程名> PROC [类型]
…….
…….
ENDP
注:PROC和ENDP必须成对出现。
9、SPACE
一般格式为: 标号 SPACE 表达式
此指令用于分配一片连续的存储区域并初始化为0。表达式为要分配的字节数。SPACE可
用“%”来代替。
DataSpace SPACE 1000 ;分配连续1000个字节的存储单元DataSpace
并初始化为0。
10、ENTRY
此指令用于声明程序的入口点。一个程序至少有一个入口点。
AREA TEST, CODE, READONLY
ENTRY ;程序入口点。
11、PRESERVE8
一般格式为: PRESERVE8 {bool}
PRESERVE8指令指定当前文件需保持堆栈八字节对齐方式。其通过设置PRES8编译属性
通知连接器。
PRESERVE8 ;保持代码堆栈八字节对齐。
PRESERVE8 {FALSE} ;不保持代码堆栈八字节对齐。
12、CODE16、CODE32
一般格式为: CODE16(或CODE32)
CODE16通知编译器,其后的指令序列为16位的Thumb指令。
CODE32通知编译器,其后的指令序列为32位的ARM指令。
在实用ARM指令和Thumb指令混合编程的代码里,可使用这两天指令进行切换。注:指
令只能通知编译器其后的指令类型,并不能对处理器进行状态的切换。
12、IMPORT
此指令类似于EXTERN。用于通知编译器即将使用的标号在其他源文件中定义。无论当前
源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
一般格式为: IMPORT 标号 {[WEAK]}
标号在程序中区分大小写,[WEAK]表示当所有源文件中均找不到此标号时,编译器也不会
显示错误信息。
AREA INIT, CODE, READONLY
IMPORT Main ;通知编译器当前文件要引用标号Main,但其定义在其他源文件
中。
END