第17章 汇编语言伪指令参考资料.ppt_第1页
第17章 汇编语言伪指令参考资料.ppt_第2页
第17章 汇编语言伪指令参考资料.ppt_第3页
第17章 汇编语言伪指令参考资料.ppt_第4页
第17章 汇编语言伪指令参考资料.ppt_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第17章 汇编语言伪指令参考资料,17.1 存储器访问与指令运算符 17.2 汇编语言伪指令,17.1 存储器访问与指令运算符,17.1.1 存储器访问(寻址) 对于存储器单元的访问,是通过存储器的单元地址来实现的。 1. 直接寻址 在存储器直接寻址时,指令中的一个操作数会指出一个已定义的变量名称,如下列的COUNTER: ADD CX,COUNTER,该指令执行时,微处理器把此变量的偏移地址加上数据段的(起始)地址来确定它在内存中的位置。 2. 间接寻址 存储器间接寻址时,操作数可选用基址寄存器(BX、BP)或变址寄存器(SI、DI),寄存器的内容就是操作数的偏移地址,使用常数、位移量及变量

2、可使寻址变得更灵活。用方括号表示间接寻址,并具有加号(+)的作用。其用法如下:,(1) 使用基址寄存器BX时写成BX,默认段寄存器为DS;使用基址寄存器BP时写成BP,默认段寄存器为SS。例如,用BX的内容作为偏移地址(默认段寄存器为DS),将所指单元的内容传送到DX内: MOV DX,BX ;基址寄存器 (2) 使用变址寄存器DI时写成DI,使用SI时写成SI,默认段寄存器均为DS。例如,用SI的内容作为偏移地址(默认段寄存器为DS),将所指单元的内容传送到AX内: MOV AX,SI ;变址寄存器,(3) 使用常数即把一个立即数或变量名放在方括号内。例如,将AX的内容传送到DS作为段地址,

3、BX作为基址,SI作为变址加上常数4所形成的逻辑地址单元内: MOV BX+SI+4,AX (4) 配合变址寄存器“+”或“-”位移量。对于常数或位移只有极小的差别。例如,将以DS为数据段段地址,结合位移量8,DI变址寄存器,加上常数4所指的单元内容传送到AX内: MOV AX,8DI4;位移量+变址+常数,17.1.2 汇编语言指令运算符 汇编语言的运算符可分为属性运算符、返回值运算符,以及定义记录和结构的运算符等。本节先讨论前两类,定义记录和结构的运算符将在下节中讨论。 1. LENGTH 运算符 LENGTH运算符返回DUP伪指令操作数所定义的数据项个数。下面的MOV指令将返回长度10给

4、DX: TABLEA DW 10 DUP(?) . MOV DX, LENGTH TABLEA,若操作数中不含DUP项,则运算符返回值01。LENGTH的其他用法,另参考本节中的SIZE及TYPE。 2. OFFSET 运算符 OFFSET运算符返回变量或标号的偏移地址(亦即数据段或指令段内的偏移地址)。其一般格式为: OFFSET 变量名(标号名),OFFSET 变量名(标号名) 下面这条MOV指令返回TABLEA的偏移地址。请注意,LEA指令不使用OFFSET也会返回相同的值。 MOV DX,OFFSET TABLEA LEA DX,TABLEA 上面这两条指令功能相同。,3. PTR运算

5、符 PTR运算符用BYTE、WORD或DWORD来更改变量、常数原先设定的类型(DB、DW或DD),并且用NEAR及FAR来更改标号原来隐含的距离属性。其一般格式为: New-type PTR 变量名(标号名) New-type字段放置所要赋予的新类型,如BYTE。下列为PTR运算符的例子:,FLDB DB22H DB35H FLDWDW 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 F

6、LDB;将双字节移入AX CALLFAR PTR DISPLAY ;调用段外子程序 另一个与PTR功能相似的是LABEL伪指令,将在下节说明。,4. SEG运算符 SEG运算符返回指定变量或标号所在的段地址。此运算符最常用在程序内把一些不同的汇编程序段结合起来。其一般格式为: SEG 变量名(标号名、段名、过程名、字段组名) 下面两条MOV指令返回变量(FLDW)和标号(A20)所在段的段地址给DX: MOV DX,SEG FLDW ;数据段地址 MOV DX,SEG A20 ;指令段地址,5. SHORT运算符 SHORT运算符的功能是,当JMP的目的地在-128+127字节之间时,用它来转

7、变标号的属性为SHORT。其一般格式为: JMP SHORT 标号 汇编程序会把指令机器码的操作数由双字节减少为单字节。这种特性在近距离向前转移时很有用,因为汇编程序并不知道转移位置的距离。,6. SIZE运算符 SIZE运算符返回变量的LENGTH和TYPE的乘积,而仅对变量含有DUP时有效。其一般格式为: SIZE 变量 请参阅TYPE运算符的例题。,7. TYPE运算符 TYPE运算符返回其作用对象变量所定义类型的字节个数。 定义 字节数 DB 1 DW 2 DD 4 DQ 8 DT 10 STRUC由STRUC定义的字节数,NEAR 标号1 (Hex FFFF) FAR 标号 2 (H

8、ex FFFE) 其一般格式为: TYPE 变量名(标号名) 下面的例子说明TYPE、LENGTH及SIZE的使用。 FLDBDB? TABLEADW20 DUP(?) ;定义20个字, 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) 因为TABLEA定义为DW,故TYPE返回0002,LENGTH根据DUP的定义返回Hex 0014(20),而SIZE返回TYPE与LENGTH的乘积,即Hex 28(40)

9、。,17.2 汇编语言伪指令,1. ASSUME伪指令 ASSUME的功能是使汇编程序能将内存段与CS、DS、ES、SS等段寄存器联系起来。其一般格式为: ASSUME 段寄存器名 :name, .,name可为段名、段组名GROUP。一个ASSUME句中可以按任何顺序最多指定4个段寄存器,例如: ASSUME CS :CODESG,DS :DATASG,SS : STACK_,ES :DATASG 关键字NOTHING可以用来取消前面ASSUME所指定的某一个段寄存器,例如: ASSUME ES :NOTHING,假若没有指定DS寄存器或使用NOTHING取消了它,那么为了要存取数据段内的数

10、据项时,就必须明确规定使指令操作数以DS寄存器为参考对象,即要指明操作数相应的段寄存器,例如: MOV AX,DS :BX ;使用变址寻址 MOV AX,DS :FLDW ;传送FLDW的内容 当然,此时DS寄存器必须含有正确的地址。,2. EXTRN伪指令 EXTRN伪指令的功能是告诉汇编程序目前正在本段或本模块中所引用到的变量或标号,其实是定义在另一个段或模块中的。其一般格式为: EXTRN name :type, 第14章模块化程序设计中对EXTRN有详细说明。,3. GROUP伪指令 一个程序可以有多个相同类型的内存段,例如:CODE,DATA,STACK。GROUP的功能是把它们集合

11、在一个名称之下,构成一个段组,使它们能够放在64K的内存段内。其一般格式为: name GROUP seg_name, seg_name是段名,name为段组名,以下的GROUP将SEG1和SEG2组织在同一个名为GROUPX的组内:,GROUPX GROUP SEG1,SEG2 SEG1 SEGMENT PARA CODE ASSUME CS :GROUPX SEG1 ENDS ;- SEG2 SEGMENT PARA CODE ASSUME CS :GROUPX SEG2 ENDS,4. INCLUDE伪指令 你可能会在不同的程序中用到一些内容相同的一组指令即宏指令。它们可以文件的形式保存

12、,使任何程序都能使用它。假设有一个将ASCII数转换为二进制的程序存于C盘,名称是CONVERT.LIB。要获得此文件,可在源程序中加入INCLUDE句。例如: INCLUDE C :CONVERT.LIB,放置在原来应该编写这段ASCII数转换程序处。汇编程序会从磁盘找到此文件,并把它的指令语句载入(展开)使用者的程序。若汇编程序找不到此文件,会发出错误信息而不进行INCLUDE操作。 汇编程序会在LST文本,把载入的指令语句每一行的第30个字,印上一个1(第33个字开始是源程序)。 第14章讨论MACRO宏处理时有INCLUDE的实例。,5. LABEL伪指令 LABEL伪指令可以重新定义

13、一个已定义名称的类型。其一般格式为: name LABEL type 通过LABEL我们可以使用如BYTE、WORD或DWORD等类型,来重新定义数据字段及结构(Structure)和记录(Record)名称的类型,亦可用LABEL来重新定义调用指令的类型是NEAR或FAR。LABEL还可以把一个字段同时定义为DB和DW。下面说明BYTE及WORD这两种类型的使用。,REDEFBLABELBYTE FIELDWDW2532H REDEFWLABELWORD FIELDBDB25H DB32H . MOV AL,REDEFB;AL32H MOV BX,REDEFW ;BX3225H,6. NAM

14、E伪指令 NAME伪指令提供另一种方法,为一个模块命名,写成: NAME name汇编程序按照下列顺序选出模块的名称: (1) 有NAME伪指令时,则它的操作数name就是此模块的名称。 (2) 若没有NAME伪指令时,但有TITLE,用其前六个字符作为模块名。本节PAGE与TITLE伪指令中对TITLE有详细说明。,(3) 若没有NAME也没有TITLE,则源程序的名称就成为模块的名称。汇编程序会把所选用的名称交给链接程序。,7. ORG伪指令 汇编程序利用地址计数器计算常数或指令码在数据段或指令段内的相对地址(偏移地址)。假设汇编程序正在根据下列定义处理数据段: 相对地址 名称 操作码 操

15、作数 地址计数器 00 FLDA DW 2542H 02 02 FLDB DB 36H 03 03 FLDC DW 212EH 05 05 FLDD DD 00000705H 09,开始,地址计数器定为00。因为FLDA是两个字节长,所以地址计数器就增加为02,以指出下一个数据项的地址。因为FLDB是一个字节长,所以地址计数器再增加为03,依次类推。你可以用ORG伪指令直接改变地址计数器的内容,再根据其内容以指出下一个数据项的地址,其一般格式为: ORG 表达式,表达式可以是一个绝对值,不可以是名称,而且必须形成一个两字节的绝对值。例如,下列数据项定义是在上述的FLDD之后进行的。 相对地址

16、名称 操作码 操作数 地址计数器 ORG 0 00 00 FLDX DB ? 01 01 FLDY DW ? 02 03 FLDZ DB ? 04 ORG $+5 09,第一个ORG把地址计数器设置成00,其后的变量FLDX,FLDY和FLDZ就定义在和FLDA、FLDB及FLDC相同的内存单元地址: 相对地址: 0 1 2 3 4 5 6 7 8 FLDA FLDB FLDC FLDD FLDX FLDY FLDZ,当操作数包含有$符号时,如上例的第二个ORG,它用来表示地址计数器的当前值,因此操作数$+5是把地址计数器设成04+5(即09)。 使用FLDC会存取到相对地址为03处的一个字,

17、而使用FLDZ则存取到相对地址为03处的一个字节: MOV AX,FLDC ;一个字 MOV AL,FLDZ ;一个字节,你可以用ORG的这个特性以重新定义内存单元的地址。但是,一定要确定ORG使地址计数器设定正确的值,才能算出所有重新定义内存单元的地址。而且,重新定义的值会覆盖原来的常数。结构的定义STRUC内不能用ORG伪指令。,8. PAGE与TITLE 伪指令 PAGE与TITLE 伪指令是控制汇编输出显示格式的伪指令。PAGE与TITLE是每一个程序皆能使用的伪指令。 1) PAGE 伪指令 PAGE处于程序的开头,你可以指定每一页所要列印的行数和每一行所要列印的最多字数。下面是设定

18、每页60行和每行132个字符: PAGE 60,132,每页的行数范围是10255,而每行的字符数范围则为60132。若程序中没有PAGE说明时,汇编程序就假设为PAGE 66,80。 假设行数设定为60,当汇编的程序已经列印了60行时,会自动跳到下一页并将页的计数值加1。你若想在某一特定的行(例如段尾)强迫跳页,此时只要在需要跳页的行写上PAGE即可,后面不加参数。当遇到PAGE时,汇编程序列印时会自动跳页。,2) TITLE 伪指令 TITLE伪指令可以使得每页的顶端印出标题,如下所示: TITLE text text可以是列于磁盘目录的程序文件名。例如,假设程序的文件名为ASMSORT,

19、下面写出了其名称并附上注释,长度最多为60个字符: TITLE ASMSORT-Assembler program to sort customer names,9. PROC 伪指令 以PROC伪指令开头而由ENDP结束的一段指令称为过程(Procedure)。最典型的用途是定义指令段内的一个子程序。进入子程序(即过程)的方法是以CALL进入,并用RET返回。 若一个子程序(子过程)与调用它的主程序(主过程)在同一内存段内,则子程序的类型为NEAR,用法如下: proc_name PROC NEAR,proc_name是过程名(主过程名或子过程名),若省略操作数NEAR,汇编程序会默认为NE

20、AR。若一个子程序(子过程)位于调用程序(主过程)所在段的段外,在使用CALL调用时,被调用的子程序必须声明为PUBLIC。此外,被调用的程序放在不同的ASSUME CS之下,就该定为FAR的类型属性。例如: PUBLIC proc_name Proc_name PROC FAR 当以CALL调用一个子程序(子过程)时,在被调用程序的末尾必须使用RET返回,即在ENDP之前使用RET返回指令。第14章模块化程序设计中有使用例题。,10. PUBLIC 伪指令 PUBLIC伪指令的功能是通知汇编程序,目前汇编中的一些符号会被其他的模块所引用。其一般格式为: PUBLIC symbol ,. 第1

21、4章模块化程序设计中有关于PUBLIC的详细说明。,11. RECORD 伪指令 RECORD是定义记录伪指令,可以定义到位。所以,记录伪指令对数据的定义被限定在一个字或一个字节的范围内。这种数据模式应用在对工业过程的控制中。例如,若某一采集数据的量不足16位或不足8位,数据以半字节并行通讯。外部设备调度只关心某一个字节中的某几个状态位经常用到。其一般格式为: Record_name RECORD 记录说明,.,记录说明,每一个“记录说明”的格式如下: Record_field_name:Length=Preassigment Record_field_name为记录字段名,Length为该字

22、段名所占的长度,Preassigment为预赋值,可以任选。 每一个字段名之后接一个冒号(:),长度以位的个数表示。长度的范围是116位。任意小于8位的长度视为8位,916位视为16位,必要时可向右靠齐,,例如定义一个记录: BITREC RECORD BIT1:3,BIT2:7,BIT3:6 就把一个字分成了三个字段,各字段的名字分别为BIT1、BIT2和BIT3。BIT1定义BITREC的前三个位,BIT2定义其次的7个位,而BIT3定义最后的6个位,总共为16位,亦即一个字。若需要使用RECORD定义初值,,例如: BITREC RECORD BIT1:3=101B,BIT2:7=011

23、0110B, BIT3:6=011010B 记录必须通过调用语句映像才能使用,即分配内存单元。例如: DEFBITS BITREC ,不仅分配内存单元给这个记录,而且还把它与一个变量名DEFBITS联系在一起。这样分配内存会在数据段内产生Hex AD9A的机器码(存为9AAD)。尖括号内也可以重新定义BITREC的数据项。 图17-1的程序说明把BITREC定义成一个RECORD,但是这个记录的各字段不赋予初值。在这种情况下,数据段内用一个分配的声明可把各字段的初值定义在一对尖括号内。定义记录的运算符有WIDTH、Shift Count和MASK。用这些运算符可以改变记录的定义而不必修改其他用

24、到此记录的指令。,1) WIDTH运算符 此运算符返回一个记录或记录内一个字段的长度,以位的个数表示。图17-1中A10之处是两个WIDTH的例子。第一条MOV指令返回BITREC整个记录的长度(16位);第二条MOV指令返回记录中BIT2字段的长度(7位)。在这两个例子中,汇编程序都产生立即操作数来表示长度。,- TITLE TRECORD(COM) Test of Record Pesudo-op 0000 CODESG SEGMENT PARA code ASSUME CS:CODESG,DS:CODESG,SS:CODESG 0100 ORG 100H 0100EB02BEGIN:JM

25、P SHORT MAIN ; -,BITRECRECORDBIT1:3,BIT2:7,BIT3:6;Define record 01029AADDEFBITS BITREC;Initzerecord ; - 0104MAINPROCNEAR 0104A10:;Width: 0104B710MOV BH,WIDTH BITREC; of record(16) 0106B007MOV AL,WIDTH BIT2 ; of field(07),0108 B10:;Shift Count: 0108B10DMOV CL,BIT1 ; Hex 0D 010AB106MOV CL,BIT2; 06 010

26、CB100MOV CL,BIT3; 00 010EC10:;Mask: 010EB8E000MOV AX,MASK BIT1 ; Hex E000 0111BB1FC0MOV BX,MASK BIT2 ; 1FC0 0114B9003FMOV CX,MASK BIT3 ; 003F,0117D10:;Isolate BIT 2: 0117A1 0102 RMOV AX,DEFBITS ; get record 011A251FC0AND AX,MASK BIT2 ; clear BIT 1 - PARLISTSTRUC;parameter list,0000 19MAXLENDB 25 0001 ?ACTLENDB ? 0002 19 20 NAMEINDB 25 DUP( ) 001B

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论