第四章 汇编语言语法和DOS调用_第1页
第四章 汇编语言语法和DOS调用_第2页
第四章 汇编语言语法和DOS调用_第3页
第四章 汇编语言语法和DOS调用_第4页
第四章 汇编语言语法和DOS调用_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

本章要点汇编语言格式伪指令宏指令系统功能调用第四章汇编语言语法和DOS功能调用4.3伪指令4.4宏指令4.5DOS系统功能调用4.2汇编语言基本语法4.1汇编语言程序基本格式04.1汇编语言程序的格式

一、汇编语言概述

机器语言是计算机能直接识别和执行的语言,用一串“0”、“1”数字代码表示。

汇编语言是一种符号语言,它用某种容易记忆的英文缩写去表示机器指令操作码(指令助记符),用人们熟悉的数码及数学符号等表示操作数、地址。二、汇编语言源程序和汇编程序用汇编语言编写的程序称为汇编语言源程序,或简称为源程序。对程序员来讲,符号语言简单直观、便于记忆,比二进制数表示的机器语言方便了许多。但计算机只“认识”机器语言而不认识这些文字、数字、符号,为此人们创造了一种程序,叫汇编程序。如同英汉之间对话需要“翻译”一样,汇编程序的作用相当于一个“翻译员”,自动地把汇编语言源程序翻译成机器语言。该过程称为汇编,完成汇编任务的程序称为汇编程序,相应形成的机器语言程序称为目标程序。汇编后形成的目标程序虽然是二进制代码,但还不能直接上机运行,必须经过连接程序(LINK)连接,将库文件或其它目标文件连接到一起形成可执行文件后,才能送入计算机执行。汇编语言程序从建立到汇编、连接形成可执行程序的整个过程如图所示。

MyProg.ASM汇编程序编辑程序MyProg.OBJ连接程序MyProg.EXE1例4.1试求小于100的所有非零偶数,并把结果存入以BUFF开始的内存区1MY_DATASEGMENT;定义数据段 2BUFFDB50DUP(?);设置缓冲区3MY_DATAENDS ;定义数据段结束 4MY_CODESEGMENT;定义代码段 5ASSUMECS:MY_CODE,DS:MY_DATA;规定CS和DS的内容6START:MOVAX,MY_DATA;DS初始化为MY_DATA 7MOVDS,AX MOVAL,2;置循环初始值9LEABX,BUFF210LLP:

MOV[BX],AL ;循环体11INCAL 12INCAL 13CMPAL,100 ;循环控制14JNZLLP 15INT20H;返回DOS 16MY_CODEENDS ;代码段结束17END START

;整个程序结束

3三、汇编语言的特点1.执行速度快2.程序短小3.可以直接控制硬件4.可以方便地编译5.辅助计算机工作者掌握计算机体系结构(1)段的结构

NAME1 SEGMENT ;段的起始 语句1 ; 语句2 ;n条语句序列构成的语句体 ┇ ┇ 语句n ;

NAME1 ENDS ;段的结束

NAME2 SEGMENT ;段的起始 语句1 ; 语句2 ;m条语句序列构成的语句体 ┇ ┇ 语句m ;

NAME2 ENDS ;段的结束

END ;源程序结束4(2)语句的结构3种基本语句类型:指令语句伪指令语句宏指令语句语句一般有4个部分组成,即:标号或名字操作码操作数;注释标号或名字:这是一个任选部分,在语句之首54.2汇编语言中的基本数据

4.2.1常量、变量与标号

1.常量

⑴数值常量汇编语言中的数值常量可以是二进制、八进制、十进制或十六进制数,书写时用加后缀的方式标明即可,对于十进制数可以省掉后缀。对于十六进制数,当以A~F开头时,前面加数字0,以避免和名字混淆。⑵字符串常量包含在单引号中的若干个字符形成字符串常量,字符串在计算机中存储的是相应字符的ASCII码。如‘A’的值是41H,‘AB’的值是4142H等。⑶符号常量常量用符号名来代替就是符号常量。用COUNTEQU3或COUNT=3定义后COUNT就是一个符号常量,与数值常量3等价。

2.变量

变量在数据段、附加数据段或堆栈段中定义,后面不跟冒号。它也可以用LABEL或EQU伪操作来定义。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。段属性:定义变量的段起始地址,此值必须在一个段寄存器中。

偏移属性:变量的偏移地址是从段的起始地址到定义变量的位置之间的字节数。

类型属性:变量的类型属性定义该变量所保留的字节数。如BYTE(DB,1个字节长)、WORD(DW,2个字节长)、DWORD(DD,4个字节长)、FWORD(DF,6个字节长)、QWORD(DQ,8个字节长)、TBYTE(DT,10个字节长),这一点在数据定义伪操作中已作了说明。在同一个程序中,同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。63.标号

标号在代码段中定义,后面跟着冒号:,它也可以用LABEL或EQU伪操作来定义。此外,它还可以作为过程名定义。标号经常在转移指令或CALL指令的操作数字段出现,用以表示转向地址。标号有3种属性:段、偏移及类型。

段属性:定义标号的段起始地址,此值必须在一个段寄存器中,而标号的段则总是在CS寄存器中。

偏移属性:标号的偏移地址是从段起始地址到定义标号的位置之间的字节数。对于16位段是16位无符号数;对于32位段则是32位无符号数。

类型属性:用来指出该标号是在本段内引用还是在其他段中引用的。如是在段内引用的,则称为NEAR。对于16位段,指针长度为2字节;对于32位段,指针长度为4字节。如在段外引用,则称为FAR。对于16位段,指针长度为4字节(段地址2字节,偏移地址2字节);74.2.2运算符与表达式1.算术运算符

算术运算符有:+(加)、-(减)、*(乘)、/(除)、MOD(取余除)。

MOVAL,4*8+5

;数值表达式

MOVSI,OFFSET BUF+12

;地址表达式2.逻辑运算符

逻辑运算符有:AND(与)、OR(或)、XOR(异或)、NOT(非)。逻辑运算符只能用于数值表达式中,不能用于地址表达式中。逻辑运算符和逻辑运算指令是有区别的。逻辑运算符的功能在汇编阶段完成,逻辑运算指令的功能在程序执行阶段完成。在汇编阶段,指令ANDAL,78HAND0FH等价于指令ANDAL,08H。3.关系运算符

关系运算符有:EQ(相等)、LT(小于)、LE(小于等于)、GT(大于)、GE(大于等于)NE(不等于)。关系运算符要有两个运算对象。两个运算对象要么都是数值、要么都是同一个段内的地址。运算结果为真时,表示为0FFFFH,运算结果为假时,表示为0000H。指令MOVBX,32EQ45等价于MOVBX,0

指令MOVBX,56GT30等价于MOVBX,0FFFFH

84.取值运算符

变量和标号具有段属性、偏移属性和类型属性等,要从变量和标号中析出它们的段地址、偏移地址,变量的类型、元素的个数和占用内存的大小等,就要使用取值运算符(又称分析运算符)。这些运算符是SEG、OFFSET、TYPE、LENGTH、SIZE。例如:SCOREDW30DUP(0)定义了一个变量,TYPESCORE为2,LENGTHSCORE是30,而SIZESCORE是60。95.合成运算符也称为修改属性运算符,它能修改变量或标号的原有的类型属性并赋予新的类型。这类运算符是PTR和THIS。

①PTR的格式:

类型PTR表达式其中类型可以是BYTE、WORD、DWORD、NEAR、FAR,表达式是被修改的变量或标号。例如NUM语句

NUMDB1,3,5,7

定义为字节类型,若要将NUM开始两个字节的数据装入AX,指令应为

MOVAX,WORDPTRNUM②THIS的格式:

新符号名EQUTHIS类型原符号名类型参数,…THIS的功能与PTR相同,只是格式不同。THIS语句中建立一个新的符号名并指定它有THIS后的类型,而新符号名指向下一语句的原符号名的内存地址。例如前面用PTR修改NUM类型可用下面的THIS语句代替。

DNUMEQUTHISWORDNUMDB1,3,5,7

其中DNUM是字型并指向NUM所指的内存单元,DNUM的存取以字为单位,而NUM仍是字节类型。101.数据定义伪指令格式:

[变量]助记符操作数,…,操作数[;注释]助记符字段说明所用伪指令的助记符,也即伪指令,说明所定义的数据类型。常用的有以下几种:

DB

伪指令用来定义字节,其后的每个操作数都占有一个字节(8位)。

DW

伪指令用来定义字,其后的每个操作数占有一个字(16位,其低位字节在第一个字节地址中,高位字节在第二个字节地址中)。

DD

伪指令用来定义双字,其后的每个操作数占有两个字(32位)。

DF

伪指令用来定义6个字节的字,其后的每个操作数占有48位,可用来存放远地址。这一伪指令只能用于386及其后继机型中。

DQ

伪指令用来定义4字,其后的每个操作数占有4个字(64位),可用来存放双精度浮点数。

DT

伪指令用来定义10个字节,其后的每个操作数占有10个字节,形成压缩的BCD码。4.3伪指令语句11例4.2操作数是常数、表达式、字符串数据的定义

DATA1DB10H,52H DATA2DW1122H,34HDATA3DD5*20H,0FFEEHDATA4DB‘HELLO’例4.3操作数用“?”定义不确定值的变量,用DUP来定义重复变量,不确定值的变量一般用作保留存储空间,以便存放运算结果。

DATA1DB?

DATA2DW0D55H,?

DATA3 DB5DUP(0)

DATA4DW10DUP(?)

DATA5DB4DUP(1,2DUP(20)

1210H52H22H11H34H00HA0H00H00H00HEEHFFH00H00H48H45H4CH4CH4FHDATA1DATA2DATA3DATA4图4.1例4.2的汇编结果图4.2例4.3的汇编结果?55H0DH00H00H00H00H00H??┇┇??01H14H14HDATA1DATA2DATA3DATA4DATA5重复4次,共12个字节共20个字节??图4.3例4.4的汇编结果00H01H00H02H00H03H00H30HDATA1DATA2DATA3ONE的偏移地址TWO的偏移地址THREE的偏移地址THREE的段地址13例4.4当前已有变量ONE,标号TWO和THREE,用这些地址表达式定义新变量

DATA1DWONE DATA2DWTWO DATA3DDTHREE

142.标识符赋值与解除伪指令

⑴等值伪指令EQU

格式:<符号名>EQU<表达式>

例如:

CONSTANT EQU 256 ;将数256赋以符号名

B EQU [BP+8] ;变址引用赋以符号名B⑵等号伪指令

=

(与EQU类似,但=允许重复定义)

例如:EMP=6或EMPEQU6

⑶定义符号名伪指令LABEL:LABEL伪指令可以定义变量或标号的类型。格式:<符号名>LABEL<类型>;⑷解除定义伪指令PURGE:解除指定符号的定义。格式:PURGE<符号1,符号2,…,符号N>

解除符号定义后,可用EQU重新定义。

例如:

Y1 EQU 7 ;定义Y1的值为7PURGE Y1 ;解除Y1的定义

Y1 EQU 36 ;重新定义Y1的值为36153.段定义伪指令⑴SEGMENT和ENDS

段定义伪指令。该指令能对程序分段。其格式为:

段名SEGMENT[定位类型][组合类型][‘类别’]┇

段名ENDS⑵ASSUME

段寄存器指派伪指令。格式为:

ASSUME段寄存器:段名[,段寄存器:段名……]

例如:ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK⑶ORG

移动地址指针的伪指令。其格式为:

ORG常量表达式

例如:ORG2000H4.过程定义伪指令PROC和ENDP

过程名PROC[NEAR/FAR]┇RET

过程名ENDP

功能:定义一个由主程序可以用CALL指令调用的过程。165、

程序开始与结束伪指令语句共有4条伪指令语句:NAME、TITLE、ORG和END。1)目标模块命名伪指令语句格式:NAME程序名

TITLE文本名功能:为源程序目标模块赋一个程序名172)定位伪指令语句格式:ORG表达式例4.8用ORG指定数据段和代码段地址。

DATASEGMENTX1DW20H,60H,

ORG100HX2DB10H,20H,30HORG200HX3DW1234H,4321HDATAENDS

CODESEGMENTORG100HASSUMECS:CODE,DS:DATASTART:MOVAX,DATA┋CODEENDS183)程序结束伪指令语句格式:END标号名例4.9程序结束伪指令语句的应用

CODESEGMENTSTART:MOVAX,BXMOVCX,12H┋CODEENDSENDSTART196、

方式定义伪指令语句格式:.8086.3867、结构定义伪指令语句有三条语句:结构定义伪指令,结构存储分配和预置伪指令及 结构使用伪指令。

1)结构定义伪指令语句格式:结构名STRUC

数据变量序列结构名ENDS20例4.10定义一个数据表格TAB的结构

TABSTRUCDA1DB‘ABCD’DA2DW?

DA3DWSEGLISDA4DW2DUP(0)

DA5DW1234H,4321HTABENDS212)结构存储分配和预置伪指令语句格式:结构变量名结构名<元素值,元素值…>结构变量名结构名NDUP(<元素值,元素值…>)例4.11对例4.10中的TAB结构进行存储空间分配和预置,形成4个结构变量。DATA1TAB<>DATA2TAB<’1234’>DATA3TAB<,34H,SEGPLT>DATA4TAB5DUP(<‘WXYZ’,22H>)

223)结构使用伪指令语句格式:结构变量名·字段变量设当前数据段基址为1000H,结构变量DATA1的偏移地址为100H,则例4.11中的4个结构变量在存储器中的地址分配如图4-4所示。23(a)DATA1TAB<>(c)DATA3TAB<,34H,SEGPLT>(b)DATA2TAB<’1234’>(d)DATA4TAB5DUP(<‘WXYZ’,22H>)‘A’‘B’‘C’‘D’??SEGLIS低SEGLIS高00H00H00H00H34H12H21H43H10100H(a)‘1’‘2’‘3’‘4’??SEGLIS低SEGLIS高00H00H00H00H34H12H21H43H10110H(b)‘A’‘B’‘C’‘D’34H00HSEGPLT低SEGPLT高00H00H00H00H34H12H21H43H10120H(c)‘W’‘X’‘Y’‘Z’22H00HSEGLIS低SEGLIS高00H00H00H00H34H12H21H43H10130H(d)重复5次图4.4例4.10中的4个结构变量的存储分配和预置248、分组伪指令语句格式:组名GROUP段1,段2,……例4.12┋GROUP1GROUPSEG1,SEG2,SEG3ASSUMEDS:GROUP1MOVAX,GROUP1MOVDS,AXMOVBX,GRPUP1:VAR1┋259、其它伪指令语句(l)外部伪指令语句格式:

PUBLIC名称1,名称2,…

EXTRN名称1:类型,名称2:类型,…例4.13用EXTRN和PUBLIC语句实现模块间标识符的交叉访问模块1EXTRNDATA2:BYTE,SUBTR1:NEARPUBLICTABLE,DATA1DSEGSEGMENTTABLEDB100DUP(?)

DATA1DW?

CODESEGMENT

26DSEGENDSCODESEGMENT

ASSUMECS:CODE,DS:DSEG┇MOVAX,DSEGMOVDS,AX

MOVAL,DATA1CALLSUBTR1

MOVAX,SEGDATA2MOVES,AX

MOVBX,ES:DATA2┇CODEENDSEND27模块2EXTRNTABLE:BYTEPUBLICSUBTR1,DATA2DSEGSEGMENTDATA2DB?┇

DSEGENDSCODESEGMENT┇SUBTR1:┇┇

CODEENDSEND28(2)对准伪指令语句格式:EVEN

例4.14EVEN直接放在某一语句前,汇编程序汇编时就会完成将地址调整在偶地址上。DATASEGMENTORG100HA1

DB0DHEVENA2DW100DUP(?)DATAENDS

29(3)条件汇编伪指令语句一般格式是:

IF;如果条件成立

[ELSE];[否则]

ENDIF;结束条件汇编语句IF有多种形式,它们是:IF操作数IFE操作数IFDEF标号或变量IFNDEF标号或变量IFB<变量>IFNB<变量>IFIDN<操作数l>,<操作数2>IFDIF<操作数1>,<操作数2>IF1IF2304.4汇编语言中的表达式表达式------运算对象和运算符组成。汇编语言中有6类运算符,即:①算术运算符;②逻辑运算符;③关系运算符;④分析运算符;⑤修改属性运算符;⑥

其它运算符。311、算术运算符算术运算符有:加(+)、减(-)、乘(*)、除(/)、取模运算(MOD)、左移(SHL)和右移(SHR)。取模运算是取两数相除的余数,对象必须为正整数。例如

92MOD16结果为12(相当于取低4位的值)

97HMOD20H结果为23(相当于取低5位的值)

32例4.15包含乘法和减法算术运算符的表达式

DATASEGMENTARRAY

DB1,2,3,4,5,6TRY

DB 20DATAENDSCODESEGMENTMOV BX,30*5MOV CX,(TRY-ARRAY) ┇CODEENDS33例4.16源程序包含除法、减法、模运算和移位运算的表达式DATASEGMENTKA EQU 800DATAENDSCODESEGMENT MOV BX,KA-80 MOV AX,KAMOD100 MOV CX,KA/100 MOV DH,01100100BSHR2┇CODEENDS342、逻辑运算符逻辑运算符有:与(AND)、或(OR)、非(NOT)和异或 (XOR)

例4.17AND、OR、NOT、XOR逻辑运算的表达式DATASEGMENTPORTEQU 81HDATAENDSCODESEGMENTMOVAL,NOT0FFHMOVBL,8CHAND73H

MOVAH,8CHOR73HMOVCH,8CHXOR73H

35

INAL,PORTANDDX,PORTAND0FEHOUTDX,AX┇CODEENDS363、关系运算符关系运算符有:相等EQ、不等NE、小于LT、大于GT、小于 或等于LE、大于或等于。

4、分析运算符分析运算符有:OFFSET、SEG、TYPE、LENGTH、SIZE(1)OFFSET

格式:OFFSET变量或标号

37例4.18用OFFSET返回标号或变量偏移地址值的表达式DATASEGMENT┇DAT1DB 81HDATAENDSCODESEGMENTMOVSI,OFFSETLAB1┇

LAB1:MOVBX,OFFSETDAT1┇CODEENDS38(2)SEG

格式:SEG变量或标号(3)TYPE

格式:TYPE变量或标号表4-1TYPE运算符返回值变量标号类型DBDWDDDQDTNEARFAR返回值124810-1-239例4.19TYPE加在变量和标号前的表达式DATASEGMENTAA1DB20H,30HAA2DW0438HAA3DD?DATAENDSCODESEGMENTLL1:MOVAH,TYPEAA1MOVBH,TYPEAA2ADDAL,TYPEAA3MOVBL,TYPELL1CODEENDS40(4)LENGTH格式:LENGTH变量例4.20LENGTH加变量的表达式DATASEGMENTBB1DW100DUP(?)BB2DW1,2,3BB3DB‘ABCD’DATAENDSCODESEGMENTMOVCX,LENGTHBB1MOVBL,LENGTHBB2MOVAL,LENGTHBB3CODEENDS41(5)SIZE格式:SIZE变量把例4.20中含有LENGTH表达式改为SIZE表达式,即:

MOVCX,SIZEBB1MOVBL,SIZEBB2MOVAL,SIZEBB3425、修改属性运算符(综合运算符)修改属性运算符有:段操作符、PTR、THIS、HIGH、LOW、

SHORT

(1)段操作符格式:段前缀:变量或地址表达式(2)PTR

格式:类型PTR变量距离PTR标号43例4.21带PTR表达式的变量DATASEGMENTCC1DB16H,36HCC2DW1122H,3344HDATAENDSCODESEGMENTLL1:

MOVAX,WORDPTRCC1MOVBL,BYTEPTRCC2MOVBYTEPTR[BX],10HMOVWORDPTR[BX],10H┇JMPFARPTRLL1┇CODEENDS44(3)THIS格式:变量EQUTHIS类型标号EQUTHIS距离例如:

DATA1EQUTHISBYTETABLEDW200DUP(?)又如:

LL1EQUTHISFARMOVAX,100

45(4)SHORT

格式:SHORT标号(5)HIGH和LOW它们称为字节分离运算符格式:HIGH变量或标号

LOW变量或标号46

例4.22带HIGH和LOW表达式的变量DATASEGMENTBB1EQU1234HBB2EQU0A0B0HDATAENDSCODESEGMENTMOVAH,HIGHBB1MOVBL,LOWBB2CODEENDS476、其它运算符7、注意点:(1)注意表达式中各运算符和操作符的优先级(2)注意数制统一

484.5指令语句指令语句的格式:标号:前缀指令助记符操作数;(注释)(1)立即寻址和直接寻址的表示形式例4.23立即寻址和直接寻址在表示形式上的区别DATASEGMENTBB1EQU1234HBB2DW0A0B0HDATAENDSCODESEGMENTMOVAX,BB1MOVBX,BB2MOVCX,[BB1]CODEENDS

49(2)基址寄存器加变址寄存器寻址的表示形式有两种表示形式:

MOVAX,[BX][SI]MOVAX,[BX+SI](3)相对寄存器寻址的表示形式50例4.24相对寄存器寻址的两种表示形式DATASEGMENTMYDATDB100DUP(?)DATAENDSCODESEGMENT┇MOVAX,MYDAT[BX]MOVAX,[MYDAT+BX]MOVCX,MYDAT[BX][SI]MOVCX,[MYDAT+BX+SI]CODEENDS514.6宏指令语句及其使用宏指令—将源程序中多次重复使用的程序段用宏指令来代替1.宏指令定义

宏指令名 MACRO[形式参数1,形式参数2,…形式参数N]┇;宏指令体(宏体)

ENDM2.宏调用

宏指令名实际参数1,实际参数2,…实际参数N3.宏展开

52例4.25无形式参数的宏定义、宏调用及宏展开宏定义:PUSHABMACROPUSHAXPUSHBXENDM宏调用:PUSHAB宏展开:+PUSHAX+PUSHBX53例4.26带形式参数的宏定义、宏调用及宏展开宏定义:

LDSFMACROPR,VAR,N,REG,CCMOVPR,VARMOVAX,[PR]MOVCL,NS&CCREG,CLENDM宏调用1:LDSFSI,WVAR1,4,AX,AR宏调用2:LDSFDI,WVAR2,3,BX,AL宏展开1:+MOVSI,WVAR1+MOVAX,[SI]+MOVCL,4+SARAX,CL宏展开2:+MOVDI,WVAR2+MOVAX,[DI]+MOVCL,3+SALBX,CL

544、宏嵌套(1)宏定义中使用宏调用例2.27设在程序的数据段已经定义了变量X,Y,Z,试计算X+Y→Z,并要求保护所有使用的寄存器。宏定义:DBFMACROP,QMOVBX,PMOVAX,QADDAX,BXENDMDBFSMACROX1,X2,X3PUSHAX55

PUSHBXDBFX1,X2MOVX3,AXPOPBXPOPAXENDM宏调用:DBFSX,Y,Z宏展开:+PUSHAX+PUSHBX +MOVBX,X+MOVAX,Y+ADDAX,BX+MOVZ,AX+POPBX+POPAX56(2)宏定义中包含宏定义例2.28设在程序的数据段已经定义了变量X,Y,Z,试共用一个宏定义,计算X+Y→Z、X-Y→Z、XANDY→Z,并要求保护所有使用的寄存器。宏定义:DEFMMACROMACN,OPENMACNMACROA,B,CPUSHAXMOVAX,AOPENAX,BMOVC,AXPOPAXENDMENDM57宏调用定义加法:

DEFMADDIT,ADD宏展开:+ADDITMACROA,B,CPUSHAXMOVAX,AADDAX,BMOVC,AXPOPAXENDM宏调用定义减法:

DEFMSUBT,SUB宏展开:+SUBTMACROA,B,CPUSHAXMOVAX,ASUBAX,B

58

MOVC,AXPOPAXENDM宏调用定义逻辑“与”:

DEFMANDT,AND宏展开:+ANDTMACROA,B,CPUSHAXMOVAX,AANDAX,BMOVC,AXPOPAXENDM宏调用实现X+Y→Z:

ADDITX,Y,Z宏展开:+PUSHAX59

+MOVAX,X+ADDAX,Y+MOVZ,AX+POPAX宏调用实现X-Y→Z:

SUBTX,Y,Z宏展开:+PUSHAX+MOVAX,X+SUBAX,Y+MOVZ,AX+POPAX宏调用实现XANDY→Z:

ANDTX,Y,Z60宏展开:+PUSHAX+MOVAX,X+ANDAX,Y+MOVZ,AX+POPAX5、宏定义中的标号与变量

定义局部标号的格式:

LOCAL参数1、参数2、……参数n

例4.29延时宏指令语句

61宏定义:

DELAYMACROVALUE1,VALUE2LOCALAGAIN1,AGAIN2PUSHAXPUSHCXMOVCX,VALUE1AGAIN1:MOVAX,VALUE2AGAIN2:DECAXJNZAGAIN2LOOPAGAIN1POPCXPOPAXENDM宏调用1:DELAY1234H,5678H62宏调用2:DELAY9ABCH,0DEF0H宏展开1:DELAY1234H,5678H

+PUSHAX

+PUSHCX

+MOVCX,1234H

+??0000:MOVAX,5678H

+??0001:DECAX

+JNZ??0001

+LOOP??0000

+POPCX

+POPAX宏展开2:DELAY9ABCH,0DEF0H

+PUSHAX

+PUSHCX63+MOVCX,09ABCH

+??0002:MOVAX,0DEF0H

+??0003:DECAX

+JNZ??0003

+LOOP??0002

+POPCX

+POPAX6、其它宏指令语句(1)取消宏指令语句格式:PURGE宏指令名1,宏指令名2……宏指令名n64(2)重复执行宏指令语句格式:REPT表达式宏体

ENDM例4.30将1到10分配给连续的10个存储单元,

X=0

REPT10

X=X+1

DB

X

ENDM宏展开后:+DB1

+DB2┇

+DB1065(3)带参数的重复执行宏指令格式:LRP形式参数〈参数表〉宏体ENDM

例如:

LRP REG 〈AX,BX,CX,DX〉

PUSH

REG

ENDM宏展开后: +PUSH

AX

+PUSH

BX

+PUSH

CX

+PUSH

DX66(4)带字符串重复执行宏指令

格式:LRPC形式参数〈字符串〉宏体

ENDM例如:

LRPC

X,〈HELLO〉

DB X

ENDM宏展开后: +DB 48H

+DB 45H

+DB 4CH

+DB 4CH

+DB 4FH677、宏指令与子程序的区别主要区别在以下几个方面:(1)宏指令调用比子程序调用执行速度快。(2)过程调用使用CALL语句实现,在CPU执行时进行处理,而宏指令调用由宏汇编软件MASM中的宏处理程序来处理。(3)子程序比宏指令节省内存空间。(4)宏指令比子程序灵活。684.7DOS系统功能调用1、常用的DOS软中断(1)程序结束软中断①INT20H调用格式举例:INT20H②INT21H该软中断又有三种情况:无返回程序结束、程序结束并驻留和带 返回程序结束。无返回程序结束的调用格式:MOVAH,0INT21H69程序结束并驻留的调用格式举例:MOVAH,31HMOVAL,1MOVDX,400HINT21H

带返回程序结束的调用格式举例:MOVAH,4CHMOVAL,1INT21H

70③

INT27H调用格式举例:MOVDX,XXINT27H(2)磁盘扇区读与写调用格式举例:

MOVAL,0MOVCX,3MOVDX,4MOVBX,2000HINT25H712、DOS系统功能调用DOS系统功能可分为三个方面:设备管理、文件管理和目录管理设备管理包括:键盘输入、显示输出、设置磁盘缓冲器、选择当 前盘等功能调用;文件管理包括:建立文件、打开文件、读/写文件、删除文件等 功能调用;目录管理包括:查找目录项、更改目录项、建立子目录、删除子 目录等功能调用。

72表4-2常用的DOS软中断

软中断指令功能入口参数出口参数INT21H程序正常退出无无INT21H系统功能调用AH=功能号,相应入口号相应出口号INT22H结束退出INT23HCtrl+Break处理INT24H出错退出INT25H读磁盘AL=驱动器号CX=读入扇区数DX=起始逻辑扇区号DS:BX=内存缓冲区地址CF=0成功CF=1出错INT26H写磁盘AL=驱动器号CX=写入扇区数DX=起始逻辑扇区号DS:BX=内存缓冲区地址CF=0成功CF=1出错INT27H驻留下退出DS:BX=程序长度73(1)显示功能调用①单字符显示调用格式举例:

MOVDL,‘*’

MOVAH,2INT21H②

字符串显示调用格式举例:在屏幕上显示‘HOWAREYOU?’字符串74DATA

SEGMENTCR

EQU0DHLF

EQU0AHDAT1DB‘HOWAREYOU?’,CR,LF,‘$’DATAENDSCODE

温馨提示

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

评论

0/150

提交评论