第17章汇编语言伪指令参考资料
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
因为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 变量名(标号名)
第17章 汇编语言伪指令参考资料
GROUPX GROUP SEG1,SEG2
SEG1
SEGMENT PARA ‘CODE’ ASSUME CS :GROUPX
…
SEG1 ENDS ;---------------------
SEG2
SEGMENT PARA ‘CODE’ ASSUME CS :GROUPX
TABLEA DW 20 DUP(?) ;定义20个字
第17章 汇编语言伪指令参考资料
…
MOV AX,TYPE FLDB
;AX=0001
MOV AX,TYPE TABLEA ;AX=0002
MOV CX,LENGTH TABLEA ;CX=0014(20)
MOV DX,SIZE TABLEA ;DX=0028(40)
定义
字节数
DB
1
DW
2
DD
4
DQ
8
DT
10
STRUC 由STRUC定义的字节数
第17章 汇编语言伪指令参考资料
NEAR 标号
-1 (Hex FFFF)
FAR 标号
-2 (Hex FFFE)
其一般格式为:
TYPE 变量名(标号名)
下面的例子说明TYPE、LENGTH及SIZE的使用。
FLDB DB ?
第14章讨论MACRO宏处理时有INCLUDE的实例。
第17章 汇编语言伪指令参考资料
5. LABEL伪指令 LABEL伪指令可以重新定义一个已定义名称的类 型。其一般格式为:
name LABEL type 通过LABEL我们可以使用如BYTE、WORD或 DWORD等类型,来重新定义数据字段及结构 (Structure)和记录(Record)名称的类型,亦可用LABEL 来重新定义调用指令的类型是NEAR或FAR。LABEL 还可以把一个字段同时定义为DB和DW。下面说明 BYTE及WORD这两种类型的使用。
第17章 汇编语言伪指令参考资料
(3) 若没有NAME也没有TITLE,则源程序的名称 就成为模块的名称。汇编程序会把所选用的名称交给 链接程序。
第17章 汇编语言伪指令参考资料
7. ORG伪指令 汇编程序利用地址计数器计算常数或指令码在数 据段或指令段内的相对地址(偏移地址)。假设汇编程序 正在根据下列定义处理数据段: 相对地址 名称 操作码 操作数 地址计数器
;传送FLDW的内容
当然,此时DS寄存器必须含有正确的地址。
第17章 汇编语言伪指令参考资料
2. EXTRN伪指令 EXTRN伪指令的功能是告诉汇编程序目前正在本 段或本模块中所引用到的变量或标号,其实是定义在 另一个段或模块中的。其一般格式为:
EXTRN name :type[,…] 第14章模块化程序设计中对EXTRN有详细说明。
00
FLDA DW 2542H
02
02
FLDB DB 36H
03
03
FLDC DW 212EH
05
05
FLDD DD 00000705H 09
第17章 汇编语言伪指令参考资料
开始,地址计数器定为00。因为FLDA是两个字节 长,所以地址计数器就增加为02,以指出下一个数据 项的地址。因为FLDB是一个字节长,所以地址计数器 再增加为03,依次类推。你可以用ORG伪指令直接改 变地址计数器的内容,再根据其内容以指出下一个数 据项的地址,其一般格式为:
另一个与PTR功能相似的是LABEL伪指令,将在 下节说明。
第17章 汇编语言伪指令参考资料
4. SEG运算符
SEG运算符返回指定变量或标号所在的段地址。此 运算符最常用在程序内把一些不同的汇编程序段结合 起来。其一般格式为:
SEG 变量名(标号名、段名、过程名、字段组名)
下面两条MOV指令返回变量(FLDW)和标号(A20) 所在段的段地址给DX:
第17章 汇编语言伪指令参考资料
FLDB DB 22H
DB 35H
FLDW
DW 2672H
;以7226存储
… MOV AH,BYTE PTR FLDW;AH移入低字节(72) ADD BL,BYTE PTR FLDW+1;BL加入高字节(26) MOV BYTE PTR FLDW,05 ;将05移入低字节 MOV AX,WORD PTR FLDB;将双字节移入AX CALL FAR PTR DISPLAY ;调用段外子程序
第17章 汇编语言伪指令参考资料
name可为段名、段组名GROUP。一个ASSUME句 中可以按任何顺序最多指定4个段寄存器,例如: ASSUME CS :CODESG,DS :DATASG,SS : STACK_,ES :DATASG
关键字NOTHING可以用来取消前面ASSUME所指 定的某一个段寄存器,例如:
第17章 汇编语言伪指令参考资料
6. SIZE运算符 SIZE运算符返回变量的LENGTH和TYPE的乘积, 而仅对变量含有DUP时有效。其一般格式为:
SIZE 变量 请参阅TYPE运算符的例题。
第17章 汇编语言伪指令参考资料
7. TYPE运算符 TYPE运算符返回其作用对象变量所定义类型的字 节个数。
MOV AX,8[DI][4] ;位移量+变址+常数
第17章 汇编语言伪指令参考资料
17.1.2 汇编语言指令运算符 汇编语言的运算符可分为属性运算符、返回值运
算符,以及定义记录和结构的运算符等。本节先讨论 前两类,定义记录和结构的运算符将在下节中讨论。
1. LENGTH 运算符 LENGTH运算符返回DUP伪指令操作数所定义的 数据项个数。下面的MOV指令将返回长度10给DX:
该指令执行时,微处理器把此变量的偏移地址加 上数据段的(起始)地址来确定它在内存中的位置。
2. 间接寻址 存储器间接寻址时,操作数可选用基址寄存器(BX、 BP)或变址寄存器(SI、DI),寄存器的内容就是操作数 的偏移地址,使用常数、位移量及变量可使寻址变得 更灵活。用方括号表示间接寻址,并具有加号(+)的作 用。其用法如下:
第17章 汇编语言伪指令参考资料
OFFSET 变量名(标号名)
下面这条MOV指令返回TABLEA的偏移地址。请 注意,LEA指令不使用OFFSET也会返回相同的值。
MOV
DX,OFFSET TABLEA
LEA
DX,TABLEA
上面这两条指令功能相同。
第17章 汇编语言伪指令参考资料
3. PTR运算符 PTR运算符用BYTE、WORD或DWORD来更改变 量 、 常 数 原 先 设 定 的 类 型 (DB 、 DW 或 DD) , 并 且 用 NEAR及FAR来更改标号原来隐含的距离属性。其一般 格式为: New-type PTR 变量名(标号名) New-type字段放置所要赋予的新类型,如BYTE。 下列为PTR运算符的例子:
ASSUME ES :NOTHING
第17章 汇编语言伪指令参考资料
假若没有指定DS寄存器或使用NOTHING取消了它, 那么为了要存取数据段内的数据项时,就必须明确规 定使指令操作数以DS寄存器为参考对象,即要指明操 作数相应的段寄存器,例如:
MOV AX,DS :[BX ]
;使用变址寻址
MOV AX,DS :FLDW
第17章 汇编语言伪指令参考资料
17.1 存储器访问与指令运算符
17.1.1 存储器访问(寻址) 对于存储器单元的访问,是通过存储器的单元地
址来实现的。 1. 直接寻址 在存储器直接寻址时,指令中的一个操作数会指
出一个已定义的变量名称,如下列的COUNTER: ADD CX,COUNTER
第17章 汇编语言伪指令参考资料
ORG 表达式
第17章 汇编语言伪指令参考资料
表达式可以是一个绝对值,不可以是名称,而且 必须形成一个两字节的绝对值。例如,下列数据项定 义是在上述的FLDD之后进行的。 相对地址 名称 操作码 操作数 地址计数器
第17章 汇编语言伪指令参考资料
(1) 使用基址寄存器BX时写成[BX],默认段寄存器 为DS;使用基址寄存器BP时写成[BP],默认段寄存器 为SS。例如,用BX的内容作为偏移地址(默认段寄存 器为DS),将所指单元的内容传送到DX内:
MOV DX,[BX]
;基址寄存器
(2) 使用变址寄存器DI时写成[DI],使用SI时写成 [SI],默认段寄存器均为DS。例如,用SI的内容作为偏 移地址(默认段寄存器为DS),将所指单元的内容传送 到AX内:
MOV DX,SEG FLDW ;数据段地址
MOV DX,SEG A20
;指令段地址
第17章 汇编语言伪指令参考资料
5. SHORT运算符 SHORT运算符的功能是,当JMP的目的地在-128~ +127字节之间时,用它来转变标号的属性为SHORT。 其一般格式为:
JMP SHORT 标号 汇编程序会把指令机器码的操作数由双字节减少 为单字节。这种特性在近距离向前转移时很有用,因 为汇编程序并不知道转移位置的距离。
MOV AX,[SI]
;变址寄存器
第17章 汇编语言伪指令参考资料
(3) 使用[常数]即把一个立即数或变量名放在方括 号内。例如,将AX的内容传送到DS作为段地址,BX 作为基址,SI作为变址加上常数4所形成的逻辑地址单 元内:
MOV [BX+SI+4],AX (4) 配合变址寄存器“+”或“-”位移量。对于常数 或位移只有极小的差别。例如,将以DS为数据段段地 址,结合位移量8,DI变址寄存器,加上常数4所指的 单元内容传送到AX内:
第17章 汇编语言伪指令参考资料
REDEFB LABEL
BYTE
FIELDW DW
2532H
REDEFW LABEL
WORD
FIELDB DB
2Hale Waihona Puke HDB32H...
MOV AL,REDEFB
MOV BX,REDEFW
;AL=32H ;BX=3225H
第17章 汇编语言伪指令参考资料
6. NAME伪指令 NAME伪指令提供另一种方法,为一个模块命名, 写成: NAME name汇编程序按照下列顺序选出模块的名称: (1) 有NAME伪指令时,则它的操作数name就是此 模块的名称。 (2) 若没有NAME伪指令时,但有TITLE,用其前 六个字符作为模块名。本节PAGE与TITLE伪指令中对 TITLE有详细说明。
第17章 汇编语言伪指令参考资料
3. GROUP伪指令 一个程序可以有多个相同类型的内存段,例如: ‘CODE’,‘DATA’,‘STACK’。GROUP的功能是 把它们集合在一个名称之下,构成一个段组,使它们 能够放在64K的内存段内。其一般格式为:
name GROUP seg_name[,…] seg_name是段名,name为段组名,以下的GROUP 将SEG1和SEG2组织在同一个名为GROUPX的组内: