微机原理与汇编 伪指令
第17章汇编语言伪指令参考资料
因为TABLEA定义为DW,故TYPE返回0002, LENGTH根据DUP的定义返回Hex 0014(20),而SIZE返 回TYPE与LENGTH的乘积,即Hex 28(40)。
第17章 汇编语言伪指令参考资料
17.2 汇编语言伪指令
1. ASSUME伪指令 ASSUME的功能是使汇编程序能将内存段与CS、 DS、ES、SS等段寄存器联系起来。其一般格式为: ASSUME 段寄存器名 :name[, ...]
…
SEG2 ENDS
第17章 汇编语言伪指令参考资料
4. INCLUDE伪指令 你可能会在不同的程序中用到一些内容相同的一 组指令即宏指令。它们可以文件的形式保存,使任何 程序都能使用它。假设有一个将ASCII数转换为二进制 的程序存于C盘,名称是CONVERT.LIB。要获得此文 件,可在源程序中加入INCLUDE句。例如: INCLUDE C :CONVERT.LIB
第17章 汇编语言伪指令参考资料
放置在原来应该编写这段ASCII数转换程序处。汇 编程序会从磁盘找到此文件,并把它的指令语句载入 (展开)使用者的程序。若汇编程序找不到此文件,会发 出错误信息而不进行INCLUDE操作。
汇编程序会在LST文本,把载入的指令语句每一行 的第30个字,印上一个1(第33个字开始是源程序)。
TABLEA DW 10 DUP(?) ...
MOV DX, LENGTH TABLEA
第17章 汇编语言伪指令参考资料
若操作数中不含DUP项,则运算符返回值01。 LENGTH的其他用法,另参考本节中的SIZE及TYPE。
2. OFFSET 运算符 OFFSET运算符返回变量或标号的偏移地址(亦即 数据段或指令段内的偏移地址)。其一般格式为: OFFSET 变量名(标号名)
微原7章2伪指令
X、Y、Z是形式参数。调用宏DADD时可写为: DADD DATA1,DATA2,SUM DATA1,DATA2,SUM是实际参数,由它们替 换定义中的X、Y、Z。
20
宏调用与过程(子程序)调用都是一次定义,多次调 用。它们之间的差别是: ① 执行形式:宏命令伪指令由宏汇编程序在汇编过 理中进行处理,而CALL、RET则是由CPU执行的 指令。
‘ H’ 45H ‘ E’ 4CH ‘L’ 4CH ‘L’ 4FH ‘ O’ 注意下面两个定义的不同之处: STR
48H
存 的 是 字 符 的
AB属于两个数据
ASCII
码
DB ‘AB’ DW ‘AB’
;41H在低字节,42H在高字节 ;42H在低字节,41H在高字节
AB属于一个数据
5
例3: TABLE DB 10 DUP(?) 设TABLE的偏移地址为0080H,则汇编后如下 图所示:
22
7.5 系统功能调用介绍
系统功能调用——由操作系统提供的几十个实现特殊功能 的子程序供程序员在程序中调用,以减轻编程工作量。 它们被看成是几十个中断服务程序,每个程序对应一个中 断类型码。用户程序在调用这些系统服务程序时,不是用 CALL命令,而是采用软中断指令INT n来实现。 即把一个中断类型码(n)对应一类子程序 其中一类叫“系统功能调用”的子程序,对应的中断类型 码是21,用软中断指令INT 21H来实现调用。 输入输出语句,VB Print Inputbox 等语句或函数来实现;C 中是Printf scanf。汇编语言中用什么来实现呢? 23
(用CALL指令),一个过程由伪指令PROC和ENDP
来定义,其格式为:
<过程名>
PROC … … RET ENDP [类型] 过程的最后一条指 令一般是返回指令 (RET)。
汇编 第四章伪指令及汇编语言源程序结构
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 ┆
4-10汇编伪指令
⏹⏹⏹⏹⏹⏹数据定义伪指令⏹数据定义☐格式:[变量名] 类型定义符参数{[,参数]}☐操作:为变量分配存储空间,并置初值到存储单元可为DB/DW/DD/DF/DQ/DT,表示每个参数占1/2/4/6/8/10字节存储空间,字符串变量只能用DB类型定义可为常数、表达式、?表达式、字符串、DUP表达式字符串用单引号括起来,如‘ABCDE’DUP表达式格式:n DUP(参数{[,参数]})DATA SEGMENTX1 DB 40HX2 DW 1764HX3 DB 10,20,30Y1 DB 20H,?S1 DB ‘HEL’S2 DB ‘H’, ‘E’, ‘L’S3 DW ‘HE’V1 DW 2 DUP(2,4)V2 DB 2 DUP(?,2 DUP(‘A’,‘B’) ) DATA ENDS40H64H17H10203020H02H00H04H00H02H00H04H00H‘A’‘B’‘A’‘B’‘A’‘B’‘A’‘B’X1X2X3Y1S1‘H’‘E’‘L’‘H’‘E’‘L’‘E’‘H’S2S3V1V2⏹⏹段定义伪指令⏹定位类型,指定当前段起始地址的性质默认选项☐PARA:起始地址的低4位为0H,即16的倍数☐PAGE:起始地址的低8位为00H,即256的倍数☐BYTE:可从任意地址开始☐WORD:当前段的起始地址为偶地址段定义伪指令⏹组合类型,指明程序连接时,段的合并方法默认选项☐PRIVATE:不与其他模块中任何段连接或重叠☐PUBLIC:不同模块中PUBLIC类型的同名段连接在一起,形成一个单一的段(段长为∑)☐COMMON:不同模块中COMMON类型的同名段重叠在一起,共享相同的存储区(共享存储区长度为max)☐STACK:功能同PUBLIC,但新段为堆栈段(段长为∑)⏹类别名☐段定义伪指令示例D_SEG SEGMENTNUM1 DB 10 DUP(?)D_SEG ENDSS_SEG SEGMENTDW 100 DUP(?)S_SEG ENDSE_SEG SEGMENT STRING DB 'HELLO' E_SEG ENDS 每个段具体对应到什么性质的段,取决于段寄存器的指向回顾:在汇编程序中,从段的性质上看,可分为代码段、堆栈段、数据段和附加段4种。
微机原理与接口技术:伪指令
知识点4.2伪指令4.2 伪指令MASM设置了几十种伪指令,可以分为如下几类:设定存储器段伪指令数据定义伪指令符号定义伪指令过程定义伪指令宏命令伪指令其他伪指令.286选择80286指令系统.286P选择80286保护模式指令系统.386选择80386指令系统.386P选择80386保护模式指令系统.486选择80486指令系统.486P选择80486保护模式指令系统.586选择80586指令系统.586P选择80586保护模式指令系统.686选择80686指令系统.686P选择80686保护模式指令系统.287选择80287数字协处理器.387选择80387数字协处理器.CODE指示代码段开始.DATA指示数据段开始.EXIT返回到DOS.MODEL选择编辑模型.STACK选择堆栈段开始.STARTUP使用编程模型时,指示程序开始ASSUME在以完整的段定义方式编程时,通知汇编程序每个段的名字。
DB定义字节类型的数据(8位)DW定义字类型的数据(16位)DD定义双字类型的数据(32位)DQ定义4字类型的数据(64位)SEGMENT定义存储段开始ENDS指示段或者数据结构结束END 指示程序结束PROC定义过程开始ENDP指示过程结束EQU标号等于数据ORG设置段的起始地址DUP产生重复的字符或数据PTR指示一个指针FAR PTR定义一个远指针NEAR PTR定义一个近指针BYTE PTR指示为字节类型的数据DWORD PTR定义数据长度为双字QWORD PTR 指示数据长度为4字OWORD PTR指示为8进制字STACK堆栈段开始STRUC指定数据结构开始USES在过程中,自动将寄存器压栈USE16使用16位的指令模式USE32使用32位的指令模式ALIGN n按字边界起始的数据MACRO宏定义开始ENDM宏序列结束1.段定义伪指令段定义伪指令SEGMENT和ENDS格式:段名SEGMENT [定位类型] [组合类型] [类别]…段名ENDS例如:DATA SEGMENT‘DATA’BUFFER DB 100 DUP(?)COUNT DW 100DATA ENDS(1)定位类型:说明该段对起始地址的要求。
汇编指令、伪指令大全
MOV指令为双操作数指令,两个操作数中必须有一个是寄存器.MOV DST , SRC // Byte / Word执行操作: dst = src1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器).2.立即数不能直接送段寄存器3.不允许在两个存储单元直接传送数据4.不允许在两个段寄存器间直接传送信息PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作.PUSH SRC //Word入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器.入栈时高位字节先入栈,低位字节后入栈.POP DST //Word出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器.执行POP SS指令后,堆栈区在存储区的位置要改变.执行POP SP 指令后,栈顶的位置要改变.XCHG(eXCHanG)交换指令: 将两操作数值交换.XCHG OPR1, OPR2 //Byte/Word执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必须有一个操作数是在寄存器中2.不能与段寄存器交换数据3.存储器与存储器之间不能交换数据.XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码.XLAT (OPR 可选) //Byte执行操作: AL=(BX+AL)指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码.LEA(Load Effective Address) 有效地址传送寄存器指令LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中.执行操作: REG = EAsrc注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器MOV BX , OFFSET OPER_ONE 等价于 LEA BX , OPER_ONEMOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中LDS(Load DS with pointer)指针送寄存器和DS指令LDS REG , SRC //常指定SI寄存器。
微机原理 第7章 微型计算机汇编语言及汇编程序
3) 操作数
汇编语言语句中的第三个组成部分是操作数。在指令语句中 是指令的操作数,可能有单操作数或双操作数,也可能无操作数; 而在伪指令中可能有更多个操作数。当操作数不止一个时,相互 之间应该用逗号隔开。
可以作为操作数的有常数、寄存器、标号、变量和表达式等。 (1) 常数。常数就是指令中出现的那些固定值,可以分为数值常 数和字符串常数两类。例如,立即数寻址时所有的立即数、直接 寻址时所有的地址、ASCII字符串等都是常数。常数是除了自身 的值以外,没有其他属性的数值。在源程序中,数值常数按其基 数的不同,可有二进制数、八进制数、十进制数、十六进制数等 几种不同表示形式。汇编语言用不同的后缀加以区别。
言语句来说,注释部分并不是必要的,但是加上适当的注释以后,
注释前面要求加上分号(;)。如果注释的内容较多,超过一行, 以表示对一个程序段的说明。 汇编程序对于注释不予理会,即注释对汇编后产生的目标程
则换行以后前面还要加上分号。注释也可以从一行的最前面开始,
序没有任何影响。
7.2 伪 指 令
一、 数据定义伪指令
② 变量的偏移量属性是该变量所在段的起始地址与变量的 地址之间的字节数。 ③ 变量的类型属性有BYTE(字节)、WORD(字)、 DWORD (双字)、 QWORD (四字)、TBYTE(十字)等,表示数据区中存取 操作对象的大小。 2) 助记符 汇编语言语句中的第二个组成部分是助记符(Memonic)。 在指令语句中的第二部分是CPU指令系统中指令的助记符, 如MOV、ADC等。助记符约有90多种,在第5章中已经进行了 详细的讨论。 在伪指令语句中的第二部分是伪指令的定义符。它们在程 序中的作用是定义变量的类型、定义段以及告诉汇编程序结束 汇编等。关于伪指令的作用和使用方法,将在之后讨论。
微机原理伪指令中的buf
微机原理伪指令中的buf
在微机原理中,"buf"是指"buffer",即缓冲区的意思。
在伪指令中,"buf"通常用来表示指定的内存区域,用于存储数据进行临时保存或传递。
伪指令是一种在汇编程序中使用的特殊指令,它们实际上并不是真正的机器指令,而是用来在程序编写过程中为程序员提供便利的一种指令。
在伪指令运行时,它们会被翻译成真正的机器指令或程序数据。
"buf"在伪指令中常用于表示要定义的一个数据缓冲区,用来存储临时数据。
程序员可以通过定义一个"buf"来在程序中存储一些数据,以便在后续的执行过程中对其进行操作。
"buf"可以在程序中的任何位置定义,在汇编程序中通过伪指令来指定其大小和存储地址。
举个例子,假设我们要在程序中定义一个长度为100字节的缓冲区,可以使用伪指令来定义一个名为"buf"的标号并指定其长度:
buf DB 100
在上面的例子中,"DB"是定义字节(byte)的伪指令,用于分配100个字节的存储空间给"buf"。
在程序中可以使用"buf"作为一个临时存储区,用来暂时保存
数据或进行数据传输。
需要注意的是,使用"buf"的时候要确保它的大小足够存储所需的数据,否则可能会造成数据溢出或损坏。
此外,"buf"的内容可能不会被保留在程序的执行过程中,因此在程序中使用之前或之后需要进行适当的数据处理。
第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
汇编语言程序格式、伪指令
第4章 汇编语言程序设计
主要内容:
汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计
1
微机与接口技术
4.1 汇编语言源程序
1.机器语言(Machine Language)
用二进制表示指令和数据。 优点:执行速度快,占有内存少。 缺点:不直观,不易编写、阅读和理解,面向硬件,不 能移植。
MASM
汇编程序
PRODR.OBJ 文件
Link
连接程序
PRODR.EXE 文件
汇编语言程序的建立及汇编过程
4
微机与接口技术
上机过程: 1.调用编辑程序(例如:记事本)建立源文件。 以×××.asm命名文件。 2.用汇编程序masm(或asm)对源文件汇编产生目标文件 ×××.obj。 如果汇编出错则需重新调用编辑程序修改错误,直至汇编 通过为止。
2.汇编语言(Assembly Language)
用助记符书写指令,地址和数据也可用符号表示。 优点:编写、阅读和修改较方便,不易出错,执行速度与机 器语言相近。 缺点:面向硬件,不能移植。
2
微机与接口技术 汇编:把汇编语言源程序翻译成机器语言目标程序的过程。 汇编程序:完成汇编工作的系统软件。 •小汇编(ASM):需要64K内存支持 •宏汇编(MASM):需要96K以上的内存支持,功能更强。 汇编程序的主要功能: 1)检测源程序。 2)测出源程序中的语法错误,并给出出错信息。 3)产生源程序的目标程序,并给出列表文件。 4)展开宏指令。
24
微机与接口技术
(2) 逻辑运算符 AND、OR、XOR、NOT:只用于数值表达式 注:逻辑运算符和逻辑指令的区别:前者在汇编时 进行,后者在程序执行时由CPU执行 例:AND AX, 3FC0H AND 0FF00H 汇编后源操作数被翻译为:3F00H,所以上述指令与 AND AX, 3F00H等价。
汇编编程_伪指令
10、 INCLUDE <file specification> a> 文件名必须有引号包围(?) b> 包含文件查找顺序:先找当前工作目录,后找GENPATH环境变量指定的位 置。 c> 例: INCLUDE “..\LIBRARY\macros.inc”
汇编管理指令-伪指令汇总
11、
LIST …… NOLIST a> 影响紧随其后的语句是否出现在list和 debug文件中; b> 最终是否有效,还依赖环境变量-L: Generate a listing file
MLIST [ON/OFF] 决定macro是否被展开出现在list和debug文件中
Directive
12、
13、
ORG <expression> 其中expression不能包含任何未定义、以后会定义以及外部references
汇编管理指令-伪指令汇总
14、 MEXIT XDEF entry storage: EQU $00FF save: MACRO LDX LDA STA LDA STA IFC ENDC LDA STA
Directive
;重新定义一个段 1 1 1 * ;offset是如何辅助访问struct的
DataSec: SECTION 000000 Struct: DS.B SIZE CodeSec: SECTION entry: 000003 CE xxxx LDX #Struct 000006 8600 LDA #0 000008 6A00 STA ID, X 00000A 6201 INC COUNT, X 00000C 42 INCA 00000D 6A03 STA VALUE, X
第2章-微机原理、汇编与接口技术(第3版)-朱定华-清华大学出版社
2.1.2 标号
标号→指令地址的符号表示
1、 标号的三个属性 (1)段基址—定义该标号所在段的段首址的高16位 (2)偏移地址—标号所在段的段首址到该标号定义指令的
字节距离 (3)类型—NEAR和FAR两种 NEAR—段内调用,FAR—段间调用
7
2.1.2 标号
2 、标号的定义 标号只在代码段中定义和使用,定义的方式有两种: (1)书写在符号指令前,用:定义,为NEAR类型, NEAR型标号只能在段内使用! 例: CYCLE:MOV AL,[SI] ;定义近标号CYCLE
4
2.1.1 常量
(2)符号常量 程序中为经常使用的数值取的名。 用EQU或“=”伪指令定义,如:
P EQU 314 P=314
注:汇编时,汇编程序不给符号常量分配存储单元
5
2.1.1 常量
2、数值表达式 数字表达式——由常量与运算符组成的有意义的 式子,结果为一数值。
在汇编语言源程序中,允许对常量进行以下三种类型 的运算: (1)算术运算 包括+,-,×,/,MOD(求余) (2)逻辑运算 包括AND,OR,XOR,NOT (3)关系运算 包括:EQ(=),NE(≠),LT (<),GT(>),LE(≤),GE(≥)
;基址来初始化其变量
(5)由以上表达DB 1,2,3
B6 DB ’1,2,3’
; 此行的“,”不是序列分隔符
14
例 画出数据的存储形式
W1 DW B2 ;用B2的偏移地址初始化W1变量 B1 DB AB$ ;变量B1用A、B、$的ASCII码初始化 W2 DW 1994H D DD EW ;用变量EW的段基址和偏移地址初始化D B2 DB 2 DUP(-5,-1)
微机原理、汇编与接口技术
微机原理与接口 第5章2_伪指令-宏指令
16
第5章 汇编语言程序设计 1.EQU . 格式: 格式:名字 EQU 表达式 EQU伪指令将表达式的值赋予一个名字。以后可用这个名字 伪指令将表达式的值赋予一个名字。 伪指令将表达式的值赋予一个名字 来代替上述表达式。 来代替上述表达式。 格式中的表达式可以是:一个常数、符号、 格式中的表达式可以是:一个常数、符号、数值表达式或地址表 常数 达式等。例如: 达式等。例如: CR EQU 0DH ;常数 LF EQU 0AH A EQU ASCII_TABLE ;变量 STR EQU 64*1024 ;数值表达式 ADR EQU ES:[BP+DI+5] : ;地址表达式 CBD EQU AAM ;指令助记符 EQU伪指令应用场合:可以用一个名字代表一个数值,或用 伪指令应用场合 伪指令应用场合:可以用一个名字代表一个数值, 一个较简短的名字来代替一个较长的名字。 一个较简短的名字来代替一个较长的名字。 17
10字节变量可以表达扩展精度浮点数 10字节变量可以表达扩展精度浮点数
8
第5章 汇编语言程序设计
变量的应用 • 变量具有存储单元的逻辑地址 变量具有存储单元的逻辑地址 • 程序代码中
– 通过变量名引用其指向的首个数据 – 通过变量名加减位移量存取以首个数据为基 地址的前后数据 字符串表达式 数据项可以写成字符串形式,但只能用DB、 数据项可以写成字符串形式,但只能用 、 DW、DD定义,而且DW、DD语句定义的串 、 定义,而且 、 语句定义的串 定义 只允许包含两个字符。参看下面的例子。 只允许包含两个字符。参看下面的例子。
• 定义4字伪指令DQ 用于为一个或多个8字节 定义4字伪指令DQ——用于为一个或多个 DQ 用于为一个或多个8 变量分配空间及初始化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图2:
(3)用字符串定义变量 字符串必须用单引号引起来,其中字符的个数可 以是一个,也可以是多个。注意空格也是字符 (ASCII码为20H)。 【例4】 STRING1 DB '123' STRING2 DB 'HOW ARE YOU? ' STRING3 DW 'C' , 'DE' 变量STRING1, STRING2, STRING3经汇编后的 结果如图3。
图4:
格式2的说明:
与 格 式 1 的 不 同 之 处 在 于 格 式 2 增 加 了 n DUP (duplicate)用于表示重复次数,同时表达式需用圆 括号括起。其中,重复次数n可以是常数,也可以是表 达式,它的值应该是一个正整数,数值范围为1~65 535,其作用是指定括号中操作数项的重复次数。括号 中的操作数项可以有多项,但项与项之间也必须用逗号 分隔开来。这种格式适用于定义许多相同的变量。
Hale Waihona Puke 例1解析:在例1中,用SEGMENT和ENDS分别定义了四 个段:数据段、附加段、堆栈段和代码段。 在数据段和附加段中分别定义了一些数据, 在堆栈段中定义了50个字单元的堆栈空间。 段分配伪指令ASSUME指明CS寄存器指向代 码(CODE)段,DS指向数据(DATA)段, ES指向附加(EXTRA)段,SS指向堆栈 (STACK)段,如果一行写不下,可分为两 个ASSUME语句来说明。
任何一个逻辑段从SEGMENT语句开始,以ENDS语句结束。伪指令名 SEGMENT和ENDS是本语句的关键字,不可以默认,并且必须成对出现。 语句中段名是必选项,定位类型、组合类型、字长类型、类别为可选项。 用户自己选定,不能省略,其规定同变量或标号,一个段开始与结尾用 的段名应一致。
2.段分配伪指令 ASSUME
在用ASSUME语句来完成段的分配时,要注意以下几点: ① 在一个代码段中,如果没有另外的ASSUME语句重新设置,则原有 的ASSUME语句的设置一直有效。 ② 每条ASSUME语句可设置1-6个段寄存器。
③ 可以使用NOTHING将以前的设置删除, 例如: ASSUME ES: NOTHING ; 删除对ES与某段的关联设置 ASSUME NOTHING ; 删除对全部6个段寄存器的设置 ④ 段寄存器的装入。
段分配伪指令用来完成段的分配,说明当前哪些 逻辑段被分别定义为代码段、数据段、堆栈段和 附加段。 1、代码段用来存放被执行的程序; 2、数据段用来存放程序执行中需要的数据和运 算结果; 3、当用户程序中使用的数据量很大或使用了串 操作指令时,可设置附加段来增加数据段的容量; 4、堆栈段用来设置堆栈。
格式1又可分为以下几种具体用法 :
(1)用数值表达式定义变量 【例2】 K1 DB 10, 4, 10H K2 DW 100, 100H, -5 K3 DD 3*20, 0FFFDH 变量K1, K2, K3经汇编后的结果如图1所示。
图1:
(2)用地址表达式定义变量 【例3】 RS1 DW ADDR1 DW ADDR2 RS2 DD LOOP1 DD LOOP2 汇编程序在汇编时,在相应存储区域中存入有关 变量或标号的地址值,其中偏移地址或段基址均 占一个字,低位字节占用第一个字节地址,高位 字节占用第二个字节地址。若用DD定义变量或标 号,则偏移地址占用低位字,段基址占用高位字。 变量RS1, RS2经汇编后的结果如图2所示。
格式: ASSUME 段寄存器: 段名[, 段寄存器: 段名, …]
功能:说明源程序中定义的段由哪个段寄存器去寻址。段寄 存器可以是CS, SS, DS, ES, FS或GS。 说明:格式中,ASSUME是伪指令名,是语句中 的关键 字,不可省略。段寄存器名后面必须有冒号,如果分配的 段名不止一个,则应用逗号分开。段名是指用 SEGMENT/ENDS伪指令语句定义过的段名。ASSUME 伪指令设置在代码段内(只能设置在代码段内),放在段 定义语句之后。
【例6】 T1 DB 3 DUP(0) T2 DW 2 DUP(?) T3 DB 3 DUP(1, 2 DUP(50H)) 变量T1, T2, T3经汇编后的结果如图5所示。
图5:
注:对字符串的定义可用DB伪指令,也可用DW伪指令。用DW和DB定 义的变量在存储单元中存放的格式是不同的。用DW语句定义的字符串 只允许包含一个或两个字符,如果字符多于两个时,必须用DB语句来 定义。
图3:
(4)用问号(?)定义不确定值的变量 可为变量保留空单元,常用来存放运算的 结果。 【例5】 OPER1 DB 35H, ?, 0AH OPER2 DW 0C0DH, ? OPER3 DD ? 变量OPER1, OPER2, OPER3经汇编后 的结果如图4所示。
2. 变量定义伪指令
变量定义伪指令用来定义变量的类型,并为变 量中的数据项分配存储单元。变量定义伪指令 有两种不同的格式。 格式1 格式:[变量名] DB/DW/DD/DQ/DT 表达式 格式2
格式1. [变量名] DB/DW/DD/DQ/DT 表达式功能: DB(define byte):定义一个字节类型的变量,其后的每个操作数 均占用1个字节。 DW(define word):定义一个字类型的变量,其后的每个操作数均 占用1个字(2个字节)。 DD(define doubleword):定义一个双字类型的变量,其后的每个 操作数均占用2个字(4个字节)。 DQ(define quadword):定义一个四字类型的变量,其后的每个 操作数均占用4个字(8个字节)。 DT(define ten bytes):定义一个十字节类型的变量,其后的每个 操作数均占用5个字(10个字节)。 其中,各变量定义伪指令都将高位字节数据存放在高地址中,低位字 节数据存放在低地址中。
【例1】
DATA XX YY ZZ DATA EXTRA RSS1 RSS2 RSS3 EXTRA STACK SEGMENT ; 定义数据段 DB ? DB ? DB ENDS SEGMENT ; 定义附加段 DW ? DW ? DD ? ENDS SEGMENT ; 定义堆栈段 DW 50 DUP( ) TOP EQU THIS WORD STACK ENDS CODE SEGMENT ; 定义代码段 ASSUME CS: CODE, DS: DATA ASSUME ES: EXTRA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV AX, EXTRA MOV ES, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP …… CODE ENDS END START
1、段定义伪指令 2、变量定义伪指令
1. 段定义伪指令
段定义伪指令指示汇编程序如何按段组织 程序和使用存储器。 段定义伪指令主要有: SEGMENT/ENDS ASSUME ORG
1.段定义伪指令 SEGMENT/ENDS 格式:
段名SEGMENT [定位类型][, 组合类型][, 字长类型][, 类别] …… ( 段体 ) …… 段名 ENDS