微机原理与接口技术[1]

上传人:cn****1 文档编号:570234188 上传时间:2024-08-02 格式:PPT 页数:227 大小:2.16MB
返回 下载 相关 举报
微机原理与接口技术[1]_第1页
第1页 / 共227页
微机原理与接口技术[1]_第2页
第2页 / 共227页
微机原理与接口技术[1]_第3页
第3页 / 共227页
微机原理与接口技术[1]_第4页
第4页 / 共227页
微机原理与接口技术[1]_第5页
第5页 / 共227页
点击查看更多>>
资源描述

《微机原理与接口技术[1]》由会员分享,可在线阅读,更多相关《微机原理与接口技术[1](227页珍藏版)》请在金锄头文库上搜索。

1、第四章第四章 汇编语言程序设计汇编语言程序设计4-1. 4-1. 汇编语言程序格式汇编语言程序格式4-2. MASM4-2. MASM中的表达式中的表达式4-3. 4-3. 伪指令语句伪指令语句4-4. DOS4-4. DOS系统功能调用系统功能调用4-5. 4-5. 程序设计方法程序设计方法4-6. 4-6. 宏汇编和条件汇编宏汇编和条件汇编汇编语言的基本概念汇编语言的基本概念 1机器语言机器语言(MachineLanguage)机机器器语语言言是是一一种种用用二二进进制制表表示示指指令令和和数数据据,能能被被机机器器直直接接识识别别的的计计算算机机语语言言。它它的的缺缺点点是是不不直直观观

2、,不不易易理理解解和和记记忆忆,因因此此编编写写、阅阅读读和和修修改改机机器器语语言言程程序序都都比比较较繁繁琐琐。但但机机器器语语言言程程序序是是计计算算机机惟惟一一能能够够直直接接理理解解和和执执行行的的程程序序,具具有有执执行行速速度度快快、占用内存少占用内存少等等特点特点。 2高级语言高级语言(HighLevelLanguage)如果说机器语言是面向机器的,那么高级语言如果说机器语言是面向机器的,那么高级语言( (如如BASICBASIC,FORTRANFORTRAN等等) )则是则是“面向过程面向过程”的语言。利用这些语言编程,程的语言。利用这些语言编程,程序员可以序员可以完全不考虑

3、机器的结构特点完全不考虑机器的结构特点,不必了解和熟记机器的,不必了解和熟记机器的指令系统,仅使用一些接近人们书写习惯的英语和数学表达式指令系统,仅使用一些接近人们书写习惯的英语和数学表达式形式的语句去编制程序。这样编写的程序与问题本身的数学模形式的语句去编制程序。这样编写的程序与问题本身的数学模型之间有着良好的对应关系,可在各种机器上通用型之间有着良好的对应关系,可在各种机器上通用( (不同机器之不同机器之间仅做少量修改间仅做少量修改) )。但是,这种用高级语言编写的源程序并不能。但是,这种用高级语言编写的源程序并不能在机器上直接执行,需要被翻译成对应的在机器上直接执行,需要被翻译成对应的目

4、标程序目标程序( (即即机器语言机器语言程序程序) ),机器才能运行。把具有这种翻译作用的程序称为,机器才能运行。把具有这种翻译作用的程序称为解释程解释程序序或或编译程序编译程序,见下图。,见下图。编译程序的功能示意图编译程序的功能示意图 由于由于高级语言程序高级语言程序是在未考虑机器的结构特点的条件下编写是在未考虑机器的结构特点的条件下编写的,因而它就的,因而它就不能充分利用某种具体不能充分利用某种具体CPUCPU所具有的某些特性所具有的某些特性,而通,而通过编译或解释程序生成的目标程序往往比较冗长,过编译或解释程序生成的目标程序往往比较冗长, 占有较多的内占有较多的内存空间,执行时间也比较

5、长存空间,执行时间也比较长,这就限制了它在某些场合下的运用。,这就限制了它在某些场合下的运用。例如,例如,实时的数据采集、检测和在线的实时控制实时的数据采集、检测和在线的实时控制等,往往要求程等,往往要求程序的目标代码尽可能少占内存并有尽可能快的执行速度,在这些序的目标代码尽可能少占内存并有尽可能快的执行速度,在这些场合下,使用高级语言编写的程序常常不能满足要求。场合下,使用高级语言编写的程序常常不能满足要求。 3汇编语言汇编语言(AssemblyLanguage)汇编语言汇编语言是一种采用是一种采用助记符助记符表示的程序设计语言,即用助表示的程序设计语言,即用助记符来表示指令的操作码和操作数

6、,用标号或符号代表地址、记符来表示指令的操作码和操作数,用标号或符号代表地址、常量或变量。助记符一般都是英文字的缩写,以方便人们书写、常量或变量。助记符一般都是英文字的缩写,以方便人们书写、阅读和检查。实际上,用汇编语言编写的汇编语言源程序就是阅读和检查。实际上,用汇编语言编写的汇编语言源程序就是机器语言程序的符号表示,机器语言程序的符号表示,汇编语言源程序与其经过汇编所产汇编语言源程序与其经过汇编所产生的目标代码程序之间有明显的生的目标代码程序之间有明显的一一对应关系一一对应关系,故,故也称汇编语也称汇编语言为符号语言言为符号语言。 用用汇汇编编语语言言编编写写程程序序能能够够直直接接利利用

7、用硬硬件件系系统统的的特特性性( (如如寄寄存存器器、标标志志、中中断断系系统统等等) )直直接接对对位位、字字节节、字字寄寄存存器器或或存存储储单单元元、I/OI/O端端口口进进行行处处理理,同同时时也也能能直直接接使使用用CPU CPU 指指令令系系统统和和指指令令系系统统提提供供的的各各种种寻寻址址方方式式,编编制制出出高高质质量量的的程程序序,这这样样的的程程序序不不但但占占用用内内存存空空间间少少,而而且且执执行行速速度度快快。当当然然,由由于于源源程程序序和和所所要要解解决决的的问问题题的的数数学学模模型型之之间间的的关关系系不不够够直直观观,使使得得汇汇编编语语言言程程序序设设计

8、计需需要要较较多多的的软软件件开开发发时时间间,也也增增加加了了程程序序设设计计过过程程中中出出错错的的可可能能性。性。 用汇编语言编写的源程序也需要翻译成目标程序才能被机器用汇编语言编写的源程序也需要翻译成目标程序才能被机器执行。这个翻译过程称为执行。这个翻译过程称为汇编汇编,完成汇编任务的程序称为,完成汇编任务的程序称为汇编程汇编程序序,见图,见图5.25.2。 汇编程序的功能示意图汇编程序的功能示意图 汇汇编编程程序序是是最最早早也也是是最最成成熟熟的的一一种种系系统统软软件件。它它除除了了能能够够将将汇汇编编语语言言源源程程序序翻翻译译成成机机器器语语言言程程序序这这一一主主要要功功能

9、能外外,还还能能够够根根据据用用户户的的要要求求自自动动分分配配存存储储区区域域( (包包括括程程序序区区、数数据据区区、暂暂存存区区等等) );自自动动地地把把各各种种进进位位制制数数转转换换成成二二进进制制数数,把把字字符符转转换换成成ASCIIASCII码码,计计算算表表达达式式的的值值等等;自自动动对对源源程程序序进进行行检检查查,给给出出错错误误信信息息( (如如非非法法格格式式,未未定定义义的的助助记记符符、标标号号,漏漏掉掉操操作作数数等等) )等。具有这些功能的汇编程序又称为等。具有这些功能的汇编程序又称为基本汇编基本汇编( (或小汇编或小汇编ASM)ASM)。 在基本汇编的基

10、础上,进一步允许在基本汇编的基础上,进一步允许在源程序中把一个指令在源程序中把一个指令序列定义为一条宏指令的汇编程序序列定义为一条宏指令的汇编程序,就叫做,就叫做宏汇编宏汇编(MASM)(MASM)。它。它包含全部包含全部ASMASM功能,还增加了宏指令、结构、记录等高级汇编语功能,还增加了宏指令、结构、记录等高级汇编语言功能。言功能。 5.2汇编语言源程序的格式汇编语言源程序的格式例例5.1要求将两个5字节十六进制数相加,可以编写出以下汇编语言源程序。DATASEGMENT;定义数据段DATA1DB0F8H,60H,0ACH,74H,3BH;被加数DATA2DB0C1H,36H,9EH,0D

11、5H,20H;加数DATAENDS;数据段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA数据段定义了两个数据段定义了两个5 5字节的变量字节的变量通过通过ASSUMEASSUME伪指令伪指令进行段分配。确定进行段分配。确定数据段和代码段。数据段和代码段。START:MOVAX,DATAMOVDS,AX;初始化DSMOVCX,5;循环次数送CXMOVSI,0;置SI初值为0CLC;清CF标志LOOPER:MOVAL,DATA2SI;取一个字节加数ADCDATA1SI,AL;与被加数相加设置段寄存器的值。除设置段寄存器的值。除CSCS以以外,各个段寄存器的实际值外

12、,各个段寄存器的实际值还要用还要用MOVMOV指令来赋给。指令来赋给。INCSI;SI加1DECCX;CX减1JNZLOOPER;若不等于0,转LOOPERMOVAH,4CHINT21H;返回DOSCODEENDS;代码段结束 ENDSTART;源程序结束程序结束。程序结束。DATASEGMENTARRAY1DB05,0A2H,00,10H,85HNEQU5ARRAY2DBNDUP(?)DATAENDSSTACKSEGMENTPARASTACKSTACKDB100DUP(?)(?)STACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:M

13、OV AX,DATA MOV DS,AXLEA SI,ARRAY1LEADI,ARRAY2MOV CX,N05A2001085array1array2DSCS段定义的基本格式:段定义的基本格式:段名段名SEGMENT段名段名ENDS计算机识别不同的段由段分配伪指令来实现。计算机识别不同的段由段分配伪指令来实现。其格式为:其格式为:ASSUMECS:段名,段名,DS:段名,段名,SS:段名,段名,ES:段名段名对程序已经定义的数据段、堆栈段和附加段对程序已经定义的数据段、堆栈段和附加段要设置这些段寄存器的值。要设置这些段寄存器的值。注:注:代码段不能人为设置,由计算机分配。代码段不能人为设置,由

14、计算机分配。堆栈段则根据定义的格式定,本例中已确认堆栈段则根据定义的格式定,本例中已确认STACKSTACK段位堆栈段,则计算机自动给段位堆栈段,则计算机自动给SSSS和和SPSP赋值。赋值。AGAIN:MOVAL,SIINCSICMPAL,50JBENEXTMOV DI,ALINCDINEXT: DECCXJNZAGAINMOV AH,4CHINT21HCODEENDSENDBEGIN05A2001085array1array2DSCS程序执行完要返回操作系统,有两种方式实现。程序执行完要返回操作系统,有两种方式实现。一种是在程序的开始部分编写如下程序:一种是在程序的开始部分编写如下程序:P

15、USHDSMOVAX,0PUSHAX注:上面的程序必须写在堆栈设置的后面。注:上面的程序必须写在堆栈设置的后面。程序结尾使用:程序结尾使用:RET另一种方法是本例中使用的另一种方法是本例中使用的DOSDOS功能调用。功能调用。全部源程序用全部源程序用ENDEND语句结尾,语句结尾,ENDEND后后面可以加上程序执行的面可以加上程序执行的起始名称起始名称,汇编程序遇见汇编程序遇见ENDEND语句就结束。语句就结束。 由由上上面面的的例例子子可可以以看看出出,一一个个完完整整的的汇汇编编程程序序编编写写格格式式要要包包括括以以下下几几部部分分:段段定定义义、段段分分配配、设设置置段段地地址址、返返

16、回回DOSDOS语语句句及及程序结束程序结束。 汇汇编编语语言言源源程程序序的的结结构构是是分分段段结结构构形形式式,一一个个汇汇编编语语言言源源程程序序由由若若干干段段(SEGMENT)(SEGMENT)组组成成,每每个个段段以以SEGMENTSEGMENT语语句句开开始始,以以ENDSENDS语句结束。整个源程序的结尾是语句结束。整个源程序的结尾是ENDEND语句。语句。 这里所说的汇编语言源程序中的段与前面讨论的这里所说的汇编语言源程序中的段与前面讨论的CPUCPU管理的管理的存储器的段,既有联系,又在概念上有所区别。我们已经知道,存储器的段,既有联系,又在概念上有所区别。我们已经知道,

17、微处理器对存储器的管理是分段的,因此,在汇编语言程序中微处理器对存储器的管理是分段的,因此,在汇编语言程序中也要求分段组织指令、数据和堆栈,以便将源程序汇编成为目也要求分段组织指令、数据和堆栈,以便将源程序汇编成为目标程序后,可以分别装入存储器的相应段中。标程序后,可以分别装入存储器的相应段中。 但但是是,以以8086/8088 8086/8088 CPUCPU为为例例,它它有有四四个个段段寄寄存存器器(CS(CS,ESES,SSSS和和DS)DS),因因此此CPUCPU对对存存储储器器按按照照四四个个物物理理段段进进行行管管理理,即即数数据据段段、附附加加段段、堆堆栈栈段段和和代代码码段段。

18、任任何何时时侯侯CPUCPU只只能能访访问问四四个个物物理理段段。而而在在汇汇编编语语言言源源程程序序中中,设设置置段段的的自自由由度度比比较较大大。例例如如,一一个个源源程程序序中中可可以以有有多多个个数数据据段段或或多多个个代代码码段段等等等等。一一般般来来说说,汇汇编编语语言言源源程程序序中中段段的的数数目目可可以以根根据据实实际际需需要要而而设设定定。为为了了和和CPUCPU管管理理的的存存储储器器物物理理段段相相区区别别,我我们们将将汇汇编编语语言言程程序序中中的的段段称称为为逻辑段逻辑段。在不致发生混淆的地方,有时简称为段。在不致发生混淆的地方,有时简称为段。 在上面的简单源程序中

19、只有三个逻辑段,一个逻辑段的名字在上面的简单源程序中只有三个逻辑段,一个逻辑段的名字是是DATADATA,其中存放着与程序有关的数据,称为逻辑数据段;另一,其中存放着与程序有关的数据,称为逻辑数据段;另一个逻辑段的名字是个逻辑段的名字是STACKSTACK,只申请了一定的存储器空间,称为逻,只申请了一定的存储器空间,称为逻辑堆栈段。第三个逻辑段的名字是辑堆栈段。第三个逻辑段的名字是CODECODE,其中包含着程序的指令,其中包含着程序的指令,称为逻辑代码段。称为逻辑代码段。 每个段内均有若干行语句每个段内均有若干行语句(STATEMENT)(STATEMENT),因此,可以说一个,因此,可以说

20、一个汇编源程序是由一行一行的语句组成的。下面我们来讨论汇编语汇编源程序是由一行一行的语句组成的。下面我们来讨论汇编语言语句的类型和组成。言语句的类型和组成。 4-1 4-1 汇编语言程序格式汇编语言程序格式 一、一、 指令语句指令语句 特特点点:与与机机器器指指令令相相对对应应。汇汇编编程程序序可可将将他他翻翻译译成成目目标标代代码码(机器指令代码)(机器指令代码)。CPU CPU 可以执行的能完成特定功能的语句。可以执行的能完成特定功能的语句。 汇编语言源程序中的语句可以分为两种类型:汇编语言源程序中的语句可以分为两种类型: 指令语句指令语句和和伪指令语句伪指令语句。格式:格式:标号:标号:

21、 指令助记符指令助记符 操作数,操作数操作数,操作数 ;注释;注释是是CPUCPU指令系统中指令的助记符指令系统中指令的助记符,如,如MOVMOV、ADCADC等。助记符约有等。助记符约有9090多种,在第多种,在第3 3章中章中已经进行了详细的讨论。已经进行了详细的讨论。二、伪指令语句二、伪指令语句 特特点点:没没有有对对应应的的机机器器指指令令,它它是是一一种种不不产产生生目目标标代代码码的的语语句句,它它仅仅仅仅在在汇汇编编过过程程中中告告诉诉汇汇编编程程序序应应如如何何汇汇编编。例例如如,告告诉诉汇汇编编程程序序已已写写出出的的汇汇编编语语言言源源程程序序有有几几个个段段,段段的的名名

22、字字是是什什么么;定定义义变变量量,定定义义过过程程,给给变变量量分分配配存存储储单单元元,给给数数字字或或表表达达式式命命名等。显然,名等。显然,伪指令语句是汇编程序在汇编时使用的伪指令语句是汇编程序在汇编时使用的。 格式:格式:名字名字 伪指令指示符伪指令指示符 操作数,操作数操作数,操作数 ;注释;注释 功能:功能:数据定义、存储区分配、段定义、段分配、指示程数据定义、存储区分配、段定义、段分配、指示程 序结束等。序结束等。可以是可以是变量名、段名、过程名变量名、段名、过程名。名字后名字后面通常不跟面通常不跟 “:” “:”。名字后面冒号,这。名字后面冒号,这是它和标号的一个明显区别。是

23、它和标号的一个明显区别。汇编程序规定的符号,常用的有变量定义语句汇编程序规定的符号,常用的有变量定义语句(DBDB、DWDW) ),符号定义语句,符号定义语句( (EQUEQU、= =) ),段定义语,段定义语句句( (SEGMENTENDSSEGMENTENDS) ),段分配语句,段分配语句( (ASSUMEASSUME) ),结,结构定义语句构定义语句( (STRUCENDSSTRUCENDS) ),过程定义语句,过程定义语句( (PROCENDPPROCENDP) )等类型。等类型。不同的伪指令对操作不同的伪指令对操作数的要求不同。数的要求不同。 名名字字和和标标号号是是由由一一串串字字

24、符符构构成成,用用于于一一段段程程序序、一一组组(或或一个)数据或一个段的开头。使用时要注意以下一个)数据或一个段的开头。使用时要注意以下3 3点:点: 标识符可由标识符可由数字数字、字母字母和和下划线下划线组成;组成; 不能以数字开头不能以数字开头,数字可用在非开头的其它位置;,数字可用在非开头的其它位置; 其最大长度为其最大长度为3131个字符。个字符。 所有所有8086/80888086/8088的指令、伪指令和寄存器名都是保留字的指令、伪指令和寄存器名都是保留字。如如AXAX、MOVMOV、DBDB、INTINT、EQUEQU等等。等等。 保留字不能用作标识符保留字不能用作标识符三、数

25、据项(操作数)三、数据项(操作数) 汇编语言中使用的操作数可以是汇编语言中使用的操作数可以是常数、寄存器、存储器、常数、寄存器、存储器、变变量量、标标号号和和表表达达式式。其其中中常常数数、变变量量和和标标号号是是三三种种基基本本的的数数据据项。项。1. 1. 常数常数 常数就是指令中出现的那些固定值,可以分为常数就是指令中出现的那些固定值,可以分为数值常数数值常数和和字字符串常数符串常数两类。两类。例如,例如,立即数寻址时所有的立即数、直接寻址时立即数寻址时所有的立即数、直接寻址时所有的地址、所有的地址、ASCIIASCII字符串等都是字符串等都是常数常数。常数是除了自身的值以常数是除了自身

26、的值以外,没有其他属性的数值外,没有其他属性的数值。在源程序中,数值常数按其基数的不在源程序中,数值常数按其基数的不同,可有二进制数、八进制数、十进制数、十六进制数等几种不同,可有二进制数、八进制数、十进制数、十六进制数等几种不同表示形式。汇编语言用不同的后缀加以区别。同表示形式。汇编语言用不同的后缀加以区别。 还应注意还应注意,汇编语言中的,汇编语言中的数值常数的第一位必须是数字数值常数的第一位必须是数字,否则汇编时将被看成是标识符,如常数否则汇编时将被看成是标识符,如常数B7HB7H应写成应写成0B7H0B7H,FFHFFH应应写成写成0FFH0FFH。字符串常数是由。字符串常数是由单引号

27、单引号括起来的一串字符。例如括起来的一串字符。例如ABCDEFGABCDEFG和和179179。单引号内的字符在汇编时都以。单引号内的字符在汇编时都以ASCIIASCII的代码的代码形式存放在存储单元中。如上述两字符串的形式存放在存储单元中。如上述两字符串的ASCIIASCII代码为代码为41H41H,42H42H,43H43H,44H44H,48H48H和和31H31H,37H37H,39H39H。字符串最长允许有字符串最长允许有255255个字符个字符。 2. 2. 变量变量 变量通常指数据存放在存储单元中的值,在程序中是可以变量通常指数据存放在存储单元中的值,在程序中是可以修改。变量都具

28、有三种属性。修改。变量都具有三种属性。 (2) (2) 段内偏移地址(段内偏移地址(OFFSETOFFSET):):变量所在地址与所在段的变量所在地址与所在段的段基址之间的地址偏移字节数;段基址之间的地址偏移字节数;又称变量的又称变量的段属性段属性是变量所代表的数据是变量所代表的数据区所在段的段地址。由于数据区一般在区所在段的段地址。由于数据区一般在存储器的数据段中,因此变量的段地址存储器的数据段中,因此变量的段地址常常在常常在DSDS和和ESES寄存器中。寄存器中。 (1) (1) 段值(段值(SEGMENTSEGMENT):):变量所在段的段基址;变量所在段的段基址; (3) (3) 类型

29、(类型(TYPETYPE):):变量的类型属性是指变量中每个元素变量的类型属性是指变量中每个元素所包含的字节数。字节变量所包含的字节数。字节变量(BYTE)(BYTE)、字变量、字变量(WORD)(WORD)、双字变量、双字变量(DWORD)(DWORD)、QWORD (QWORD (四字四字) )、TBYTE(TBYTE(十字十字) )等。表示数据区中存取等。表示数据区中存取操作对象的大小。操作对象的大小。 又称变量的又称变量的偏移量属性。偏移量属性。表示标表示标号所在段的起始地址到定义该标号所在段的起始地址到定义该标号的地址之间的字节数。偏移量号的地址之间的字节数。偏移量是一个是一个161

30、6位无符号数。位无符号数。又称标号的又称标号的类型属性。类型属性。3. 3. 标号标号 标号是可执行语句的地址的符号表示,代表一条指令的符标号是可执行语句的地址的符号表示,代表一条指令的符号地址,它可作为转移指令、调用指令号地址,它可作为转移指令、调用指令CALLCALL的以及循环控制的以及循环控制LOOPLOOP指令目的操作数,以确定程序转向的目的地址。指令目的操作数,以确定程序转向的目的地址。它具有它具有三种属性三种属性。 (1) (1) 段值(段值(SEGMENTSEGMENT):):标号所在段的段基址;标号所在段的段基址; (2) (2) 段内偏移地址(段内偏移地址(OFFSETOFF

31、SET):):标号所在地址与所在段的标号所在地址与所在段的段基址之间的地址偏移字节数。段基址之间的地址偏移字节数。 又称标号的又称标号的段属性。段属性。是定义是定义标号在程序段的段地址。当标号在程序段的段地址。当程序中引用一个标号时,该程序中引用一个标号时,该标号的段值应在标号的段值应在CSCS寄存器中。寄存器中。又称标号的又称标号的偏移量属性。偏移量属性。表示标表示标号所在段的起始地址到定义该标号所在段的起始地址到定义该标号的地址之间的字节数。偏移量号的地址之间的字节数。偏移量是一个是一个1616位无符号数。位无符号数。 (3) (3) 类型(类型(TYPETYPE):):标号的类型属性是指

32、在转移指令中标标号的类型属性是指在转移指令中标号可转移的距离(距离属性号可转移的距离(距离属性NEARNEAR,FARFAR)。若标号后面紧跟冒号,)。若标号后面紧跟冒号,表示隐含此标号距离属性为表示隐含此标号距离属性为NEARNEAR,也可用伪指令将此属性改为,也可用伪指令将此属性改为FARFAR。又称标号的又称标号的类型属性。类型属性。NEARNEAR可以在段内可以在段内被引用,地址指针为被引用,地址指针为2 2字节;字节;FARFAR可以在可以在其他段被引用,地址指针为其他段被引用,地址指针为4 4字节。如字节。如果定义一个标号时后跟冒号。果定义一个标号时后跟冒号。4 42 MASM2

33、MASM中的表达式中的表达式 MASMMASM中使用了中使用了6 6类运算符:类运算符: 算术运算符(算术运算符(Arithmetic OperatorsArithmetic Operators) 逻辑运算符(逻辑运算符(Logical OperatorsLogical Operators) 关系运算符(关系运算符(Relational OperatorsRelational Operators) 数值返回运算符(数值返回运算符(Value-Returning OperatorsValue-Returning Operators) 修改属性运算符(修改属性运算符(Modifing attrib

34、ute OperatorsModifing attribute Operators) 其它运算符(其它运算符(Other OperatorsOther Operators)表达式由表达式由运算对象运算对象及及运算符运算符组成,在汇编时由汇编程序对它组成,在汇编时由汇编程序对它进行运算,运算结果作为一个语句的进行运算,运算结果作为一个语句的操作数操作数使用。运算对象可以使用。运算对象可以是常数、变量或标号,得到的运算结果可以是是常数、变量或标号,得到的运算结果可以是一个常数字一个常数字,也可,也可以是以是一个存储器的地址一个存储器的地址,在此地址中存放了数据(称为变量)或,在此地址中存放了数据(

35、称为变量)或指令。指令。用一个表达式来表示某一个操用一个表达式来表示某一个操作数。作数。例:例:MOVAX,3*TAB一、算术运算符一、算术运算符符号符号名称名称运算结果运算结果+加法加法和和减法减法差差*乘法乘法乘积乘积/除法除法商商MOD模除模除余数余数SHL左移左移左移后二进制左移后二进制SHR右移右移右移后二进制右移后二进制例例:ARRAYDB1,2,3,4,5,6,7,8,9TRYDB10,20MOV AX,10*2MOV CX,TRY-ARRAY汇编时,计算表达式形成指令为:汇编时,计算表达式形成指令为:MOV AX,20MOV CX,9例例:DAEQU200MOV AX,DA-8

36、0MOV BX,DAMOD100MOV CX,DA/100MOV DH,01100100BSHR2汇编时,计算表达式形成指令为:汇编时,计算表达式形成指令为:DAEQU200MOV AX,120MOV BX,0MOV CX,2MOV DH,19H二、逻辑运算符二、逻辑运算符符号符号名称名称运算结果运算结果AND与运算与运算逻辑与结果逻辑与结果OR或运算或运算逻辑或结果逻辑或结果XOR异或运算异或运算逻辑异或结果逻辑异或结果NOT非运算非运算逻辑非结果逻辑非结果例例:MOV AL,NOT0FFHMOV BL,8CHAND73HMOV AH,8CHOR73HMOV CH,8CHXOR73H汇编时,

37、计算表达式形成指令为:汇编时,计算表达式形成指令为:MOV AL,0MOV BL,0MOV AH,0FFHMOV CH,0FFH三、关系运算符三、关系运算符符号符号名称名称运算结果运算结果EQ相等相等NE不相等不相等LT小于小于结果为真输出全结果为真输出全“1”LE小于等于小于等于结果为假输出全结果为假输出全“0”GT大于大于GE大于等于大于等于例例:MOV AX,10HGT16ADDBL,6EQ0110BMOV CX,(PORTLT5)AND100)OR(PORTGE5)AND200)汇编时,计算表达式形成指令为(设汇编时,计算表达式形成指令为(设PORT5):):MOV AX,0MOV B

38、L,0FFHMOV CX,200四、数值返回运算符四、数值返回运算符符号符号名称名称运算结果运算结果OFFSET返回偏移地址返回偏移地址偏移地址偏移地址SEG返回段基址返回段基址段基址段基址TYPE返回元素字节数返回元素字节数字节数字节数LENGTH返回变量单元数返回变量单元数单元数单元数SIZE返回变量总字节数返回变量总字节数总字节数总字节数1.OFFSET格式:格式:OFFSET变量或标号变量或标号功能:功能:返回变量或标号的偏移地址值返回变量或标号的偏移地址值例例:MOV BX,OFFSETDA1相当于指令:相当于指令:LEABX,DA12.SEG格式:格式:SEG变量或标号变量或标号功

39、能:功能:得到一个标号或变量所在段的段地址。得到一个标号或变量所在段的段地址。例例:MOVAX,SEGARRAYMOVDS,AX将变量将变量ARRAYARRAY的段的段地址送地址送DSDS寄存器寄存器例例:MOVAX,SEGARRAYMOVDS,AX3.TYPE格式:格式:TYPE变量或标号变量或标号功能:功能:返回变量的类型属性。返回变量的类型属性。3.TYPE格式:格式:TYPE变量或标号变量或标号功能:功能:返回变量的类型属性。返回变量的类型属性。TYPE TYPE 返回值与类型的关系返回值与类型的关系类型类型TYPE返回值返回值BYTE1WORD2DWORD4FWORD6QWORD8T

40、BYTE10NEAR-1FFHFAR-2FEH变量变量标号标号例例:DA1DB11H,22HDA2DW11H,22HDA3DD?PRO: MOV AH,TYPEDA1MOV AL,TYPEDA2MOV BH,TYPEDA3MOV BL,TYPEPRO汇编时形成指令为:汇编时形成指令为:MOV AH,1MOV AL,2MOV BH,3MOV BL,0FFH4.LENGTH格式:格式:LENTH变量变量功能:功能:如果一个变量已用重复操作符如果一个变量已用重复操作符DUPDUP说明其变量的个数,说明其变量的个数, 则利用则利用LENGTH LENGTH 运算符可得到这个变量的个数。如果未运算符可得

41、到这个变量的个数。如果未 用用DUPDUP说明,则得到的结果总是说明,则得到的结果总是1 1。例例:M1DW20DUP(?)M2DW11,22,33M3DBASDFMOV CX,LENGTHM1MOV BL,LENGTHM2MOV AL,LENGTHM3汇编时,形成指令为:汇编时,形成指令为:MOV CX,20MOV BL,1MOV AL,15.SIZE格式:格式:SIZE变量变量功能:功能:如果一个变量已用重复操作符如果一个变量已用重复操作符DUPDUP说明,则利用说明,则利用SIZE SIZE 运算符可得到分配给该变量的运算符可得到分配给该变量的字节总数字节总数。如果未用如果未用DUPDU

42、P 说明,则得到的结果是说明,则得到的结果是TYPETYPE运算的结果。运算的结果。例例:M1DW20DUP(?)M2DW11,22,33M3DBASDFMOV CX,SIZEM1MOV BL,SIZEM2MOV AL,SIZEM3汇编时,形成指令为:汇编时,形成指令为:MOV CX,40MOV BL,2MOV AL,1SIZE=LENGTH*TYPESIZE=LENGTH*TYPE例例: : 设有数据段中使用设有数据段中使用DATA1DB?定义了一个单元,则定义了一个单元,则MOVAL,DATA1可将可将DATA1中的数传送到中的数传送到AL中,中,AL=05MOVAX,SEGDATA1可将

43、可将DATA1的所在段地址传到的所在段地址传到AX中,中,AX=2000MOVAX,OFFSETDATA1可将可将DATA1的偏移地址传入的偏移地址传入AX中中,AX=1500例例: : 设有数据段中使用设有数据段中使用DATA1DW100DUP(?)定义了定义了100个字单元,则个字单元,则MOVAX,TYPEDATA1;AX=2MOVAX,SIZEDATA1;AX=200MOVAX,LENGTHDATA1;AX=10005A2001085DSCSDATA12000:1500五、修改属性运算符五、修改属性运算符符号符号名称名称运算结果运算结果段寄存器名:段寄存器名:段前缀段前缀修改段修改段P

44、TR修改类型属性修改类型属性修改后类型修改后类型THIS指定类型指定类型/距离属性距离属性指定后类型指定后类型HIGH分离高字节分离高字节高字节高字节LOW分离低字节分离低字节低字节低字节SIZESHORT短转移说明短转移说明128-127字节间转移字节间转移又称综合运算符(又称综合运算符(Syntheticoperators)可以在程序运行过程中,通过修改属性运算符来修改变可以在程序运行过程中,通过修改属性运算符来修改变量或标号的属性,包括段属性、偏移地址属性、类型属性等。量或标号的属性,包括段属性、偏移地址属性、类型属性等。1.段操作符段操作符格式:格式:段前缀:段前缀:变量或地址表达式变

45、量或地址表达式功能:功能:运算符运算符“:”(”(冒号冒号) )跟在段寄存器名跟在段寄存器名(DS(DS,ESES,SSSS和和CS)CS) 之后,表示段超越,用以给一个存储器操作数指定一之后,表示段超越,用以给一个存储器操作数指定一 个段属性,而不管其原来隐含的段是什么。个段属性,而不管其原来隐含的段是什么。例如:例如:MOVAX,ES:DI2.PTR格式:格式:类型类型/距离距离PTR变量或标号变量或标号功能:功能:PTR运算符可以指定或修改存储器操作数的类型。运算符可以指定或修改存储器操作数的类型。例如:例如:INCBYTEPTRBXSI指令中利用指令中利用PTRPTR运算符明确规定了存

46、储器操作运算符明确规定了存储器操作数的类型是数的类型是BYTE(BYTE(字节字节) ),因此,因此, 本指令将一个字本指令将一个字节型存储器操作数加节型存储器操作数加1 1。如:如:DATA1DW100DUP(?)05A2001085DSMOVAL,DATA1MOVAL,BYTEPTRDATA1DATA1利利用用PTRPTR运运算算符符可可以以建建立立一一个个新新的的存存储储器器操操作作数数,它它与与原原来来的的同同名名操操作作数数具具有有相相同同的的段段和和偏偏移移量量,但但可可以以有有不不同同的的类类型型。不不过这个新类型只在当前语句中有效。过这个新类型只在当前语句中有效。例如:例如:S

47、TUFFDD?;定;定义义STUFF为为双字双字类类型型变变量量MOVBX,WORDPTRSTUFF;从;从STUFF中取一个字到中取一个字到BX 也可以用也可以用PTRPTR改变距离属性。改变距离属性。例如:例如:JMPJMPFAR PTR LOPFAR PTR LOP 在在JMPJMP语语句句中中将将标标号号LOPLOP改改为为FARFAR,使使JMPJMP指指令令安安排排在在其其它它代代码码段中也可以使用,以实现段间转移。段中也可以使用,以实现段间转移。3.THIS格式:格式:变量变量/标号标号EQUTHIS类型类型/距离距离功能:功能:THIS的功能是将的功能是将EQUTHIS右边的类

48、型右边的类型/距离属性赋给距离属性赋给左边的变量左边的变量/标号,该变量或标号的段地址和偏移地址标号,该变量或标号的段地址和偏移地址与下一个存储单元的地址相同。与下一个存储单元的地址相同。使用使用THISTHIS运算符可以使标号或变量更具灵活性。运算符可以使标号或变量更具灵活性。例例如如,要要求求对对同同一一个个数数据据区区既既可可以以字字节节为为单单位位,又又可可以以字字为为单单位进行存取,则可用以下语句:位进行存取,则可用以下语句:TAB1EQUTHISWORDTAB2DB100DUP(?) 本例中本例中TAB1TAB1和和TAB2TAB2实际上代表同一实际上代表同一个数据区,其中共有个数

49、据区,其中共有100100个字节,但个字节,但TAB1TAB1的类型为的类型为WORD(WORD(字类型字类型) ),而,而TAB2TAB2的的类型为类型为BYTE(BYTE(字节类型字节类型) )。 DATA1SEGMENTWBUFFEREQUTHISWORDBUFFERDB12H,34H,00H,91HDATA1ENDSCODE1SEGMENTASSUMECS:CODE1,DS:DATA1START:MOVAX,DATA1MOVDS,AXLEASI,BUFFERMOVDI,OFFSETWBUFFERMOVAL,BUFFER3MOVBX,WBUFFER2CODE1ENDSENDSTARTTH

50、IS用来建立新的存储器地址操作数,但不分配存储单元。新的操作用来建立新的存储器地址操作数,但不分配存储单元。新的操作数类型在数类型在THIS中指定,而其段地址和偏移量就是汇编时的当前值。中指定,而其段地址和偏移量就是汇编时的当前值。1234009185DSBUFFERWBUFFERSI=36ABH1000H:36ABHDI=36ABHMOVAX,BUFFER3AL=91HBX=9100HMOVAL,WBUFFER2例如例如LOPEQUTHIS FARLOP1:MOV AX,10此此时时MOV MOV AX, AX, 1010前前有有标标号号LOPLOP,并并赋赋予予FARFAR属属性性,允允许

51、许其其它它段的段的JMPJMP指令跳到指令跳到LOPLOP标号地址上。标号地址上。4.SHORT格式:格式:SHORT标号标号功能:功能:SHORTSHORT运算符指定一个标号的类型为运算符指定一个标号的类型为SHORT(SHORT(短标号短标号) ),即,即 标号到引用该标号指令之间的距离在标号到引用该标号指令之间的距离在128128+127+127个字节个字节 的范围内。短标号可以被用于无条件转移指令中。使用的范围内。短标号可以被用于无条件转移指令中。使用 短标号的指令比使用缺省的近标号的指令少一个字节。短标号的指令比使用缺省的近标号的指令少一个字节。例如:例如: JMPJMPSHORTS

52、HORT LOPLOPLOP:LOP:MOVMOVBX,10BX,105.HIGH和和LOW格式:格式:HIGH/LOW变量或标号变量或标号功能:功能:HIGHHIGH和和LOWLOW称为字节分离运算符,对一个数或地址表达称为字节分离运算符,对一个数或地址表达 式,式,HIGHHIGH从中分离出高位字节,从中分离出高位字节,LOWLOW分离出低位字节。分离出低位字节。例如:例如: K1K1EQUEQU0AF12H0AF12HK2K2EQUEQU3456H3456HMOVMOVAH, HIGH K1AH, HIGH K1MOVMOVAL, LOW K2AL, LOW K2汇编时,形成指令为:汇编

53、时,形成指令为:MOV AH,0AFHMOV AL,56H六、其它运算符六、其它运算符符号符号名称名称运算结果运算结果()()圆括号圆括号改变运算符优先级改变运算符优先级方括号方括号下标或间接寻址下标或间接寻址点运算符点运算符连接结构与变量连接结构与变量尖括号尖括号修改变量修改变量MASK记录位图记录位图位图形位图形WIDTH记录宽度记录宽度记录字段位数记录字段位数1.圆括号()圆括号()功能:功能:用来改变运算符的优先级别,()中的运算符具有最用来改变运算符的优先级别,()中的运算符具有最 高级别。高级别。例如:例如:ARRAYDB1,2,3,4,5,6,7,8,9TRYDB10,20MOV

54、 BX,OFFSETARRAYMOV AL,BX+2;03HALMOV TRY1,AL ;03HTRY的第二个单元的第二个单元2.方括号方括号功能:功能:用来表示地址表达式或多重变量的下标值。用来表示地址表达式或多重变量的下标值。用用 表示表示地址表达式地址表达式用用 表示多重表示多重变量的下标变量的下标3.尖括号尖括号,及圆点及圆点( (在结构中解释)在结构中解释)4.MASK和和WIDTH(在记录中专用)在记录中专用)七、优先级七、优先级 以以上上介介绍绍了了表表达达式式中中使使用用的的各各种种运运算算符符,如如果果一一个个表表达达式式同时具有多个运算符,则按以下规则运算:同时具有多个运算

55、符,则按以下规则运算: 优先级高的先运算,优先级低的后运算。优先级高的先运算,优先级低的后运算。 优先级相同时按表达式中从左到右的顺序运算。优先级相同时按表达式中从左到右的顺序运算。 括号可以提高运算的优先级,括号内的运算总是在相邻括号可以提高运算的优先级,括号内的运算总是在相邻的运算之前进行。的运算之前进行。 运算符的优先级运算符的优先级 4-3. 4-3. 伪指令语句伪指令语句 伪伪指指令令无无论论表表示示形形式式或或其其在在语语句句中中所所处处的的位位置置,都都与与指指令令相相似似。但但二二者者之之间间有有着着重重要要的的区区别别。首首先先,指指令令是是给给CPUCPU的的命命令令,在在

56、运运行行时时由由CPUCPU执执行行,每每条条指指令令对对应应CPUCPU的的一一种种特特定定的的操操作作,例例如如传传送送、加加法法等等;而而伪伪指指令令是是给给汇汇编编程程序序的的命命令令,在在汇汇编编过过程程中中由由汇汇编编程程序序进进行行处处理理,例例如如定定义义数数据据、分分配配存存储储区区、定定义义段段以以及及定定义义过过程程等等。其其次次,汇汇编编以以后后,每每条条指指令令产产生生一一一一对对应应的的目目标标代代码码;而而伪伪指指令令则则不不产产生生与与之之相相应应的的目目标标代代码码。主主要要完完成成变变量量定定义义、内内存分配、指示程序开始和结束等。存分配、指示程序开始和结束

57、等。 宏宏汇汇编编程程序序MASMMASM提提供供了了几几十十种种伪伪指指令令,其其中中有有一一些些伪伪指指令令小小汇汇编编ASMASM不不能能支支持持,如如宏宏处处理理其其等等。根根据据其其功功能能,伪伪指指令令大大致致可可以分为以下几类:以分为以下几类: 此外还有以下不常用的语句:此外还有以下不常用的语句:群定义语句群定义语句GROUPGROUP结构定义语句结构定义语句STRUCENDSSTRUCENDS记录定义语句记录定义语句RECODERECODE数据定义语句:数据定义语句:DBDB、DWDW、DDDD、DQDQ、DTDT标号赋值语句:标号赋值语句:EQUEQU、段定义语句:段定义语句

58、:SEGMENTENDSSEGMENTENDS段分配语句:段分配语句:ASSUMEASSUME过程定义语句:过程定义语句:PROC ENDPPROC ENDP程序开始、结束语句:程序开始、结束语句:ORGORG、ENDEND、NAMENAME一、一、 数据定义语句数据定义语句数数据据定定义义语语句句用用于于为为数数据据分分配配相相应应的的存存储储单单元元。用用一一个个符符号号名名代代表表一一个个或或一一些些单单元元,并并可可为为这这个个或或这这些些单单元元提提供供初初始始值值。定义数据的操作符有定义数据的操作符有: :字节定义字节定义DB字定义字定义DW双字定义双字定义DD四字定义四字定义DQ

59、十字节定义十字节定义DT重复定义重复定义mDUP(n)_(重复(重复m次个数据次个数据n)与数据相联系的符号名称为与数据相联系的符号名称为变量变量。格式:格式:变量名变量名 助记符助记符 操作数,操作数操作数,操作数 ;注释;注释 变量名变量名 助记符助记符 n DUP ( n DUP (操作数,操作数操作数,操作数) ) ;注释;注释功能:功能:定义一个变量的类型,给变量赋初值,或者仅仅给变量定义一个变量的类型,给变量赋初值,或者仅仅给变量 分配存储单元,而不赋予特定的值。数据定义伪指令有分配存储单元,而不赋予特定的值。数据定义伪指令有 DB DB,DWDW,DDDD,DFDF,DQDQ,D

60、TDT等,而常用的是前三种。等,而常用的是前三种。 (1). DB (Define Byte)定定义义变变量量的的类类型型为为字字节节(BYTE),给给变变量量分分配配字字节节或或字字节节串串。DB伪伪指令定指令定义义符后面的操作数每个占有符后面的操作数每个占有1个字个字节节。 (2)DW (Define Word)定义变量的类型为字定义变量的类型为字(WORD)。DW伪指令定义符后面的操作伪指令定义符后面的操作数每个占有数每个占有1个字,即个字,即2个字节。在内存中存放时,低位字在前,个字节。在内存中存放时,低位字在前,高位字在后。高位字在后。 (3)DD (Define Double wo

61、rd)定定义义变变量量的的类类型型为为双双字字(DWORD)。DD后后面面的的操操作作数数每每个个占占有有2个个字字,即即4个个字字节节。在在内内存存中中存存放放时时,低低位位字字在在前前,高高位位字字在后。在后。数据定义伪指令定义符后面的操作数可以是常数、表达式数据定义伪指令定义符后面的操作数可以是常数、表达式或字符串,但每项操作数的值不能超过由伪指令定义符所定义或字符串,但每项操作数的值不能超过由伪指令定义符所定义的数据类型限定的范围。例如,的数据类型限定的范围。例如,DB伪指令定义数据的类型为字伪指令定义数据的类型为字节,则其范围为无符号数:节,则其范围为无符号数:0255;带符号数:;

62、带符号数:128+127,等等。字符串必须放在单引号中。另外,超过两个字符的字符等等。字符串必须放在单引号中。另外,超过两个字符的字符串只能用串只能用DB伪指令定义。请看下列语句:伪指令定义。请看下列语句:DATADB101,0F0H;存入65H,F0HEXPRDB2*8+7;存入17HSTRDBWELCOME! ;存入8个字符的ASCII码值ABDBAB;存入41H,42HBADWAB;存入42H,41HABDD DDAB;存入42H,41H,00,00OFFAB DWAB;存入变量AB的偏移地址ADRS DWSTR,STR3,STR5;存入3个偏移地址TOTAL DDDATA;先存DATA

63、的偏移地址,再存段地址DATA65F0EXPR17STR57454C434F4D45AB4142BA42410000OFFAB0A设设DATA的地址为的地址为1000:0200H设设DATA的地址为的地址为1000:0202H设设DATA的地址为的地址为1000:0203H设设DATA的地址为的地址为1000:020AH设设DATA的地址为的地址为1000:020CH相当于语句:相当于语句:OFFABDW020AH相当于语句:相当于语句:ADRSDW0203H,0206H,0205H相当于语句:相当于语句:TOTALDD0200H,1000H以上第一和第二句中,分别将常数和表达式的值赋予一个以

64、上第一和第二句中,分别将常数和表达式的值赋予一个变量。变量。第三句的操作数是包含第三句的操作数是包含8个字符的字符串个字符的字符串(只有只有DB伪指令伪指令才能用才能用)。在第四、五、六句,注意伪指令。在第四、五、六句,注意伪指令DB、DW和和DD的区的区别,虽然操作数均为别,虽然操作数均为AB两个字符,但存入变量的内容各不相两个字符,但存入变量的内容各不相同。第七句的操作数是变量同。第七句的操作数是变量AB,而不是字符串,此句将,而不是字符串,此句将AB的的16位偏移地址存入变量位偏移地址存入变量OFFAB。第八句存入三个等距的偏移地址,第八句存入三个等距的偏移地址,共占共占6字节。第九句中

65、的字节。第九句中的DD伪指令定义符将伪指令定义符将DATA的偏移地址的偏移地址和段地址顺序存入变量和段地址顺序存入变量TOTAL,共占,共占2个字。个字。除除了了常常数数、表表达达式式和和字字符符串串外外,问问号号“?”也也可可以以作作为为数数据据定定义义伪伪指指令令的的操操作作数数,此此时时仅仅给给变变量量保保留留相相应应的的存存储储单单元元,而而不不赋赋予予变变量某个确定的初量某个确定的初值值。当当同同样样的的操操作作数数重重复复多多次次时时,可可用用重重复复操操作作符符“DUP”表表示示,其形式其形式为为:nDUP(初初值值,初,初值值,)其中圆括号中为重复的内容,其中圆括号中为重复的内

66、容,n为重复次数。如果用为重复次数。如果用“nDUP(?)”作为数据定义伪指令定义符的惟一操作数,则汇编程序产生一作为数据定义伪指令定义符的惟一操作数,则汇编程序产生一个相应的数据区,但不赋任何初值。重复操作符个相应的数据区,但不赋任何初值。重复操作符“DUP”可以嵌可以嵌套。下面是用问号或套。下面是用问号或“DUP”表示操作数的几个例子:表示操作数的几个例子:FILLERDB?SUMDW?DW?,?,?BUFFERDB10DUP(?)ZERODW30DUP(0)MASKDB5DUP(OK!)ARRAYDB100DUP(3DUP(8),6)随机随机随机随机随机随机随机随机随机随机随机随机随机随

67、机随机随机随机随机随机随机随机随机共占共占1010个内存个内存单元单元00共占共占6060个内存个内存单元单元O!KO共重复共重复5 5组,占组,占1515个内存单元个内存单元共重复共重复100100组,占组,占400400个内存单元个内存单元8886888其中第一、第二句分别给字节变量其中第一、第二句分别给字节变量FILLER和字变量和字变量SUM分配分配存储单元,但不赋予特定的值。第三句给一个没有名称的字节存储单元,但不赋予特定的值。第三句给一个没有名称的字节变量赋予变量赋予3个不确定的值。第四句给变量个不确定的值。第四句给变量BUFFER分配分配10个字节个字节的存储空间,但不赋任何初值

68、。第五句给变量的存储空间,但不赋任何初值。第五句给变量ZERO分配一个分配一个数据区,共数据区,共30个字个字(即即60字节字节),每个字的内容均为零。第六句,每个字的内容均为零。第六句定义一个数据区,其中有定义一个数据区,其中有5个重复的字符串个重复的字符串OK!,共占,共占15字字节。最后一句将变量节。最后一句将变量ARRAY定义为一个数据区,其中包含重复定义为一个数据区,其中包含重复100次的内容:次的内容:8,8,8,6,共占,共占400个字节。个字节。通常把用通常把用DUP作作为为惟一操作数而定惟一操作数而定义义的的变变量称量称为为数数组组。下面是几个下面是几个错误错误的数据定的数据

69、定义伪义伪指令指令语语句:句:ERROR1:DW99;变变量名后有冒号量名后有冒号ERROR2DB25*90;DB的操作数超的操作数超过过255ERROR3DW1234;DW的操作数是超过的操作数是超过2个字个字;符的字符串;符的字符串例:例:DATA1DB?DATA2DW1000HDATA3DD3000A455HDATA4DB4DUP(0)DATA5DW0120H,0240H,0360H通过上述定义,在存储器中将产生如图通过上述定义,在存储器中将产生如图所示的结果,以所示的结果,以DATA1DATA1到到DATA5DATA5为例:为例: DS随机随机001055A40030000000002

70、00140026003DATA1DATA2DATA3DATA4DATA5DS544849532049532041204558414D504C45例:例:DATA6DBTHISISAEXAMPLEDATA6THISISAEXAMPLE 注意注意注意注意:1 1:数据定义语句数据定义语句在存储器中占有相应的单元在存储器中占有相应的单元, ,如上面语句中的第二句在程序运行时将会以如上面语句中的第二句在程序运行时将会以0000和和1010占据两中存储单元。而占据两中存储单元。而EQUEQU只是定义了一只是定义了一个数据,在汇编后以实际数据的形式体现在程个数据,在汇编后以实际数据的形式体现在程序序中中。

71、也也就就是是说说EQUEQU语语句句不不会会占占有有存存储储单单 元。元。2 2:EQUEQU可以用在指令中,而可以用在指令中,而数据定义语句数据定义语句不可以。不可以。二、表达式赋值语句二、表达式赋值语句 以以上上介介绍绍了了表表达达式式中中使使用用的的各各种种运运算算符符,如如果果一一个个表表达达式式同时具有多个运算符,则按以下规则运算:同时具有多个运算符,则按以下规则运算: 优先级高的先运算,优先级低的后运算。优先级高的先运算,优先级低的后运算。 优先级相同时按表达式中从左到右的顺序运算。优先级相同时按表达式中从左到右的顺序运算。 括号可以提高运算的优先级,括号内的运算总是在相邻括号可以

72、提高运算的优先级,括号内的运算总是在相邻的运算之前进行。的运算之前进行。 1.赋值语句赋值语句EQU 为为了了使使程程序序便便于于阅阅读读和和修修改改,我我们们有有时时使使用用一一个个符符号号来来代代表表一一个个数数,而而符符号号代代表表了了一一定定的的意意义义,在在程程序序中中使使用用一一个个符符号号代表一个数进行操作。代表一个数进行操作。格式格式:符号符号符号符号 EQU EQU EQU EQU 表达式表达式表达式表达式例如:例如: PORT EQU 3F8H PORT EQU 3F8H在程序中可使用在程序中可使用 MOV DX, PORT MOV DX, PORT 对对DXDX进行赋值,

73、实际上进行赋值,实际上PORTPORT就是一个常量。就是一个常量。还可在语句中进行运算,如:还可在语句中进行运算,如:DATA_PORTEQU3F8HSTAT_PORTEQU3F8H+2SEEDEQU10FUNCEQUSEED*SEED+2*SEED+1 2 2=(=(等号等号) ) 格式:格式: 名字名字= =表达式表达式 = ( = (等号等号) )伪指令的功能与伪指令的功能与EQUEQU伪指令基本相同,伪指令基本相同,主要区别在主要区别在于它可以对同一个名字重复定义于它可以对同一个名字重复定义。 例如:例如: COUNT=100MOV CX,COUNT;(CX)100COUNT=COUN

74、T10MOV BX,COUNT;(BX)90 注意注意注意注意:1 1:数据定义语句数据定义语句在存储器中占有相应的单元在存储器中占有相应的单元, ,如数据如数据定义语句中的定义语句中的DW 1000HDW 1000H在程序运行时将会以在程序运行时将会以0000和和1010占据两中存储单元。而占据两中存储单元。而EQUEQU只是定义了一个数据,在只是定义了一个数据,在汇编后以实际数据的形式体现在程序中。也就是说汇编后以实际数据的形式体现在程序中。也就是说EQUEQU语句不会占有存储单元。语句不会占有存储单元。2 2:EQUEQU可以用在指令中,而可以用在指令中,而数据定义语句数据定义语句不可以

75、。不可以。 3LABLE 格式:格式:名字名字LABLE类类型型LABLE伪伪指指令令的的用用途途是是定定义义标标号号或或变变量量的的类类型型。变变量量的的类类型型可可以以是是BYTE、WORD、DWORD等等;标标号号的的类类型型可可以以是是NEAR或或FAR。利用利用LABEL伪指令可以使同一个数据区兼有伪指令可以使同一个数据区兼有BYTE和和WORD两种属性,这样,在以后的程序中可根据不同的需要分两种属性,这样,在以后的程序中可根据不同的需要分别以字节或字为单位存取其中的数据。别以字节或字为单位存取其中的数据。例如:例如:AREAWLABELWORD;变量AREAW的类型为WORDARE

76、ABDB 100DUP(6) ;变量AREAB的类型为BYTEMOVAREAW,AX;AX送第1和第2字节中MOV AREAB49,AL;AL送第50字节中6666100个个6以以字字类型类型进行操作进行操作以以字节字节类型类型进行操作进行操作LABEL伪伪指指令令也也可可以以将将一一个个属属性性已已经经定定义义为为NEAR或或者者后后面跟有冒号面跟有冒号(隐隐含属性含属性为为NEAR)的的标标号再定号再定义为义为FAR。例如:。例如:AGAINFLABELFAR;定;定义标义标号号AGAINF的属性的属性为为FARAGAIN:PUSHAX;定;定义标义标号号AGAIN的属性的属性为为NEAR

77、上面的过程既可以利用标号上面的过程既可以利用标号AGAIN在本段内被调用,也可在本段内被调用,也可以利用标号以利用标号AGAINF被其他段调用。被其他段调用。远程(段间)调用远程(段间)调用使用该标号使用该标号近程(段内)调用近程(段内)调用使用该标号使用该标号两个标号都指向两个标号都指向指令指令PUSH AXPUSH AX三、段定义语句三、段定义语句段段定定义义伪伪指指令令的的用用途途是是在在汇汇编编语语言言源源程程序序中中定定义义逻逻辑辑段段。常常用的段定义伪指令有用的段定义伪指令有SEGMENT/ENDSSEGMENT/ENDS和和ASSUMEASSUME等等 。 1SEGMENTEND

78、S格式:格式:段名段名SEGMENT定位定位类类型型组组合合类类型型类别类别;逻辑段内容逻辑段内容段名段名ENDS功能:功能:将一个逻辑段定义成一个整体将一个逻辑段定义成一个整体段名段名逻辑段的标志符,不可省略,它确定了逻辑段在存逻辑段的标志符,不可省略,它确定了逻辑段在存储器中的地址,储器中的地址,SEGMENT和和.ENDS前的段名必须相同。前的段名必须相同。SEGMENT.ENDS段定义的伪指令助记符,任何一个段定义的伪指令助记符,任何一个逻辑段必须以逻辑段必须以SEGMENT开始,开始,ENDS结束,不可省略,且结束,不可省略,且必须成对出现,两者间为本逻辑段的内容。必须成对出现,两者

79、间为本逻辑段的内容。定位类型(定位类型(Align TypeAlign Type)定位类型参数是对该段起始地址定位。定位类型参数是对该段起始地址定位。*BYTE指定该段的起始地址定位在存储单元节的任指定该段的起始地址定位在存储单元节的任何字节地址。何字节地址。*WORD指定该段的起始地址定位在字的边界,即段指定该段的起始地址定位在字的边界,即段的首地址必须是偶数。的首地址必须是偶数。*PAGE指定该段的起始地址定位在页的边界,即段指定该段的起始地址定位在页的边界,即段的首地址必须是的首地址必须是256256的整倍数。的整倍数。*PARA指定定位段的起始地址必须在节的整数边界,指定定位段的起始地

80、址必须在节的整数边界,当定位类型参数缺省时,默认为当定位类型参数缺省时,默认为PARAPARA。例例:SEGMENT伪伪指令定指令定义义符的定位符的定位类类型型应应用用举举例。例。STACK SEGMENTSTACK;STACK段,定位段,定位类类型缺省型缺省DB100DUP(?);长长度度为为100字字节节STACKENDS;STACK段段结结束束DATA1 SEGMENTBYTE;DATA1段,定位段,定位类类型型BYTESTRINGDBThisisanexample! ;长长度度为为19字字节节DATA1ENDS ;DTAT1段结束段结束DATA2SEGMENTWORD;DATA2段,定

81、位段,定位类类型型WORDBUFFERDW40DUP(0);长度为;长度为40个字,即个字,即80字节字节DATA2ENDS;DATA2段段结结束束CODE1SEGMENTPAGE;CODE1段,定位段,定位类类型型PAGE;假;假设设CODE2段段长长度度为为13字字节节CODE1ENDS;CODE1段段结结束束CODE2SEGMENT;CODE2段,定位段,定位类类型缺省型缺省START:MOVAX,STACKMOVSS,AX;假;假设设CODE2段段长长度度为为52字字节节CODE2ENDS;CODE2段段结结束束 ENDSTART;源程序结束;源程序结束本本例例的的源源程程序序中中共共

82、有有五五个个逻逻辑辑段段,它它们们的的段段名名和和定定位位类类型型分分别别如下:如下:STACK段段PARADATA1段段BYTEDATA2段段WORDCODE1段段PAGECODE2段段PARA已已经经知知道道其其中中STACK段段的的长长度度为为100字字节节(64H),DATA1段段的的长长度度为为19字字节节(13H),DATA2段段的的长长度度为为40个个字字,即即80字字节节(50H)。假假设设CODE1段段占占用用13字字节节(0DH),CODE2段段占占用用52字字节节(34H)。如果将以上逻辑段进行汇编和连接,然后再来观察各逻辑段如果将以上逻辑段进行汇编和连接,然后再来观察各

83、逻辑段的目标代码或数据装入存储器的情况。由表的目标代码或数据装入存储器的情况。由表5.3可清楚地看出,可清楚地看出,当当SEGMENT伪指令的定位类型不同时,对段起始边界的规定伪指令的定位类型不同时,对段起始边界的规定也不相同。也不相同。上例各逻辑段的起始地址和结束地址上例各逻辑段的起始地址和结束地址段段名名定位定位类类型型字字节节数数起始地址起始地址结结束地址束地址STACKPARA100(64H)00000H00063HDATA1BYTE19(13H)00064H00076HDATA2WORD80(50H)00078H000C7HCODE1PAGE13(0DH)00100H0010CHCO

84、DE2PARA52(34H)00110H00143H组合类型(组合类型(Combine TypeCombine Type)各逻辑段之间的组合方式各逻辑段之间的组合方式*NONE该段与其它同名段不进行连接,各段独立存在该段与其它同名段不进行连接,各段独立存在与存储器中。与存储器中。 NONE NONE可作为缺省参数。可作为缺省参数。*PUBLIC该段与其它模块中的同名段连接该段与其它模块中的同名段连接 时,由低时,由低地址到高地址连接起来,组成一个逻辑段。地址到高地址连接起来,组成一个逻辑段。*COMMON该段在连接时与其它模块中的同名段有相该段在连接时与其它模块中的同名段有相同的起始地址,采用

85、覆盖的方式在存储器中存放,连接长度同的起始地址,采用覆盖的方式在存储器中存放,连接长度为各分段中最大长度。为各分段中最大长度。*AT表达式表达式定位该段的起始地址在表达式所指定的节定位该段的起始地址在表达式所指定的节(1616的整倍数)边界上。的整倍数)边界上。*STACK指定该段为堆栈段,不可缺省,多个模块只需指定该段为堆栈段,不可缺省,多个模块只需设置一个堆栈段,各个模块中堆栈段采用覆盖方式组合。设置一个堆栈段,各个模块中堆栈段采用覆盖方式组合。*MEMORY定位该段与其它模块的的同名段有相同的定位该段与其它模块的的同名段有相同的首地址,采用覆盖的方式在存储器中组合连接。首地址,采用覆盖的

86、方式在存储器中组合连接。分类名分类名(Class Class NameName) 分类名必须用单引号括起来,分类名可选择分类名必须用单引号括起来,分类名可选择4949个字符个字符的名称,用于汇编程序连接时将所有分类名相同的逻辑段组的名称,用于汇编程序连接时将所有分类名相同的逻辑段组成一个段组。成一个段组。例例如如,假假设设一一个个主主程程序序中中有有五五个个逻逻辑辑段段,段段名名和和类类别别名名分分别为别为:STK1段段STACKCODE1段段 无无DATA1段段BUFFERDATA2段段TABLEDATA3段段BUFFER还有一个子程序,包括四个逻辑段,段名和类别名分别为:还有一个子程序,包

87、括四个逻辑段,段名和类别名分别为:DATA4段段TABLEDATA5段段BUFFER STK2段段STACKCODE2段段 无无当当将将上上述述主主程程序序和和子子程程序序进进行行连连接接时时,两两个个程程序序模模块块中中各各逻辑逻辑段装入内存的段装入内存的顺顺序序见见下下图图。逻辑段按类别装入内存的示意图逻辑段按类别装入内存的示意图2. 段分配语句段分配语句ASSUME格式:格式:ASSUME ASSUME 段寄存器名:段名段寄存器名:段名 ,段寄存器名:段名,段寄存器名:段名,功能:功能:定义四个逻辑段,指明段和段寄存器的关系。定义四个逻辑段,指明段和段寄存器的关系。 ASSUME ASS

88、UME伪指令只指定某个段分配给哪个段寄存器,并将伪指令只指定某个段分配给哪个段寄存器,并将代码段的段基址自动装入代码段的段基址自动装入CSCS寄存器中,而不能自动把其它段寄存器中,而不能自动把其它段基址装入相应的段寄存器中,所以在代码段的开始要有一段基址装入相应的段寄存器中,所以在代码段的开始要有一段初始化程序完成这一工作。初始化程序完成这一工作。 对堆栈段来说,除了将段基址装入对堆栈段来说,除了将段基址装入SSSS寄存器外,还要将寄存器外,还要将栈顶偏移地址置入堆栈指示器栈顶偏移地址置入堆栈指示器SPSP中。中。例如:例如:CODE SEGMENTASSUMECS:CODE,DS:DATA1

89、,SS:STACKMOVAX,DATA1MOVDS,AX;给给DS赋值赋值MOVAX,STACKMOVSS,AX;给给SS赋值赋值CODE ENDS注:注:可以用可以用ASSUME NOTHING ASSUME NOTHING 取消前面由取消前面由ASSUMEASSUME所制定的所制定的 段寄存器。段寄存器。这三个端都是由这三个端都是由SEGMENT ENDSSEGMENT ENDS定义的段名。定义的段名。例:例:求出两个求出两个16位数位数M1和和M2的积的积DATA_SEGSEGMENTM1DW0058HM2DW012AHM3DW?M4DW?DATA_SEGENDSSTACK_SEGSEG

90、MENTS_DATADB100DUP(?)TOPEQULENGTHS_DATASTACK_SEGENDSCODE_SEGSEGMENTASSUMECS:CODE_SEG,DS:DATA_SEG,SS:STACK_SEGSTART:MOVAX,DATA_SEGMOVDS,AXMOVAX,STACK_SEGMOVSS,AXMOVAX,TOPMOVSP,AX58002A01DSM1M2M3M4STACK_SEGSEGMENTSTACKSTACKS_DATADB100DUP(?)STACK_SEGENDS汇编程序自动形成汇编程序自动形成SP,该语,该语句可以省略句可以省略MOVBX,OFFSETM1M

91、OVAX,BXMOVBX,OFFSETM2MULBXMOVBX,OFFSETM3MOVBX,AXMOVBX,OFFSETM4MOVBX,DXMOVAH,4CHINT21HDOCE_SEGENDSENDSTART从上述程序中,我们可总结出如下结论从上述程序中,我们可总结出如下结论从上述程序中,我们可总结出如下结论从上述程序中,我们可总结出如下结论:SEGMENT和和ENDS前前面面必必须须有有标标号号,而而且且在在相相互互配配对对的的段段,它它们们前前面面要要使使用用相相同同的的标标号号。对对于于不不同同的的段段定定义义标标号号,尽尽管管这这些些标标号号可可以以是是任任意意字字串串,但但为为了了

92、程程序序的的可可读读性性,应应使其有一定的意义。使其有一定的意义。ASSUME语语句句可可使使汇汇编编器器知知道道CS、DS、SS指指向向哪哪个个段段,但但它它只只在在汇汇编编时时起起作作用用,在在运运行行时时CPU并并不不知知道道除除CS外外的其它段地址,所以的其它段地址,所以必须在程序中用指令进行赋值必须在程序中用指令进行赋值。首首条条被被执执行行的的语语句句有有一一个个标标号号,用用以以标标出出这这个个程程序序的的开开始始执行处。执行处。(在程序的结尾处使用(在程序的结尾处使用END后跟这个标号后跟这个标号)。)。四、四、 过程定义语句过程定义语句 过过程程也也就就是是子子程程序序,所所

93、以以过过程程定定义义伪伪指指令令也也就就是是子子程程序序定义伪指令。定义伪指令。 格式:格式: 过程名过程名 PROC属性属性;过程内容;过程内容RETN 过程名过程名 ENDP 功能:功能:定义一个过程,程序中其他地方就可以用定义一个过程,程序中其他地方就可以用CALL指令指令 调用这个过程调用这个过程过程定义的伪指令过程定义的伪指令助记符,成对出现,助记符,成对出现,不可缺省。二者前不可缺省。二者前面的过程名是相同面的过程名是相同的。的。过程的内容包括过程的内容包括在在PROCENDP之内。之内。 过过程程名名实实质质上上是是过过程程入入口口的的符符号号地地址址,它它和和标标号号一一样样,

94、也也有有三三种种属属性性:段段属属性性、偏偏移移量量属属性性和和类类型型。过过程程的的类类型型属属性性可可以是以是NEARNEAR或或FARFAR。过程所在段的段基址过程所在段的段基址过程的第一个字节与段首过程的第一个字节与段首址之间的距离(字节)址之间的距离(字节)又称距离属性,又称距离属性,为为NEAR和和FAR。NEAR为段内调用,为段内调用,FAR为段间调用。为段间调用。 RETN一一般般来来说说,被被定定义义为为过过程程的的程程序序段段中中应应该该有有返返回回指指令令RETRET,但但不不一一定定是是最最后后一一条条指指令令,也也可可以以有有不不止止一一条条RETRET指指令令(在在

95、不不同同的的条条件件下下,从从不不同同的的出出口口返返回回)。执执行行RETRET指指令令后后,控控制制返返回回到到原原来来调调用用指指令令CALLCALL的的下下一一条条指指令令。N N为为弹弹出出值值,可可以以缺缺省省,N N表表示示从从过过程程返返回回后后,堆堆栈栈中中应应有有N N个个字字节节作作废废(以以栈栈顶顶开始),开始),N N必须为正偶数。必须为正偶数。过过程程和和其其它它程程序序可可定定义义在在同同一一个个段段中中,也也可可定定义义在在不不同同的段中。对过程的调用要使用的段中。对过程的调用要使用CALLCALL语句语句,如:,如:CALLPROC_NAME1CALLPROC

96、_NAME2注注:如如果果在在过过程程定定义义中中没没有有写写明明是是NEARNEAR过过程程或或FARFAR过过程程,则汇编器将这个过程默认为则汇编器将这个过程默认为NEARNEAR过程。过程。例:例:有一个过程有一个过程PROG_N,其定义如下:,其定义如下:PROG_NPROCNEARRETPROG_NENDP则执行则执行CALLPROG_N指令的过程可描述如下图。指令的过程可描述如下图。(设调用前:(设调用前:CS=2000H,IP=1050H,SS=5000H,SP=0100H,PROG_N与与CALL指令之间的距离为指令之间的距离为1234H)。)。E834125310返返回回地地

97、址址入入栈栈2000:10502000:10532000:22875000:0100原原SP=0100新新SP=00FE转转子子程程序序E8341253102000:10502000:10535000:0100新新SP=0100原原SP=00FE5000:00FE转转返返回回地地址址执行执行CALLPROG_N指令指令执行执行RET指令指令设在过程调用中需要三个字的参数,则可用下面的方法来设在过程调用中需要三个字的参数,则可用下面的方法来传递参数。传递参数。调用程序:调用程序: PUSH 参数参数1PUSH 参数参数2PUSH参数参数3CALL PROG_N过程程序:过程程序:PROG_NPR

98、OCNEARMOVBP,SP ;BP=00F8HRET6PROG_NENDP用用BPBP作指针来访作指针来访问堆栈段,则可问堆栈段,则可得到调用程序中得到调用程序中所给的三个参数。所给的三个参数。将通过堆栈传递的三个参将通过堆栈传递的三个参数所占的堆栈空间释放数所占的堆栈空间释放E834125310参数参数3参数参数2参数参数1返返回回地地址址入入栈栈2000:10502000:10532000:22875000:0100原原SP=0100新新SP=00F8转转子子程程序序E834125310参数参数3参数参数2参数参数12000:10502000:10532000:22875000:0100

99、新新SP=0100原原SP=00F8转转返返回回地地址址执行执行RET6指令指令执行执行CALL指指令前令前SP=00FA过程的定义和调用均可过程的定义和调用均可嵌套嵌套。例如:例如: NAME1PROCFARCALLNAME2RETNAME2PROCNEARRETNANE2ENDPNAME1ENDP五、五、 程序开始和结束语句程序开始和结束语句 1. NAME1. NAME NAMENAME伪伪指指令令用用于于给给源源程程序序汇汇编编以以后后得得到到的的目目标标程程序序指指定定一一个个程序名,连接时需要使用这个目标程序的名。程序名,连接时需要使用这个目标程序的名。格式:格式: NAME NA

100、ME 程序名程序名 NAMENAME的的前前面面不不允允许许再再加加上上标标号号,例例如如下下面面的的表表示示方方式式是是非非法法的:的:BEGINBEGIN:NAME MODNAMENAME MODNAME 如果程序中没有如果程序中没有NAMENAME伪指令,则汇编程序将伪指令,则汇编程序将TITLETITLE伪指令伪指令(TITLE(TITLE属于列表伪指令属于列表伪指令) )后面后面“标题名标题名”中的前六个字符作为模块中的前六个字符作为模块名。名。如果源程序中既没有使用如果源程序中既没有使用NAMENAME,也没有使用,也没有使用 TITLE TITLE伪指令,伪指令,则汇编程序将源程

101、序的文件名作为目标程序的模块名。则汇编程序将源程序的文件名作为目标程序的模块名。 2. ORG2. ORG 格式:格式:ORG表达式表达式功能:功能:给汇编程序设置位置指针,指定下面语句的启示给汇编程序设置位置指针,指定下面语句的启示偏移地址。偏移地址。例:例:CODE CODE SEGMENTSEGMENTASSUME CS:CODE,DS:DATAASSUME CS:CODE,DS:DATAORGORG100H100HSTART:START:MOVMOVAX,DATAAX,DATAMOVMOVDS,AXDS,AXCODECODEENDSENDS该指令的起始偏移地该指令的起始偏移地址为址为0

102、100H0100H例:例:DATA DATA SEGMENTSEGMENTORGORG200H200HDA1DA1DBDB10,20,3010,20,30ORGORG400H400HDA2DA2DWDW10,20,3010,20,30DATADATAENDSENDS变量变量DA1DA1的偏移地址的偏移地址为为0200H0200H变量变量DA2DA2的偏移地址的偏移地址为为0400H0400HDS:02000A141EDS:04000A0014001E00变量变量DA1的地的地址址变量变量DA0的地的地址址3. END3. END 格式:格式:END标号标号功能:功能:标记汇编程序结束。标记汇编

103、程序结束。END伪指令助记符,不可缺省,在原程序最后一行,伪指令助记符,不可缺省,在原程序最后一行,每个模块只有一个每个模块只有一个END,汇编程序到,汇编程序到END语句停止汇编。语句停止汇编。标号标号是该程序中第一条可执行语句的标号,可以缺是该程序中第一条可执行语句的标号,可以缺省。如果有多个模块连接在一起,则只有主模块的省。如果有多个模块连接在一起,则只有主模块的END语句语句使用标号。使用标号。以上几类伪指令语句是经常用到的,下面所介绍的伪指以上几类伪指令语句是经常用到的,下面所介绍的伪指令语句对于灵活的编程较为有用。自学。令语句对于灵活的编程较为有用。自学。4-4. DOS4-4.

104、DOS系统功能调用和系统功能调用和BIOSBIOS中断调用中断调用 当当我我们们编编写写的的汇汇编编语语言言源源程程序序是是在在DOSDOS环环境境下下运运行行时时,必必须须了解汇编语言是如何同了解汇编语言是如何同DOSDOS操作系统接口操作系统接口的。的。 当我们用编辑程序把源程序输入到机器中,用汇编程序把它当我们用编辑程序把源程序输入到机器中,用汇编程序把它转换为目标程序,用连接程序对其进行连接和定位时,操作系统转换为目标程序,用连接程序对其进行连接和定位时,操作系统为每一个用户程序建立了一个程序段前缀区为每一个用户程序建立了一个程序段前缀区PSPPSP,其长度为,其长度为256256个个

105、字节,主要字节,主要用于存放所要执行程序的有关信息用于存放所要执行程序的有关信息,同时,同时也提供了程也提供了程序和操作系统的接口序和操作系统的接口。操作系统在程序段前缀的开始处。操作系统在程序段前缀的开始处( (偏移地偏移地址址0000H)0000H)安排了一条安排了一条INT 20HINT 20H软中断指令。软中断指令。INT 20HINT 20H中断服务程序中断服务程序由由DOSDOS提供,执行该服务程序后,控制就转移到提供,执行该服务程序后,控制就转移到DOSDOS,即返回到,即返回到DOSDOS管理的状态。管理的状态。因此,用户在组织程序时,必须使程序执行完因此,用户在组织程序时,必

106、须使程序执行完后能去执行存放于后能去执行存放于PSPPSP开始处的开始处的INT 20HINT 20H指令,这样便返回到指令,这样便返回到DOSDOS,否则就无法继续键入命令和程序。,否则就无法继续键入命令和程序。汇编语言程序的执行过程:汇编语言程序的执行过程:编辑程序编辑程序.ASM文件文件汇编程序汇编程序.OBJ文件文件连接程序连接程序.EXE文件文件Edit等等MASMLINKDOSShellDOSKernelDOSBIOSDOS命令命令ROMBIOS显显示示器器卡卡盘盘控控制制卡卡串串行行口口卡卡键键盘盘接接口口打打印印机机卡卡应用层应用层DOS服务层服务层ROMBIOS服务层服务层硬

107、件控制层硬件控制层应用程序应用程序INT10HINT10HINT13HINT13HINT14HINT14HINT16HINT16HINT17HINT17HINT21HINT21H程序段前缀程序段前缀 PSP PSP汇编语言程序经过编译、连接后生成汇编语言程序经过编译、连接后生成.EXE.EXE文件;文件;该文件可在该文件可在PC-DOSPC-DOS支持下装入内存,并从程序中指定的地址处开始运行。支持下装入内存,并从程序中指定的地址处开始运行。这个工作由这个工作由PC-DOSPC-DOS的的 文件中的文件中的EXECEXEC来完成。来完成。 的工作的工作的工作的工作: 在装入这个文件之前,先在这

108、个程序段内偏移地址为在装入这个文件之前,先在这个程序段内偏移地址为0000H0000H处构造处构造一个一个100H100H字节的程序段前缀字节的程序段前缀PSPPSP(ProgramSegmentPrefix)控制块;控制块; 然后开始装载程序,并将控制权交给装入的指令。然后开始装载程序,并将控制权交给装入的指令。程序段前缀程序段前缀PSPPSP实际上是一个程序控制块,实际上是一个程序控制块,PC-DOS PC-DOS 建立这个建立这个程序控制块,并用它来管理程序的进程。程序控制块,并用它来管理程序的进程。PSPPSP结构为:结构为:结构为:结构为:偏移地址偏移地址偏移地址偏移地址分配情况分配

109、情况分配情况分配情况0001H指令指令INT20H(DOS中断中断程序终止退出)程序终止退出)0203H可利用的内存空间(以可利用的内存空间(以16字节为单位)字节为单位)04H保留保留0509H远调用指令远调用指令CALL功能入口功能入口0A0DH程序结束地址程序结束地址INT22H0E11HCTRL-BREAK出口地址出口地址INT23H1215H标准错误出口标准错误出口INT24H1622H保留保留2C5BHDOS专用专用5C6BHFCB1(文件控制块)格式化参数区(文件控制块)格式化参数区16C7BHFCB2格式化参数区格式化参数区27C7FH保留保留80FFH隐含的磁盘传输区(隐含的

110、磁盘传输区(DAT)PC-DOSPC-DOS通过通过程序段前缀程序段前缀PSPPSP来管理程来管理程序,因此,设序,因此,设计一个计一个.EXE.EXE文件的源程序文件的源程序时,需要依赖时,需要依赖 PSPPSP中的信息中的信息来构成一个完来构成一个完整的运行文件。整的运行文件。 DOSDOS在在建建立立了了程程序序段段前前缀缀区区PSPPSP之之后后,就就将将要要执执行行的的程程序序(加加载载. .EXEEXE文文件件时时)从从磁磁盘盘装装入入内内存存。在在定定位位程程序序时时,DOSDOS将将代代码码段段置置于于PSPPSP下下方方,代代码码段段之之后后是是数数据据段段,最最后后放放置置

111、堆堆栈栈段段。内内存存分分配配好好之之后后,DOSDOS就就设设置置段段寄寄存存器器DSDS和和ESES的的值值,以以使使它它们们指指向向PSPPSP的的开开始始处处,即即INT INT 20H20H的的存存放放地地址址,同同时时将将CSCS设设置置为为PSPPSP后后面面代代码码段段的的段段地地址址,IPIP设设置置为为指指向向代代码码段段中中第第一一条条要要执执行行的的指指令令位位置置,把把SSSS设设置置为为指指向向堆堆栈栈的的段段地地址址,让让SPSP指指向向堆堆栈栈段的栈底段的栈底( (取决于堆栈的长度取决于堆栈的长度) ),然后系统开始执行用户程序,然后系统开始执行用户程序。 为了

112、保证用户程序执行完后能返回到为了保证用户程序执行完后能返回到DOSDOS状态,可使用如状态,可使用如下两种方法。下两种方法。 标准方法标准方法首首先先将将用用户户程程序序的的主主程程序序定定义义成成一一个个FAR过过程程,其其最最后后一一条条指指令令为为RET。然然后后在在代代码码段段的的主主程程序序(即即FAR过过程程)的的开开始始部部分分用用如如下下三三条条指指令令将将PSP中中INT20H指指令令的的段段地地址址及及偏偏移移地地址址压压入入堆堆栈栈:PUSH DS;保;保护护PSP段地址段地址MOV AX,0;保;保护护偏移地址偏移地址0PUSHAX这样,当程序执行到主程序的最后一条指令

113、这样,当程序执行到主程序的最后一条指令RET时,由于时,由于该过程具有该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到属性,故存在堆栈内的两个字就分别弹出到CS和和IP,从而执行,从而执行INT20H指令,使控制返回到指令,使控制返回到DOS状态。例如状态。例如上面的多字节相加程序就是采用这种方法使控制返回到上面的多字节相加程序就是采用这种方法使控制返回到DOS状状态的态的(返回返回DOS的标志就是程序运行完后出现一个的标志就是程序运行完后出现一个DOS的标识符,的标识符,如如C)。CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFAR

114、;将本程序作为将本程序作为DOS操作系统的子程序操作系统的子程序。BEGIN:PUSHDSPUSHDSXORAX,AXXORAX,AXPUSHAXPUSHAX; ;标准程序前缀标准程序前缀标准程序前缀标准程序前缀MOVAX,DATAMOVDS,AXMOVES,AXRETRETSTARTENDPCODESEGMENTENDBEGIN这两组语句结合,实现这两组语句结合,实现应用程序运行后返回应用程序运行后返回DOS操作系统。操作系统。标准程序前缀标准程序前缀标准程序前缀标准程序前缀 在在PSPPSP的的0001H处,是一条处,是一条INT20H指令,即终止程序正常返指令,即终止程序正常返回回DOS

115、。 而要执行而要执行INT20H,必须保证,必须保证CSCS的值是的值是PSPPSP的段基址,的段基址,IPIP的值为的值为00000000故,通常在故,通常在.EXE文件的源程序的开始处都把文件的源程序的开始处都把PSPPSP的段基址保留在堆栈段的段基址保留在堆栈段的顶端,这样,当程序最后用的顶端,这样,当程序最后用RET指令返回时,将控制权交给指令返回时,将控制权交给PSPPSP段基址中的段基址中的INT20H,则一定能返回,则一定能返回DOS。所以,这个程序段叫标准程序前缀,放在代码段。所以,这个程序段叫标准程序前缀,放在代码段中程序的开始处。中程序的开始处。PUSHDSPUSHDSXO

116、RAX,AXXORAX,AXPUSHAXPUSHAXRETRET (IP) (SP+1),(SP)SPSP+2(CS)(SP+1),(SP)SP0y=f(x)=0x=0-1x0Y=0Y=1Y=-1YYNN框图如下框图如下开始开始(AX)=0?(AX)0?0FFHBX0BX1BXYJENJNS(AX)0(AX)0ZEROPLUSXAX并将AX的特征反映到FLAGNYDATASEGMENTXDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,XORAX,AXJEZEROJNSPLUSMOVBL,0FFHJ

117、MPHALTZERO:MOVBL,0JMPHALTPLUS:MOVBL,1HALT:MOVAH,4CHINT21HCODEENDSENDSTART在上面的程序中,要特别在上面的程序中,要特别注意其中的两处注意其中的两处JMP HALTJMP HALT的使用,从而保证每个分的使用,从而保证每个分支的完整性。支的完整性。例:例:在以在以BUF为首地址的内为首地址的内存,存放着一个长度为存,存放着一个长度为N(N39H(AL)41H(AL)5AHDH+1DL+1(CX)=0修改BX及(CX)-1NNNNNYYYYYADH送内存ADL送内存AL=N-DH-DLAL送内存RET初始化:N送CX;0送DX

118、;0送BX;BX为串偏移量,MOVAL,BUFBX0930H39HAZ41H5AH2、多分枝、多分枝有的分枝结构为多分枝,可依次测试条件是否满足,若满足有的分枝结构为多分枝,可依次测试条件是否满足,若满足条件则转入相应分枝入口,若不满足继续向下测试,直到全部条件则转入相应分枝入口,若不满足继续向下测试,直到全部测试完。简单,直观,速度慢。测试完。简单,直观,速度慢。例:有例:有8个加个加工子程序,入工子程序,入口地址分别为口地址分别为P1,P2,P8。编程实现。编程实现检测键盘输入检测键盘输入命令,使系统命令,使系统分别转向分别转向8个个加工子程序。加工子程序。MOVAH,1INT21H;1号

119、功能调用,键盘输入号功能调用,键盘输入CMPAL,1JEP1;键值为;键值为1,转,转P1CMPAL,2JEP2;键值为;键值为2,转,转P2CMPAL,8JEP8;键值为;键值为8,转,转P8JMPST;非法键,转停机;非法键,转停机P1:;1号键加工子程序号键加工子程序P2:;2号键加工子程序号键加工子程序P8:;8号键加工子程序号键加工子程序ST:HLT局限性?3、跳转表实现多分枝、跳转表实现多分枝利用跳转表实现多分枝,可以直接找到相应入口,利用该法需建立利用跳转表实现多分枝,可以直接找到相应入口,利用该法需建立一个跳转表,表中含每个分枝的入口地址。一个跳转表,表中含每个分枝的入口地址。

120、(1)根据表内地)根据表内地址分枝址分枝跳转表中存放了跳转表中存放了每个分枝程序的每个分枝程序的入口地址,只要入口地址,只要找到表地址,再找到表地址,再将其内容取出,将其内容取出,即可得到每个分即可得到每个分枝程序的入口地枝程序的入口地址。址。表地址表地址=跳转表首跳转表首址址+偏移地址偏移地址输入键值输入键值开始开始表首地址表首地址BX求偏移量求偏移量计算地址计算地址散转散转ANDAL,0FHADDAL,ALADDBX,AXJMPWORDPTRBX跳转表在内存中跳转表在内存中的存放方法的存放方法P0LP0HP1LP1H.BASE+0BASE+2P0P1MOVBX,OFFSETBASE跳转表中

121、存放着转移指令,查表后程序执行转移指令将转到相应的子程序去。跳转表中存放着转移指令,查表后程序执行转移指令将转到相应的子程序去。P1LP1HP2LP2HBASE.P1P2JMPJMPMOVAH,1;键入到;键入到ALINT21HANDAL,0FHMOVAH,0MOVBL,ALADDAL,ALADDAL,BL;偏移量;偏移量=键值键值*3MOVBX,OFFSETBASEADDBX,AX;得转移地址;得转移地址JMPBX;转入转移指令;转入转移指令(2)根据表内指令分支)根据表内指令分支转移指令跳转表转移指令跳转表(3)根据关键字分枝)根据关键字分枝P1LP1HP2LP2HBASE.P1P2313

122、2输入关键字输入关键字开始开始首地址送首地址送BX与关键字比较与关键字比较指针加指针加3转移转移关键字关键字=0相等相等YYNN关键字跳转表关键字跳转表分枝流程图分枝流程图跳转表中存放关键字及相应分枝地址。跳转表中存放关键字及相应分枝地址。例4:首地址为BUFFER的数组已按升序排好,长度为N(=10),在数组中查找数M(=80),若找到则从数组中删掉,否则将它插入正确的位置,DX中记录数组最后的长度。9810253698908270585348AXCX=9AXCX=8AXCX=7AXCX=6AXCX=5AXCX=4AXCX=3AXCX=2AXCX=1AXCX=0AX=80CX=10DX=10

123、AXBUFFERSI9082AXBUFFERSI-2AXBUFFERSI-280DX=11AXBUFFERSI-2数组中无M寻找插入位置SI=2*(DX1)CMPAX,BUFFERSI搜索有无关键字MOVDI,OFFSETBUFFERCLDREPNESCASW元素下移MOVBX,BUFFERSIMOVBUFFERSI+2,BX插入MOVBUFFERSI+2,AX10253698908070585348AXCX=9DI=BUFFER+2AXCX=8DI=BUFFER+4AXCX=7DI=BUFFER+6AXCX=6DI=BUFFER+8AXCX=5DI=BUFFER+AAXCX=4DI=BUFF

124、ER+CAXCX=3DI=BUFFER+EAX=CX=2DI=BUFFER+10HAX=80CX=10DI=BUFFER9098BX=DI=(BUFFER+10H)DI-2CX-1=1BX=DI+2=(BUFFER+12H)DI-2CX-1=0DX=9数组中有数M搜索有无关键字MOVDI,OFFSETBUFFERCLDREPNESCASW搜索到,后续元素前移MOVBX,DIMOVDI-2,BXADDDI,2初始化串扫描查找找到插在SI所指单元后关键字SI(CX)=0数组元素下移修改比较指针SI数组长度+1设置串尾比较指针SIDI所指元素上移修改比较指针DINYYNY数组长度-1(CX)-1=0

125、YNN结束初始化:M送AX;N送CX,DX;地址偏移量送DI;增量修改指针CLDDATASEGMENTBUFFERDW5,10,32,47,53,77,89,106,115,124NDB10MEQU80DATAENDSCODESEGEMENTASSUMECS:CODE,DS:DATA,ES:DATAMAINPROCFARSTART:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AX;MOVAX,M;待查数送AXMOVCX,N;数组长度送CXMOVDX,NMOVDI,OFFSETBUFFERCLDREPNESCASW;串扫描查找JEDEL;查到,ZF=1

126、DECDX;未查到,插入MOVSI,DX;关键字与最后数比较ADDSI,DXL1:CMPAX,BUFFERSIJLL2;关键字比数组中某个字小,转L2MOVBUFFERSI+2,AX;大,则插在后面JMPL3L2:MOVBX,BUFFERSI;数组下移一位MOVBUFFERSI+2,BXSUBSI,2JMPL1L3:ADDDX,;修改长度JMPNEXT1DEL:JCXZNEXT;找到,删此元素DEL1:MOVBX,DI;其后元素依次前移MOVDI-2,BXADDDI,2LOOPDEL1NEXT:DECDX;改变数组长度NEXT1:RETMAINENDPCODEENDSENDSTART三、循环程

127、序结构三、循环程序结构 对于程序中多次、有规律执行的部分,我们通常使用循环结对于程序中多次、有规律执行的部分,我们通常使用循环结构重复运行这些部分,使程序有较高的运行效率和可读性。循环构重复运行这些部分,使程序有较高的运行效率和可读性。循环结构主要由三部分组成,它们是:结构主要由三部分组成,它们是:. . 循循循循环环环环初初初初值值值值:用用于于设设置置开开始始循循环环时时,循循环环体体所所处处的的初初始始状状态,如循环变量初值,循环体中用到的数据和地址指针等。态,如循环变量初值,循环体中用到的数据和地址指针等。 . . 循循循循环环环环体体体体:重重复复运运行行的的部部分分,其其中中还还包

128、包含含了了工工作作部部分分和和循循环环控控制制部部分分。工工作作部部分分进进行行相相应应的的操操作作,而而循循环环控控制制部部分分则则保保证证在不满足循环条件时,跳出循环。在不满足循环条件时,跳出循环。 . . 循循循循环环环环结结结结束束束束条条条条件件件件:在在循循环环体体中中包包括括了了循循环环结结束束条条件件运运算算部部分分。每每循循环环一一次次除除了了工工作作部部分分进进行行相相应应的的操操作作外外,循循环环条条件件部部分分还还要要通通过过运运算算,得得出出当当前前循循环环的的状状态态,以以便便在在适适当当的的条条件件下下结结束束循环。循环。 循环结束判断:循环结束判断:每一次循环要

129、有每一次循环要有二个出口。根据循环工作调整的情二个出口。根据循环工作调整的情况,判断是否满足结束条件。若满况,判断是否满足结束条件。若满足结束条件,退出循环;若不满足足结束条件,退出循环;若不满足结束条件,继续循环。结束条件,继续循环。循环体:循环体:重复执行的一段程序。重复执行的一段程序。循环工作部分:循环工作部分:循环程序的核心。循环程序的核心。循环工作调整:重复执行的环境调整。循环工作调整:重复执行的环境调整。循环初始化:循环初始化:循环程序工作单元的初始化赋值。循环程序工作单元的初始化赋值。N循环结束判断循环结束判断结结束束循循环环体体循环工作部分循环工作部分循环工作调整循环工作调整循

130、环初始化循环初始化DATASEGMENTSUMDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARBEGIN:PUSHDSXORAX,AXPUSHAX;标准程序前缀;标准程序前缀MOVAX,DATAMOVDS,AXMOVCX,10MOVAX,0AGAIN:ADDAX,CXLOOPAGAINMOVSUM,AXRETSTARTENDPCODEENDSENDBEGIN该该程程序序是是一一个个以以计计数数器器为为循循环环条条件件的的循循环环结结构构,是是循循环中常见的结构之一。环中常见的结构之一。例:例:求求1-10的累加和。的累加和。DATA

131、SEGMENTSTRDBTHISISASTRING$LENDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARBEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVCX,0LEABX,STRAGAIN:MOVAL,BXCMPAL,$JZHALTINCCXINCBXJMPAGAIN上上述述程程序序是是一一个个以以控控制制条条件件为为循环条件的循环结构。循环条件的循环结构。HALT:MOVLEN,CXRETSTARTENDPCODEENDSENDBEGIN例:有一以例:有一以“$”结束的字串,请求出它的

132、长度。结束的字串,请求出它的长度。例:设有例:设有数组数组Xx1,x2,x3,x10,数组数组Yy1,y2,y3,y10,试编程计算试编程计算z1=x1-y1z2=x2+y2z3=x3-y3z4=x4+y4z5=x5-y5z6=x6-y6z7=x7+y7z8=x8-y8z9=x9-y9z10=x10-y10开始开始初始化:设逻辑尺,初始化:设逻辑尺,地址指针,循环次数地址指针,循环次数i=0测试逻辑尺第测试逻辑尺第i位的值位的值=0?Xi-yiXi+yiZi结果结果i=0),N!=N*(N-1)*(N-2)*1N!=1,N=0;N!=N*(N-1)!N!子程序说明:名称:FACT:功能:N!:

133、入口参数:AL=N:出口参数:DX=N!:使用寄存器:CX主程序:DATASEGMENTD1DB6D2DW2DUP(?)DATAENDSMOVBX,OFFSETD1MOVAL,BXCALLFACTMOVBX+1,DX子程序FACT:AL=0DL=1RETYAX入栈AL-1送ALCALLFACTAX出栈AL*DL送AXAX送DX后返回N五、综合举例(自学)五、综合举例(自学)码转换程序设计码转换程序设计码转换程序设计码转换程序设计 输入输出设备以输入输出设备以ASC码表示字符、数字;码表示字符、数字; 在机器内部,以二进制(十六进制)表示在机器内部,以二进制(十六进制)表示 ; 我们习惯使用十进

134、制数。我们习惯使用十进制数。 因此需进行数制的转换。因此需进行数制的转换。 例例1:将:将BX寄存器中的二进制数以十六进制的形式在显示器上显示寄存器中的二进制数以十六进制的形式在显示器上显示出来。出来。CodesegmentMainprocfarassumecs:codeBegin:pushdsxorax,axpushaxmovch,4movcl,4Rotate:rolbx,clmoval,blandal,0fhaddal,30hcmpal,3ahjlprintfaddal,7hPrintf:movah,2movdl,alint21hDecchJnzrotateRetMainendpCodee

135、ndsendbeginBX101011000101100100001111110001011001101000001010例例2:将二进制数串转换成:将二进制数串转换成ASC码,并在屏幕上显示。码,并在屏幕上显示。DatasegmentNumdw4f78h;0100111101111000Stringdb16dup(?)DataendsCodesegmentassumecs:code,ds:dataStartprocfarBegin:pushdsmovax,0pushaxmovax,datamovds,axleadi,stringmovcx,lengthstringpushdipushcxmo

136、val,30hrepstosbpopcxpopdimoval,31hmovbx,numagain:rolbx,1jncnextmovdi,alnext:incdiloopagainleadi,stringmovcx,lengthstringmovah,2rotate:movdl,diint21hincdilooprotateretstartendpcodeendsendbegin例例3:从键盘输入十进制数从键盘输入十进制数n(ASC表示表示),进行),进行n+180的运算后,在显的运算后,在显示器上输出(示器上输出(ASC)。)。需要进行的转换:需要进行的转换:需要进行的转换:需要进行的转换:

137、ASC码转换为码转换为BCD码码BCD码转换为二进制数码转换为二进制数用于计算用于计算二进制数转换为二进制数转换为BCD码码BCD码转换为码转换为ASC码码JlexitCmpal,9JgexitMovbx,alIncbxLoopagainjmpnextExit:jmpexit1DatasegmentNbcddb4dup(?);保存键盘输入后转换的;保存键盘输入后转换的BCD码码Resultdb5dup(?);保存二进制计算后转换的;保存二进制计算后转换的BCD码码DataendsCodesegmentassumecs:code,ds:dataMainprocfarBegin:pushdsxor

138、ax,axpushaxMovax,dataMovds,axLeabx,NbcdMovcx,4Again:Movah,1;DOS功能调用功能调用键盘输入,输入的字符放在键盘输入,输入的字符放在al寄存器中寄存器中Int21hSubal,30h将输入的十进制将输入的十进制数的数的ASC码转换成码转换成BCD码码 IncbxShlax,1;(千位千位*10+百位百位)*10+十位十位)*10Movcx,axShlax,1Shlax,1Addax,cxMovdl,bxAddax,dx;(千千位位*10+百百位位)*10+十十位位)*10+个个位位 将将BCD码转换成码转换成二进制数二进制数Addax,

139、180;计算计算Next:leabx,NbcdMovah,0Moval,bxIncbxShlax,1;千位千位*10Movcx,axShlax,1Shlax,1Addax,cxMovdh,0;千位千位*10+百位百位Movdl,bxAddax,dxIncbxShlax,1;(千位千位*10+百位百位)*10Movcx,axShlax,1Shlax,1Addax,cxMovdl,bx;(千位千位*10+百位百位)*10+十位十位Addax,dxLeabx,resultMovdl,0;计算;计算ax中含有中含有Again1:Subax,10000;10000的个数的个数Jsnext1IncdlJm

140、pagain1Next1:Movbx,dlIncbxaddax,10000movdl,0;计算;计算ax中含有中含有Again2:subax,1000;1000的个数的个数jsnext2incdljmpagain2Next2:movbx,dlincbxaddax,1000movdl,0;计算计算ax中含有中含有Again3:Subax,100;100的个数的个数Jsnext3IncdlJmpagain3Next3:Movbx,dlIncbxaddax,100movdl,0;计算计算ax中含有中含有gaain4:subax,10;10的个数的个数jsnext4incdljmpagain4next

141、4:movbx,dlincbxaddax,10movbx,al;al中剩下的中剩下的;即为个位数即为个位数 将二进制计算结将二进制计算结果转换成果转换成BCD码码Movah,2Movdl,0dhInt21h;DOS功能调用,将功能调用,将dl寄存器中的字符在显示器上显示出来寄存器中的字符在显示器上显示出来Movdl,0ahInt21hLeabx,resultMovcx,5Cycle:Movdl,bxAdddl,30hInt21hIncbxLoopCycleExit1:retMainendpCodeendsendbegin将将BCD码转换成码转换成ASC码,并在屏码,并在屏幕上显示出来幕上显示出

142、来DatasegmentNumdb5dup(?)DataendsCodesegmentassumecs:code,ds:dataStartprocfarBegin:pushdsmovax,0pushaxmovax,datamovds,axleasi,nummovax,bxmovbx,10movcx,1例例4:在:在BX中有一个中有一个16位无符号数,把它们转换为相应的位无符号数,把它们转换为相应的BCD码,放到自码,放到自Data开始的存储区中(每一位开始的存储区中(每一位BCD码占一个存储单元,高位在前)。码占一个存储单元,高位在前)。First:xordx,dxdivbxpushdxcmp

143、ax,0jzsecondinccxjmpfirstSecond:popaxmovsi,alincsiloopsecondStartendpCodeendsendbegin将二进制数转换成将二进制数转换成BCD码的另一种方法码的另一种方法4 4 宏汇编和条件汇编宏汇编和条件汇编一、宏汇编一、宏汇编1宏定义伪指令(MACRO/ENDM)格式:宏指令名MACRO(宏定义体)ENDMMACRO是是宏宏定定义义符符,它它将将一一个个宏宏指指令令名名定定义义为为宏宏定定义义体体中中包包含含的的程程序序段段。ENDM表表示示宏宏定定义义结结束束,前前面面不不需需要要有有宏宏指指令令名名。进进行行一一次次宏宏

144、定定义义,以以后后就就可可以以多多次次用用宏宏指指令令名名进进行行宏宏调调用用。但是必但是必须须先定先定义义,后,后调调用。用。当当汇汇编编时时,MASM对对每每个个宏宏指指令令名名,自自动动用用相相应应宏宏定定义义体体中中的的程程序序段段代代替替,这这个个过过程程称称为为宏宏扩扩展展。总总之之,使使用用宏宏指指令令的的过过程程共共有有三三步步:首首先先进进行行宏宏定定义义;然然后后进进行行宏宏调调用用;最最后后,汇汇编时编时由由MASM进进行宏行宏扩扩展。展。宏定义允许嵌套,即宏定义体中可以包含另一个宏定义,宏定义允许嵌套,即宏定义体中可以包含另一个宏定义,而且宏定义体中也可以有宏调用,但是

145、也必须先定义,后调用。而且宏定义体中也可以有宏调用,但是也必须先定义,后调用。例例:若若源源程程序序中中多多处处需需要要将将BL和和CL寄寄存存器器中中两两个个压压缩缩的的BCD数数相相加加,并并将将和和送送回回BL寄寄存存器器,则则可可如如下下定定义义宏宏指指令令,然然后在需要的地方后在需要的地方进进行行调调用。用。BCDADDMACROMOVAL,BLADDAL,CLDAAMOVBL,ALENDM宏宏定定义义允允许许带带参参数数,此此时时可可定定义义的的宏宏指指令令具具有有较较强强的的通通用用性性。带带参数的宏定参数的宏定义义格式如下所示:格式如下所示:宏指令名宏指令名MACRO参数参数,

146、参数,参数,(宏定宏定义义体体)ENDM以上宏定义中的参数称为以上宏定义中的参数称为形式参数形式参数(dummyparameter),或称,或称哑元哑元。当形式。当形式参数不止一个时,相互之间要用逗号分开。以后参数不止一个时,相互之间要用逗号分开。以后宏调用宏调用时,应在宏指令名后面时,应在宏指令名后面写上相应的写上相应的实际参数实际参数(ActualParameter),或称,或称实元实元。一般情况下,实际参数。一般情况下,实际参数与形式参数的个数和顺序均为一一对应的。但是,汇编程序允许二者的个数不与形式参数的个数和顺序均为一一对应的。但是,汇编程序允许二者的个数不等。当实际参数多于形式参数

147、时,多余的实际参数将被忽略;当形式参数多于等。当实际参数多于形式参数时,多余的实际参数将被忽略;当形式参数多于实际参数时,认为多余的形式参数为空。实际参数时,认为多余的形式参数为空。例:例:DECADD1MACROOPR1,OPR2MOVAL,OPR1ADDAL,OPR2DAAMOVOPR1,ALENDM利利用用本本例例中中的的宏宏定定义义可可对对分分别别存存放放在在任任何何8位位寄寄存存器器或或存存储储单单元中的两个元中的两个压缩压缩BCD数数进进行加法运算。例如有以下宏行加法运算。例如有以下宏调调用:用:DECADD1DL,BUFFERDECADD1AREA1,AREA2汇编时进行宏扩展,

148、得到以下指令:汇编时进行宏扩展,得到以下指令:DECADD1DL,BUFFER扩扩展展为为:MOVAL,DL ADDAL,BUFFER DAA MOVDL,ALDECADD1AREA1,AREA2扩展为: MOVAL,AREA1 ADDAL,AREA2 DAA MOVAREA1,AL宏扩展后,原来宏定义体中的指令前面加上了符号“+”,以示区别。 2声明宏体内局部标号的伪指令声明宏体内局部标号的伪指令(LOCAL)LOCAL的的作作用用是是声声明明宏宏体体中中的的局局部部标标号号,以以免免在在宏宏扩扩展展时时,同同一一个个标标号号在在源源程程序序中中多多次次出出现现,从从而而产产生生标标号号多多

149、重重定定义义的的错错误误。LOCAL伪伪指指令令必必须须位位于于宏宏体体内内其其他他所所有有语语句句(包包括括注注释释)之之前前,其格式其格式为为:LOCAL局部局部标标号号,例如,下面的宏指令完成将寄存器中的一位十六进制数转换例如,下面的宏指令完成将寄存器中的一位十六进制数转换为相应的为相应的ASCII码,由于宏体中出现局部标号,因此必须使用码,由于宏体中出现局部标号,因此必须使用LOCAL伪指令对宏体中的局部标号进行声明。伪指令对宏体中的局部标号进行声明。HEXTOASC MACROREGLOCALNUMCMPREG,0AHJCNUMADDREG,07HNUM:ADDREG,30HENDM

150、 宏指令与子程序的区别宏指令与子程序的区别宏宏指指令令是是用用一一条条指指令令来来代代替替一一段段程程序序以以简简化化源源程程序序的的设设计计,子子程程序序(过过程程)也也有有类类似似的的功功能能。宏宏指指令令与与子子程程序序的的区区别别主主要要表表现现在以下几方面:在以下几方面:(1)宏宏指指令令由由宏宏汇汇编编程程序序MASM在在汇汇编编过过程程中中进进行行处处理理,在在每每个个宏宏调调用用处处,将将相相应应的的宏宏体体插插入入;而而子子程程序序调调用用指指令令CALL和和返返回回指指令令RET则则是是CPU指指令令,执执行行CALL指指令令时时,CPU使使程程序的控制序的控制转转移到子程

151、序的入口地址。移到子程序的入口地址。(2)宏宏指指令令简简化化了了源源程程序序,但但不不能能简简化化目目标标程程序序。汇汇编编以以后后,在在宏宏定定义义处处不不产产生生机机器器代代码码,但但在在每每个个宏宏调调用用处处,通通过过宏宏扩扩展展,宏宏体体中中指指令令的的机机器器代代码码被被插插入入到到宏宏调调用用处处,因因此此不不节节省省内内存存单单元元;对对于于子子程程序序来来说说,在在目目标标程程序序中中定定义义子子程程序序的的地地方方将将产产生生相相应应的的机机器器代代码码,但但每每次次调调用用时时,只只需需用用CALL指指令令,不不再再重重复复出出现现子子程序的机器代程序的机器代码码,一般

152、来,一般来说说可以可以节节省内存省内存单单元。元。(3)从从执执行行时时间间来来看看,调调用用子子程程序序和和从从子子程程序序返返回回需需要要保保护护断断点点、恢恢复复断断点点等等,这这些些都都将将额额外外占占用用CPU的的时时间间,而而宏宏指指令令则则不需要,因此相不需要,因此相对对来来说说,它的,它的执执行速度行速度较较快。快。此外,宏指令更加接近高级语言,而且传送参数更加方便。此外,宏指令更加接近高级语言,而且传送参数更加方便。二、条件汇编二、条件汇编条件汇编是对给定的条件进行测试,汇编程序根据测条件汇编是对给定的条件进行测试,汇编程序根据测试结果,将一段程序嵌入源程序汇编或者不进行汇编

153、,试结果,将一段程序嵌入源程序汇编或者不进行汇编,它的格式为:它的格式为:IF条件条件(指令体(指令体1);条件为真汇编指令体;条件为真汇编指令体1ELSE (指令体指令体2);条件为假汇编指令体;条件为假汇编指令体2ENDIF注:注:IFENDIF条件汇编伪指令助记符,成对出现,条件汇编伪指令助记符,成对出现,不可省略。不可省略。习题解答习题解答P206题题11MOVAH,1INT21H ;1号功能调用,键盘输入号功能调用,键盘输入CMPAL,0JEP0;键值为;键值为1,转,转P1CMPAL,1JEP1;键值为;键值为2,转,转P2CMPAL,5JEP5;键值为;键值为5,转,转P5JMP

154、ST;非法键,转停机;非法键,转停机P0:;0号键加工子程序号键加工子程序JMPSTP1:;1号键加工子程序号键加工子程序JMPSTP5:;5号键加工子程序号键加工子程序JMPSTST:HLT跳转表实现多分枝跳转表实现多分枝利用跳转表实现多分枝,可以直接找到相应入口,利用该法需建立利用跳转表实现多分枝,可以直接找到相应入口,利用该法需建立一个跳转表,表中含每个分枝的入口地址。一个跳转表,表中含每个分枝的入口地址。(1)根据表内地)根据表内地址分枝址分枝跳转表中存放了跳转表中存放了每个分枝程序的每个分枝程序的入口地址,只要入口地址,只要找到表地址,再找到表地址,再将其内容取出,将其内容取出,即可

155、得到每个分即可得到每个分枝程序的入口地枝程序的入口地址。址。表地址表地址=跳转表首跳转表首址址+偏移地址偏移地址输入键值输入键值开始开始表首地址表首地址BX求偏移量求偏移量计算地址计算地址散转散转ANDAX,0FHADDAL,ALADDBX,AXJMPWORDPTRBX跳转表在内存中跳转表在内存中的存放方法的存放方法P0LP0HP1LP1H.BASE+0BASE+2P0P1MOVBX,OFFSETBASE习题解答习题解答P206题题11BASEDWP0,P1,P2,P3,P4,P5MOVAH,1INT21H ;1号功能调用,键盘输入号功能调用,键盘输入MOVBX,OFFSETBASEANDAX

156、,0FHSHLAL,1ADDBX,AXJMPWORDPTRCS:BXP0:;0号键加工子程序号键加工子程序JMPSTP1:;1号键加工子程序号键加工子程序JMPSTP5:;5号键加工子程序号键加工子程序JMPSTST:HLT跳转表中存放着转移指令,查表后程序执行转移指令将转到相应的子程序去。跳转表中存放着转移指令,查表后程序执行转移指令将转到相应的子程序去。P0LP0HP1LP1HBASE.P0P1JMPJMPMOVAH,1;键入到;键入到ALINT21HANDAL,0FHMOVAH,0MOVBL,ALADDAL,ALADDAL,BL;偏移量;偏移量=键值键值*3MOVBX,OFFSETBAS

157、EADDBX,AX;得转移地址;得转移地址JMPBX;转入转移指令;转入转移指令BASE: JMPP0JMPP1JMPP5(2)根据表内指令分支)根据表内指令分支转移指令跳转表转移指令跳转表习题解答习题解答P206题题13DATASEGMENTBUFDB5,0,5DUP(?)SW DW?DATAENDSCODESEGMENTBEGINPROCFARASSUMECS:CODE,DS:DATASTART:PUSH DSSUBAX,AXPUSHAXMOV AX,DATAMOV DS,AXMOV DX,OFFSETBUF;10号功能号功能调调用,用,键键入入4位十位十进进制数制数MOVAH,10INT

158、21HMOVAX,WORDPTRBUF+4;键键入数的个位和十位送入数的个位和十位送AXAND AX,0F0FH;将两个;将两个ASCII码转为非压缩码转为非压缩BCD数数BUF54BUF+23132BUF+433340D若键入若键入11,22,33,44键,键,然后按然后按ENTERENTER,则内,则内存中的数据为存中的数据为MOVCL,4SHLAL,CL;将十位移至;将十位移至AL的高的高4位位ORAL,AH;十位和个位拼合在;十位和个位拼合在AL中中MOVBYTEPTRSW,AL;存;存BCD数的十位和个位数的十位和个位MOVAX,WORDPTRBUF+2;键键入数的百位和千位送入数的

159、百位和千位送AXANDAX,0F0FH;将两个;将两个ASCII码转为码转为非非压缩压缩BCD数数SHLAL,CL ;将千位移至;将千位移至AL的高的高4位位ORAL,AH;千位和百位拼合在;千位和百位拼合在AL中中MOVBYTEPTRSW+1,AL;存;存BCD数的千位和百位数的千位和百位RETBEGINENDPCODEENDSENDSTARTDATASEGMENTSTRINGDB10DUP(?)BUFIN DB05H,?;20H为设置长度,?为实际输入长度DB05HDUP(?) ;实际输入的字符串存放区DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:

160、DATASTART PROCFARBEGING:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXMOVES,AX;定义使用DS,ES将将DSDS和和0000H0000H压入堆栈,压入堆栈,DS:0000HDS:0000H,0001H0001H处的指令码为处的指令码为0CDH, 20H(INT 20H)0CDH, 20H(INT 20H)给段寄存器赋值给段寄存器赋值LEADX,BUFINMOVAH,0AHINT21H;从键盘输入字符串至BUFINMOVCL,BUFIN1;键盘实际输入字符个数ORCL,CLJZDONELEASI,BUFIN2MOVBX,16MOVAL,SIANDAL,0FHMULBLINCSIDECCLJZDISPMOVDX,AXMOVAL,SIANDAL,0FHMULBLADDAX,DX将键盘实际输入的字节数送将键盘实际输入的字节数送AXAX等待键盘输入字符串。等待键盘输入字符串。CALLB2TOBCD;P189CALLDISP;P188DONE:RETSTART ENDPCODEENDSENDBEGIN返回返回DOSDOS操作系统操作系统

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号