当前位置:文档之家› 第四章 MASM-86宏汇编语言程序

第四章 MASM-86宏汇编语言程序

第四章 MASM-86宏汇编语言程序
第四章 MASM-86宏汇编语言程序

第四章MASM-86宏汇编语言程序

在上一章里,我们详细学习了8086的指令系统,但仅仅了解了8086的每一条指令的功能和格式还不够,还不能写出汇编语言的程序,因为一种编程语言还有其他一些语法上的规定。本章就是介绍这样的语法规定,包括汇编语言程序的结构和规范,及伪指令的用法。

4.1汇编语言和汇编程序

一汇编语言( Assembly Language)

编程语言是分层次的,这一点我们在第一章就已经介绍过了。

从最低级到高级,我们分别有机器语言、汇编语言、高级语言。

机器语言的指令("语句"),是用0、1二进制代码表示的。这种语言难以记忆和理解,但它是机器唯一能直接理解和直接执行的语言。

汇编语言采用助记符表示0、1二进制代码,还使用符号地址及其他一些语法规定。这样,汇编语言的指令与机器语言的指令基本上一一对应,基本上属于同一层次的语言,但可理解性大大加强,也较容易记忆。但汇编语言指令的功能受处理器的限制,一般不太强。

高级语言是一种面向算法的语言,其语句类似人类的自然语言,因而易学易用,可移植性好。但高级语言的语句与机器可执行的机器指令之间并无直接的对应关系,因此,高级语言程序执行前需要"翻译"成机器指令。这种关系带来了程序效率(时间、空间)的损失。

汇编语言程序执行前也需要经翻译后产生机器代码,但这种翻译要简单得多。

二.汇编程序(Assembler)

上面介绍过,汇编语言源程序输入计算机不能直接被计算机识别和执行,必须经翻译后产生机器代码才行。我们把这种翻译过程称为汇编。汇编可以使用人工查表的方法完成,称为人工汇编;也可以借助于一种系统通用软件,使用计算机来完成,称为自动汇编。完成自动汇编的计算机程序称为汇编程序(Assembler)。也就是说,汇编程序是执行把汇编语言源程序翻译成机器能够识别和执行的目标程序(即二进制的机器代码程序)任务的一种系统程序,它与汇编语言程序(即用汇编语言编写的源程序)是两回事。

汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件棗目标程序文件和源程序列表文件,如图4-1所示。在图4-1中,我们还列出了各种文件缺省的文件扩展名(.ASM .OBJ .LST)。

列表文件列出源程序、目标程序的机器语言代码及符号表,如教材图4-2所示。这种符号表给程序调试带来方便。

实际上,汇编程序不仅能识别助记符指令(又称硬指令),而且还能识别汇编程序提供的、对汇编过程起控制作用的汇编命令(又称伪指令)。在编写源程序时,这两种指令都要严格遵守汇编语言的规范,否则将会出错。

在汇编过程中,汇编程序将对源文件(扩展名为.ASM的文件)进行二遍扫描,生成与之等价的机器语言的目标程序,并为以后程序的连接和装入,向连接装入程序提供必要的信息。第一遍扫描确定符号的数值,第二遍扫描才产生机器代码。汇编好的目标程序有的可以直接运行,有的却不能,还需要经过连接和定位之后才能交给机器运行。这主要取决于汇编程序的种类。

有一个问题,那就是:有了功能更强大、更易编程使用的高级语言,为什么我们还要学习、使用汇编语言编程呢?主要有以下几点原因:

?对理解计算机的工作原理有很大意义。

?能编出高效率的程序,对于小型的微处理器系统几乎是唯一选择。

?能直接控制硬件。

?能编出实时性强的程序。

所谓高效的程序,就是指完成同样功能,而执行速度较快,占用内存空间较小的程序。汇编语言编写的程序效率要比高级语言编写的程序高很多。

高级语言编写的程序往往不能直接控制硬件,执行某些操作。而汇编语言的程序不存在这个问题。

所谓"实时性",指的是系统按照实际的时间刻度运行,并及时按实际出现的情况处理有关问题的能力。高级语言的程序由于各个语句的执行过程是不可见的,也无法预料和控制其执行的时间刻度,因此,难以保证高的实时性。汇编语言的程序每条指令的执行是可见的,执行时间也是可预料的,对系统随机出现的

数据及异常情况能及时处理,因此,能编写出实时性很高的程序。当然,高的实时性还需要系统硬件的保证。

当然,高级语言的语句功能毕竟强大得多,因此,在配备了高级语言的系统机上,要编写各类数据处理程序、信息管理程序、各类学习与娱乐程序,我们还都是使用高级语言。

汇编程序主要分为两种:宏汇编程序(MACRO ASSEMBLER)和小汇编程序(MINI- ASSEMBLER)。

宏汇编程序功能较为强大,它不仅能将助记符指令翻译成机器指令,也能处理大量的"伪指令",包括宏指令。伪指令虽然不是真正的机器指令,但它的使用能给程序的编写带来很多方便。后面我们将看到这一点。一般系统机上配备的都是宏汇编程序。

小汇编程序的汇编能力有限,只能将助记符指令翻译成机器指令,基本上不支持伪指令。我们作实验的单板机上就是配备的小汇编程序。

按汇编实现的方法分为一次扫描汇编和两次扫描汇编。一次扫描汇编程序对源程序仅需要对源程序语句顺序处理一遍就能完成汇编,而两次扫描汇编程序则需要对源程序语句顺序处理两遍才能完成汇编。大多数微机的汇编程序是两次扫描的。

8086宏汇编程序MASM.EXE是目前在PC机上使用较多的汇编程序。它是采用两遍扫描的方式对源程序进行汇编的。它还支持多模块的程序设计。汇编程序将各个模块汇编成相对地址的浮动目标程序,每一模块的地址均从0开始,然后由连接和装入程序将这些模块连接成一个完整的绝对地址的目标程序,这个目标程序才是可运行的。

由MASM汇编生成的目标程序可以直接和其它高级语言程序的目标程序模块相连接,主程序和子程序的连接简单,经说明的外部子程序可直接调用,其绝对地址由连接程序确定。

4.2 MASM-86汇编语言程序的规范

一、一个简单的汇编语言程序

本节首先给出一个简单的8086汇编语言程序例子,以从宏观上了解汇编语言程序的格式、结构及规范,然后再深入讨论上述问题。

这是一个完成将100个字的数据块从输入缓冲区搬到输出缓冲区的实例。源程序如下所示。

DATA SEGMENT

INBUFF DW 100 DUP (?) ;输入缓冲区

OUTBUFF DW 100 DUP (?) ;输出缓冲区

DATA ENDS

;……………………………………………………………………………………

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,ES:DATA

STAR PROC FAR

PUSH DS

MOV AX,0

PUSH AX ;保存返回地址

MOV AX,DATA

MOV DS,AX ;设置DS

MOV,CH,AX ;设置ES

;……………………………………………………………………………………

INIT:MOV SI,OFFSET INBUFF ;设置输入缓冲区指针

LEA DI,OUTBUFF ;设置输出缓冲E指针

MOV CX,100 ;块长度送CX

REP MOVS OUTBUFF,INBUFF ;块搬移

;……………………………………………………………………………………

STAR ENDP

CODE ENDS

;……………………………………………………………………………………

END STAR ;汇编结束

从该例中,可以看到以下几个问题:

1.段结构问题:8086汇编语言程序是分段编写的,编写时要考虑的问题有:设置些什么段,各段内容是什么?段与段之间的关系如何?如何设置段?等等。

2.程序中有过程出现,这一点和许多高级语言相似。

3.程序中出现了许多指令系统中没有的语句,这些语句是伪指令语句。8086的伪指令多,将在§4.4中详细讨论。

4.每条语句后面可以用分号隔开写上注释,这样便于阅读修改。

5.汇编语言程序的格式比较规范,易记易学。

二、段结构

从第二章已经知道,8086的1MB存储空间是分段管理的。汇编源程序存放在存储器中,无论是取指令码还是存取操作数,都要访问内存。因此,汇编语言源程序的编写必须遵照存储器分段管理的规定,分段进行编写。

存储器的物理地址由段地址和编移量组合而成。源程序中的标号和变量等的段内偏移地址是在汇编过程中排定的,而段地址是在连接过程中确定的。汇编过程中形成的目标模块把源程序中由段定义语句提供的信息传递给连接程序,连接程序为各段分配段地址并把它们连成一体。在源程序中,段的体现由关于段定义的一些伪指令来完成。

三、汇编语言程序的语句类型和语句格式

(一)语句类型

8086宏汇编有三种基本语句。它们是:指令语句、伪指令语句和宏指令语句。

1.指令语句

指令语句由一条8086的指令和它的标号及注释三部分组成。标号及注释部分是任选的。在汇编时,一条指令语句被翻译为对应的机器码,对应着机器的一种操作。

例如:INIT:MOV SI,OFFSET INBUFF;设置输入缓冲区指针

这是一条完整的指令语句。INIT为该语句的符号地址,即它的标号。分号后面为注释,说明该语句的功能。MOV SI,OFFSET INBUFF为8086的一条数据传送指令。

2.伪指令语句

伪指令语句是为汇编程序和连接程序提供一些必要控制的管理性语句。汇编时,它不产生目标代码,汇编程序将它的意义解释之后,立即完成相对应的操作(伪操作),例如分配存储单元,给符号赋值等等,并且同时将有些信息保留下来,传送给连接程序使用。

伪指令语句也可由标号、伪指令和注释三部分组成,但伪指令语句的标号后面不能有冒号,这是它和指令语句的一大差别。

例如:VARI DB 20H;给变量VARI分配一字节单元,并赋值为20H

这是一条完整的伪指令语句,VARI是它的标号(名字)部分,它代表由伪指令DB分配的那个单元的符号地址,又叫做变量名。这条语句经汇编后,为VARI 分配一字节单元,并将20H装入其中,在机器代码中,这条语句不会出现。它的功能在汇编时已全部完成。

8086宏汇编伪指令较多,初学者往往感到难以掌握。但是,正因为这类型较多的伪指令使8086宏汇编语言使用起来较灵活。经过一段时间的实践之后,必然会感到这些伪指令还是很好用的。关于伪指令,将在后面详细介绍。

3.宏指令语句

宏指令语句由标号、宏指令和注释组成。宏指令是由编程者按一定的规则来定义的一种较"宏大"(MACRO)的指令。一般说来,一条定指令包括多条指令或伪指令语句。在程序中,往往需要在不同地方重复某几条语句的使用。为使源程序书写精炼,可读性好,便可先将这几条语句定义成一条宏指令。在写程序时,凡是出现这几条语句的地方,便以宏指令代替。在汇编时,汇编程序按照宏指令的定义,在出现宏指令的地方,又将其展开还原。因此,从源程序字面上来看,利用宏指令的确节省了篇幅,且使程序简明扼要。但并不意味着该程序的目标代码文件缩小,使用宏指令并不能节省内存空间。关于宏指令的问题,将在下面详细讲述。

(二)语句格式

从例4.1中可见,汇编语言程序中每个语句可由四个字段(Feild)组成,格式如下:

[名字]操作符操作数[;注释]

其中名字和注释字段是任选项。

例如:INBUFF DW 100 DUP(?)

这是一条伪指令语句,它的功能是为变量INBUFF分配100个字的存储空间,并不给这些空间赋初值。

1.名字字段

名字是一个符号,它表示本条语句的符号地址。一般说来,名字可以是标号或变量,统称标识符。它是由字母打头的字符率,可由下列字符组成:字母A~Z,a~z

数字0~9

专用字符?、.、@、_、$

(1)组成名字的规则

由上述字符构造一个名字,必须满足以下规则:

①除数字0~9外,其它字符都可以放在名字的第一个位置。

②字符"."只能出现在名字的第一个位置,其它位置不允许出现"."。

③名字最长由31个字符组成。汇编程序对31个以后的字符不予理会,所以,当两个名字的前31个字符完全相同而从32个字符开始有不同字符时,汇编程序仍将它们识别为同一名字。编程者须特别注意这点,以免出现这种较难发现的错误。

(2)指令语句和伪指令语句中名字的区别

关于名字字段,它在指令语句和伪指令素句中是有区别的。最明显的区别在于:指令语句中的名字之后要跟冒号,而伪指令语句中的名字之后不跟冒号。

例如:LAB1:MOV AX,2500H

这是一条指令语句,标号LAB1是它的名字,即是这条指令第一字节的符号地址。

VAR1 DW 3200H

这是一条伪指令语句,变量VARI是它的名字,VARI后面不跟冒号。VARI 也是一个符号地址,伪操作符DW将字3200H定义给VAR1及相邻的VAR1+l 两个单元,即在VAR1单元放数00H(低字节),VAR1+1单元中放数32H(高字节)。

指令语句中的名字一般由标号充当,这个标号可以是任选的,即可以不写。伪指令语句中的名字可以是变量名、段名、过程名、符号名等等,可以是规定必写、任选或省略,这取决于具体的伪指令。

一个标号与一条指令的地址相联系,因此标号可以作为JMP指令和CALL 指令的操作数。伪指令语句中的名字一般不作为JMP指令或CALL指令的操作数,但在间接寻址时可以。

(3)标号和变量的属性

标号和变量都具有三种属性:段、偏移及类型。

①段属性

该属性定义了标号和变量的段起始地址,此值必须在一个投寄存器中。标号的段是它所出现的那个代码段,所以由CS指示。变量的段可以是DS、ES、SS、CS,通常是DS或ES指示。例如,在例4.1中,变量INBUFF的段是段寄器DS指示,这一点在ASSUME语句和给DS赋值的MOV语句中体现出来。

②偏移属性

该属性表示标号或变量相距段起始地址的字节数,该数是一个16位无符号数。

③类型属性

该属性对于标号而言,是用于指出该标号是在本段内引用还是在其它段中引用。标号的类型有NEAR(段内引用)和FAR(段外引用)。对于变量其类型属性说明变量有几个字节的长度。这一属性由定义变量的伪指令DB、DW或DD确定。DB把变量定义为字节型,DW把变量定义为字型(两个字节),DD把变量定义为双字型(四个字节)。它们的类型分别为BYTE(字节)、WORD(字)和DWORD(双字)。

2.操作符字段

操作符可以是硬指令、伪指令或宏指令的助记符。硬指令是指指令系统中的指令,汇编程序将其翻译成对应的机器码。伪指令则不能翻译成对应的机器码,它只是在汇编过程中完成相应的控制操作,故又称汇编控制命令。例如,定义数据、分配存储单元、定义一个符号以及控制汇编结束等等。宏指令则是有限的一级指令(硬指令、伪指令)定义的代号,汇编时将根据其定义展开成相应的指令。

3.操作数字段

本字段是操作符的操作对象。操作符完成相应的操作要求有一系列的操作数。当有两个或两个以上操作数时,各操作数之间由逗号隔开。

操作数一般有常数、寄存器、标号、变量和表达式等几种形式。

(1)常数

常数是没有属性的纳数。它的值在汇编时色完全确定,程序运行过程中,不会发生变化。8086宏汇编中,允许以下几种常数:

①二进制常数,是一串0,1数字的组合,例如:1011010lB,以字母B结尾。

②十进制常数

这是我们常用的一种常数,后跟字母D或不跟任何字母。例如:12345或12345D。

③十六进制常数

由数字0~9和字母A~F组成。这类数据必须以字母H结尾,以数字0~9开头。例如:56H、0A36BH(不能写成0A36BH,尽管两数值相同,但后者可能被识别为标识符)等。

④八进制常数

逢八进一,由数字0~7组成。例如:20Q、37Q等,必须以字母Q结尾。

⑤串常数

以单引号括起来的字符及字符串,其各个字符的ASCII码值构成串常数。例如:‘12 3’其值为313233H,而不是123,‘A1B2’其值为41314232H。所以,串常数可以和整数常数等价使用,但这些单常数的长度必须为一个字节或一个字,以便与目标操作数的长度相匹配。

以上五种类型的常数是很常用的。另外,8086宏汇编还允许使用十进制科学记数法和十六进制实数。

在指令中,常数被称为立即数,它只有用作源操作数,不能作为目标操作数。它的允许取值范围由指令中的目标操作数的形式自动确定为8位或16位。

(2)存储器操作数

通常存储器操作数包括标号和变量。它可以作为源操作数,也可以作为目标操作数,但不能同时充当源和目标。

标号是可执行的指令性语句的符号地址,它可以作为JMP和CALL指令的转向目标操作数。

变量通常是指存放在某些存储单元中的数据,这些数据在程序运行期间是可以改变的。变量通过标识符来引用,可以用直接寻址、基址寻址、变址寻址和基址变址寻址方式对其存取。因此,变量可以作为这些存储器访问指令的源或目标操作数。

(3)表达式

表达式由常数、寄存器、标号、变量与一些运算符相组合而成。一般有数字表达式和地址表达式二种。将在4.3中详细介绍8086宏汇编的表达式和运算符。

4.注释字段

注释字段是以";"开头的说明部分,可用英文也可用中文书写。本字段是语句的非执行部分,因此,并非每条语句都写,可以根据需要来写。一般注释用来说明一段程序或几条语句的功能,以增加程序的可读性,易于修改和调试。对于初学者,在阅读别人程序时,注释对你的帮助会很大。同时,我们自己也要慢慢习惯于写出注释以利于别人和自己阅读。

以上逐一说明了汇编语言语句的四个组成部分。在下一节中,还将对上述问题作进一步的讨论,并重点介绍8086汇编语言的运算符和伪指令。

4.3 8086汇编语言中的标识符、表达式和运算符

1.标识符

前节介绍汇编语言语句格式时已讲过,每条语句的第一个字段可以是它的名字字段,名字可以是标号和变量,这两者又称为标识符。对于名宇重点要掌握的是它的组成规则和它的三个重要属性:段、偏移和类型属性。这些在前面有过详细介绍,这里不再赘述。

2.表达式及运算符

在表达式中,运算符充当着重要的角色。8086宏汇编有算术运算符、逻辑运算符、关系运算符、分析运算符和综合运算符共5种,如表4-1所示。

(一)算术运算符

算术运算将完成算术运算。有+(加法)、-(减法)、×(乘法)、/(除)、MOD(求余)以及SHL(左移)和SHR(右移)共七种运算。

其中,+、-、×、/运算都是整数运算,结果也是整数。/运算得到的是商的整数部分。MOD运算是指两数整除后所得的余数,例如,5 MOD 3结果为2,这和高级语言中的求余运算是相同的。

以上七种运算可直接对数字进行运算,但对地址的运算,只用加法和减法才具有实际意义,并且要求进行加、减的两个地址应在同一段内,否则运算结果便不是一个有效地址了。

例1这是一个程序的片段,其目的在于介绍一些算术运算符的使用方法。程序如下所示。

DATA SEGMENT

BUFFER DB 2,3,5,7,4

DATA ENDS

CODE SEGMENT

.

.

.

MOV AL,BUFFER+3 ;将BUFFER字节单元以后的第三单元的内容送AL

MOV AH,3×2-5 MOD 3 ;将表达式3×2-5MOD3的值送AL

MOV BH,0101B SHL 4 ;将二进制数0101左移四次后送BH

MOV BL,01010000B SHR 4 ;将二进制数01010000右移四次后送BL

(二)逻辑运算符

逻辑运算符对其操作数进行按位操作。它与指令系统中的逻辑运算指令是不相同的,运算后产生一个逻辑运算值,以作指令操作数使用,不影响标志位。对地址不能进行逻辑运算,逻辑运算只能用于数字表达式中。

逻辑运算符有:AND(与)、OR(或)、XOR(异或)和NOT(非)。其中NOT是单操作数运算符,其它是双操作数运算符。

例2逻辑运算符应用举例。

①MOV AX,0FF00H AND 0AEH ;将两个数相与的结果送AX

汇编成:MOV AX,1000H

②AND CX,00FFH AND 10AEH ;将表达式的值算出后,再和CX相与

汇编成:AND CX,00AEH

以上两例可看出:

1.逻辑运算是在汇编时完成的,表达式的值由汇编程序确定,而逻辑指令是在程序执行时完成逻辑操作的。

2.0FF00H和00FFH与一个16位数相与,可以分别提取其高8位和低8位,这种技术通常为"屏蔽"。

(三)关系运算符

关系运算符有EQ(相等)、NE(不相等)、LT(小于)‘ GT(大于)、LE(小于或等于)、GE(大于或等于)共六种。

关系运算都是双操作数运算,它的运算对象只能是两个性质相同的项目。例如,两个数或两个同一段内的存储器地址,对两个性质不同的项目进行关系比较是无意义的。

关系运算的结果只可能是两种情况:即关系成立或不成立。当关系成立时,运算结果为全1,否则为全0。

例3关系运算举例。

①MOV AX,2 LT 5

汇编成:MOV AX,0FFFFH ;2小于5关系成立

②MOV AX,2 GT 5

汇编成:MOV AX,0 ;2大于5关系不成立

(四)分析运算符

分析运算符是对存储器地址进行运算的。它可以将存储器地址的三个重要属性,即段、偏移量和类型分离出来,返回到所在位置作操作数使用。因此,分析运算将又称数值返回运算符。

分析运算符共有五个:SEG、OFFSET、TYPE、SIZE和LENGTH。其中SIZE 和LENGTH只对数据存储器地址操作数有效。

1.SEG

把SEG运算符加于一个标号或变量,求出的是该标号或变量所在段基址。

格式:SEG变量名或标号名

例4 设DATA是从存储器实际地址020000H开始的一个数据段,定义如下:DATA SEGMENT

VAR1 DB 20,30

VAR2 DW 2000H,3000H

VAR3 DD 22002200H,33003300H

DATA ENDS

则:

1) MOV BX,SEG VAR1

汇编成:MOV BX,0200H

2) MOV CX,SEG VAR2

汇编成:MOV CX,0200H

3) MOV DX,SEG VAR3

汇编成:MOV DX,0200H

可见,同一段内所有变量的段基址相同,所以用SEG求出的数值相等。

2.OFFSET

把OFFSET运算符加于一个标号或变量,所求出的是该标号或变量在段内的偏移量部分。

格式:OFFSET变量名或标号名

例5对于上例中定义的数据段,用OFFSET可以求出VAR1、VAR2和VAR 3的段内偏移量。

1)MOV AX,OFFSET VARI

汇编成:MOV AX,0 ;变量VARI的偏移量为0

2)MOV BX,OFFSET VAR2

汇编成:MOV BX,2 ;变量VAR2的偏移量为2

3)MOV CX,OFFSET VAR3

汇编成:MOV CX, 6 ;变量VAR3的偏移量为6

3.TYPE

TYPE运算符可加在变量、结构和标号的前面,所求出的是这些存储器操作数的类型部分。各种存储器地址操作数其类型部分的值如表4-2所示。

格式:TYPE变量、结构和标号名

例6 TPYE运算符应用举例。

(1)TYPE加在变量前面返回的是这个变量的字节数。对于上例中定义的数据段,则:

TYPE VAR1==1

TYPE VAR2==2

TYPE VAR3==4

(2)TYPE加在结构的前面,返回该结构所包含的字节数。例如,对于下面的结构:

STUDENT STRUC

NAMEI DB 'ABCD’

NO DB ?

ENGLISH DB ?

MATHS DB ?

PHYSICS DB ?

STUEDNT ENDS

则: TYPE STUDENT=8

结构STUDENT共包含有8个字节。

(3)TYPE加在标号的前面,返回该标号的属性是NEAR还是FAR。

4.LENGTH

把LENGTH运算符加在数组变量的前面,求出该数组中所包含的变量或结构的个数。

在8086汇编语言中,LENGTH运算符只对用DUP定义的变量才有意义,它给出分配给变量的单元(字节、字或双字)数。

DUP是DUPLICATION的缩写,它代表"重复"的意义。

例7 LENGTH应用举例。

现有两个数组VAR1和VAR2的初始化情况如图4-5所示。

R1

R2

可以分别用下面两种方式定义:

方式 1: 若定义:VAR1 DB 4DUP(1) VAR2 DW 2DUP(1,2,3) 则: LENGTH VAR1=4

LENGTH VAR2=2

方式 2:

若定义:VAR1 DB 1,1,1,1 VAR2 DW 1,2,3,l ,2,3 则:

LENGTH VAR1==l LENGTH VAR2==1

5.SIZE

SIZE 和LENGTH 的功能类似,也是只有用于由DUP 定义的变量才有意义,但不同的是它给出的是一个变量总的字节数。当DUP 括号内为单项数据时,它的值可由下列公式计算:

SIZE X == LENGTH X×TYPE X

格式:SIZE 变量

例如,对于例7中的方式1: SIZE VAR1=4×l=4 对于例7中的方式2: SIZE VAR1=1×l=1 4.4 伪指令及宏指令

1.数据定义及存储器分配伪指令

这类指令有:DB 、DW 、DD 、DQ 和DT ,它们的作用是将所需要的数据放入指定的存储单元中,或者是为程序分配指定数目的存储单元,并根据情况对它们进行初始化。

格式:「变量名」DB /DW /DD /DQ /DT <表达式>,<表达式>,……;[注释]

其中,变量名是任选项,它代表所定义的第一单元的地址。注释也是任选的。 DB :定义字节变量,其后的每一个表达式占一个字节。

DW :定义字变量,其后的每一个表达式的值占二个字节,低字节在低地址,高字节在高地址。

DD :定义双字变量,其后的每一个表达式的值占四个字节,同样低字节在低地址,高字节在高地址。

DQ :定义四字变量,其后的每一个表达式的值占八个字节,低字节放低地址,高字节放高地址。

图4-5 例7变量初始化情况

DT;定义十个字节,其后的每一个表达式的值占十个字节。一般用于存放压缩的BCD码。

这里的表达式可以是常数、表达式、地址表达式、字符率和数据表格。

下面的例题中,分别说明这几种形式的表达式的应用。

[例4.11]本例说明数据定义伪指令的使用及存储器的分配方法。已知数据段定义如下,段的起始地址为02000H。

DATA SEMENT

DBYTE DB 10,10H

DWORD0 DW 100,100H

DDWORD DD 12345678H

DQWORD DQ 1234567890ABCDEFH

DBYTES DB ’AB’

DWORDS DW ’AB’

DWORDI DW OFFSET DWORD0

DDWORDI DD DDWORD

DATA ENDS

则存储器的分配情况及初始化情况如图4-7所示。

100

20

140

用DUP定义重复数据,格式为:

变量名DB/DW/DD/DQ/DT <表达式>DUP(表达

式)

DUP左边的表达式表示要重复的次数,右边圆括号中的表达

式表示要重复的内容,它可以是下列的内容之一:

(l)一个问号?,表示该单元不初始化,由汇编程序随便预置为什么值;

(2)一个数据项表格;

(3)一个数值表达式或地址表达式。

例12已知数据段定义如下:

DATA SEGMENT

ARRAYI DB 2 DUP(0,1,?)

ARRAYZ DW 100 DUP(?)

ARRAY3 DB 20 DUP(0,1,4DUP(2),5)

DATA ENDS

则存储器分配图如图4-8所示。

4.5 汇编语言程序的上机过程

一.汇编语言的工作环境

汇编语言的工作环境是指软件环境和硬件环境两个方面。

1.硬件环境

目前8086汇编语言程序一般都在IBM PC/XT及其兼容机上运行。因此,要求机器具有一些基本配置就行了,汇编语言对机器无特殊要求。

2.软件环境

软件环境主要指支持汇编语言程序运行和帮助建立汇编语言源程序的一些软件,主要包括以下几个方面。

(1)DOS操作系统

汇编语言程序的建立和运行都是在DOS操作系统的支持下进行的。目前IBM PC/XT上流行的是MS-DOS(西文)和CCDOS(中文)。因此,要首先在MS-DOS或CCDOS已启动了机器的情况下进行下面的工作。

(2)编辑程序

编辑程序是用来输入和建立源程序(包括汇编语言源程序、高级语言源程序和文本文件)的一种通用的磁盘文件。往往源程序的修改也是在编辑状态下进行的。

常用的编辑程序有:

行编辑程序:https://www.doczj.com/doc/c31185394.html,

全屏幕编辑程序:西文WORDSTAR,中西文WORDSTAR,https://www.doczj.com/doc/c31185394.html,或者QE.COM

建立或修改源程序时,可在上述编辑程序中任选一种使用。

(3)汇编程序

8086的汇编程序有小汇编ASM.EXE和宏汇编MASM.EXE两种。小汇编不支持宏操作,因此,一般选用宏汇编MASM.EXE。

(4)连接程序

8086汇编语言使用的连接程序是:LINK.EXE

(5)辅助程序

这类程序作为一种辅助工具,帮助编程者进行程序的调试,文件格式的转换等等常用的有:

动态调试程序https://www.doczj.com/doc/c31185394.html,

EXE文件到COM文件格式转换程序EXE2BIN.EXE

二.汇编语言程序工作盘的建立

对于不使用汉字的情况,用一张360KB的软盘便可以建立起工作盘。

首先格式化这张盘,同时拷入DOS 3.30,然后拷入以下文件:

MASM.EXE ;宏汇编程序

LINK.EXE ;连接程序

NE.EXE ;编辑程序

DEBUG COM ;动态调试程序

EXE2BIN.EXE ;EXE文件到COM文件转换程序(这个文件一般可不要) 这时,磁盘上仍有空间供存入用户程序。

三.在DOS环境下,建立和运行汇编语言程序的过程

此过程可用图4-22所示的流程图表示。

1.源程序的输入和修改

这里推荐使用全屏幕编辑程序NE.EXE。

NE是一个西文状态下的屏编软件,它小巧精致,使用起来非常方便。它的命令根据其功能分类,非常好记。NE的常用命令见附录七。

当机器启动后,进入DOS状态,发下列命令,便可以进入NE的全屏幕编辑状态:

A>NE文件名.ASM;进入NE状态

敲功能键F2进入编辑状态,利用NE的命令便可以在需要的位置写入源程序。在屏幕的最下面一行,有当前光标所在行、列的提示。

也可以发命令:

A>NE;进入NE状态

但这时会给出File Name的提示,要求输入相应文件名。汇编语言源程序文件的扩展名一定要用.ASM,不可以省略也不可以更改,否则在汇编时就会出错。

源程序输入完毕或输入了一个段落后,一定记住用F3 E或F5 S命令存盘。

2.汇编

可以用小汇编ASM.EXE对源程序进行汇编,但它不支持宏指令操作,因此对于有宏操作的源程序,要用MASM.EXE。汇编的过程中,有一些屏幕信息,应注意查看。特别是错误信息提示有助于修改源程序。错误信息参见附录八。

假设源程序的文件名为:LP ASM,首先发命令:

A>MASM LP

或:A>MASM LP.ASM

则出现以下屏幕提示要求回答:

A>MASM LP

Microsoft(R)Macro Assembler Version 5.00

Copyfght(C) Microsoft Corp 1981-1985,1987.All rights reserved。

object filename [LP.OBJ]:

Source listing [NUL.LST]:

Cross-reference [NUL.CRF]:

以上信息中,方括号中信息为该项的缺省回答,若不改变缺省值,就直接敲回车。

汇编后将产生以下几个文件:

(1).OBJ文件是汇编后生成的目标代码文件,每一汇编都应生成这个文件,但当源程序中有错时,不会生成这个文件。因此,我们应特别注意上述信息之后给出的Warning errors(警告错误)和Severe errors严重错误)的类型和数目,当严重错误数目不为0时,不会生成.OBJ文件,因此后面就无法连接。而当警告错误数目不为0时,可以生成.OBJ文件,若编程者容忍这些警告错误的存在,则可以将此时的.OBJ文件用来连接。

(2).LST文件是列表文件,它可有可无。缺省回答为不生成这个文件。一般情况下是不需要的,所以可直接敲回车来回答。

若需要生成列表文件,则在该项提示后面给一个文件名即可。LST文件中同时给出源程序和机器代码程序清单,并给出符号表。这些信息对调试程序有一定的帮助。

(3).CRF文件是用来产生交叉引用表REF表的。汇编时生成的.CRF文件还必须调用另一程序CREF.EXE,由CREF.EXE将.CRF文件变成.REF 文件。因此,这时工作盘中还要拷入CREF.EXE文件,然后发命令:A>CREF 文件名.CRF

机器提问:List Filename [文件名.REF〕:

若用回车回答,则建立一个同名的.REF文件,若要改名,则敲入新的文件名。

一般不需要.CRF文件,因此对于汇编时的缺省值(不生成.CRF文件)给予回车应答。

在汇编过程中出现的错误,应回到编辑状态去修改。修改后重新汇编,直到无错出现。

3.连接并定位

从汇编后得到的.LST文件中可以看到,有些指令的机器代码后有字符"R",其意义表示地址是浮动的,需在连接过程中定位。通过汇编得到正确的.OBJ

文件之后,再经连接程序处理就可以得到可执行的.EXE文件了。连接命令为:A>LINK LP

或A>LINK LPOBJ

则会出现屏幕提示:

A>LINK LP

Microsoft(R) overlay Linker Version 3.61

Copyright(C) Microsoft Corp 1983-1987.All rights reserved。

Run File [LP.EXE]:

List File [NUL.MAP]:

Libraries [.LIB]:

连接后,可产生两个文件:

(l).EXE文件是可直接在DOS操作系统下运行的文件。若生成同名的.EXE 文件,则只要在Run File提问行直接敲回车就行了。。

(2).MAP文件是连接程序的列表文件,又称为连接映象(LINK MAP)文件。它给出每个段在存储器中的分配情况。一般不需要.MAP文件,所以在List File 提问行用回车直接回答即可。若需要.MAP文件,则在此行敲入文件名即可。

(3).LIB文件是指明程序在运行时所需要的库文件。它不是由连接程序生成的。汇编语言程序无特殊的库文件要求,所以在Libraries提问行敲回车即可。但当汇编语言与高级语言接口时,高级语言可能需要一定的库文件,此时敲入相应的库文件名就行了。

在连接的过程中,也可能出现错误信息。若有错误被检测到,则应回到编辑状态去修改。然后重新汇编和连接,最后生成正确的.EXE文件。

若是多模块,则发出的连接命令应为:

A>LINK 模块1十模块2+…十模块N

各模块先各自独立汇编生成.OBJ文件,然后连接成一个可执行文件。

4.运行

经过上述过程得到正确的EXE文件后,则在DOS状态下直接装入EXE文件运行。运行命令为:

A >LP

或 A >LP.EXE

到此为止,完成了汇编语言源程序从编辑、汇编、连接到运行的四大步骤。

若整个过程中,只需要生成必要的源文件(.ASM文件),目标代码文件(.OBJ 文件)和运行文件(.EXE文件),而不要.LST文件、.CRF文件和.MAP文件,用下面的命令格式就可以避免屏幕提问信息,加快汇编和连接速度。

A>MASM文件名;

A>LINK文件名;

命令中的分号告诉系统省略掉屏幕提示,并承认系统的省缺值,即不生成.LST、.CRF和.MAP文件。

5.调试运行

在编写汇编语言源程序时产生的错误,除了一般语法上和格式上的错误可由汇编和连接程序发现指出外,逻辑上的错误都必须用调试程序(DEBUG)来排除。所以调试手段是否丰富和方便,对提高编程的速度是很关键的。

https://www.doczj.com/doc/c31185394.html,文件,用于试验和检测用户程序,它具备的功能有:设置断点和起动地址,单步跟踪,子程序跟踪,条件跟踪,检查修改内存和寄存器,移动内存以及读写磁盘,汇编一行和反汇编等等。

在DEBUG状态下,可对程序进行动态调试,一边运行一边调试,同时观察到各寄存器、内存单元及各标志位的变化情况。关于DEBUG的使用请见附录九。

四.EXE文件和.COM文件

在磁盘上扩展名为.EXE和.COM的文件都是在DOS下可直接运行的文件,也就是说在DOS状态下直接敲入文件名即可。但.EXE文件和.COM文件是有区别的,主要是文件结构上的差别。

1.EXE文件的结构

DOS的COMMAND.COM文件接受一个键盘命令后(.EXE文件和.COM 文件的名字也是键盘命令),首先判断是内部命令还是外部命令,若是外部命令则去检测可用存储区的最低地址和最高地址,然后在可用地址的低端开始的

100H个单元建立将要装入的程序的程序前缀区(PSP),在接下来的地址装入程序本身,之后转向这个程序的入口地址开始执行。

对于每一个可执行文件,装入后都有一个程序前缀区PSP(Program Segment Prefix),这个区域内包括有这个文件的一些信息。PSP占100H个字节,其分配如图4-23所示。

图4-23 程序前缀区(PSP)

PSP的头两个字节为INT 20H指令。EXE文件被装入内存后,DOS将DS 和ES寄存器指向PSP区的起点,即INT 20H指令,这个指令的功能是返回操作系统。但INT 20H的执行需要一个大前提,那就是只有当CS指向PSP区时,这条指令才能正常运行。所以前面的例子中,凡是需要返回DOS的程序,都利用了PSP中的这条指令。在程序执行部分的最开始都写入下面几条指令:PUSH DS ;将PSP区的段基址入栈

MOV AX ;0

PUSH AX ;将PSP区的INT 20H指令的偏移量入栈

这样,堆栈中首先保存了PSP区的人口地址。因程序的最后一条执行指令是RET,执行时,它将这个入口地址弹入CS:IP中,此时便会执行1NT 20H,实现正确返回DOS。这便是这种结构的程序需写入上述三条指令的原因。

.EXE文件被装入时,是在PSP区之后存放用户程序、用户数据和用户堆栈(有的话),而此时DS和ES指向PSP的首址。因此,用户程序的内部操作部分

还应包含DS和ES的设置,让它们指向用户数据段和附加段,实现重定位。SS 和SP用户可不设置,这时可用系统的堆栈。其它CS、IP(SS和SP)则设置为连接程序传送过来的值,通常IP=0。

https://www.doczj.com/doc/c31185394.html,文件的结构

.COM文件和.EXE文件一样,也有一个PSP区。COM文件被装入时,DS、ES、CS和SS都指向PSP的起点。程序是在PSP区之后,所以COM文件的IP 为100H。COM文件只能由一个段组成,最大为64KB。SP指向这64KB的末尾,并在堆栈顶自动存放了两个字节00H。对于.COM文件,因为CS总是指向PSP区的,所以程序中可随意使用INT 20H指令,这一点在.EXE3件中是不行的。

.COM文件不像.EXE文件一样带有重定位信息,因此只能把整个文件看成一段。整段可重定位,但不能分段重定位。对DS、ES和SS是不能用MOV AX,DATA和MOV DS,AX来赋值,因为无法确定DATA的定位信息。应用PUSH CS和POP DS来代替上述两条语句。另外,由于.COM文件不需要重定位信息,所以在用DEBUG调试完后,可直接用DEBUG的存盘命令存盘,而.EXE则不行。

3.EXE文件和.COM文件的区别

这两种文件的区别主要在于在内存中的存储方式和文件内部格式两个方面。EXE文件和.COM文件的内存映象如图4-24所示。

.EXE文件和.COM文件内部格式的区别如表4-4所示。由于.COM文件的上述特点,它适合平较小程序的编制,装入速度比.EXE文件要快一些。

4.EXE文件转换为.COM文件

汇编语言程序经汇编和连接之后生成的是.EXE文件。一个.EXE文件要能转换为.COM文件,必须按照.COM文件的格式要求来写,即只有一个段,程序入口为100H,所有过程定义为NEAR,不能有段设置(即段名不出现在语句中)等。下面是一个COM程序的结构框架;

PCOM SEGMENT

ORG 100H ;程序起点

ASSUME CS:PCOM,SS:PCOM,DS:PCOM,ES:PCOM

MAIN PROC NEAR

<程序正文>

INT 20H ;返回DOS

MAIN EMDP

<数据放此处>

PCOM ENDS

END MAIN

按照上面的结构写出的源程序经汇编连接后生成.EXE文件,再用DOS提供的EXE2BIN软件来将.EXE文件转换为.COM文件。命令为:A>EXE2BIN.EXE文件名字.COM文件名字/

在转换时,最好不要转换为同名的.COM文件,否则磁盘上将有两个名字相同但扩展名不同的文件,这在运行和其它操作时将带来不便。

五、汇编语言程序上机过程示例

汇编语言程序设计综合设计实验项目

汇编语言程序设计创新实验项目 1. 编写一个完整的程序:根据零件的数量和总价格,计算出零件的单价。 主程序MAINPRO允许用户在键盘上输入零件数量和总价格; 子程序SUBCONV 把从键盘输入的ASCII 码转化为二进制; 子程序SUBCALC 计算出零件的单价; 子程序SUBDISP 把二进制表示的单价转化为十进制数并显示出结果。 要求:在程序设计时要求使用顺序、分支、循环、子程序和宏汇编等多种方法解决程序设计问题,对于较大的子程序最好使用子程序嵌套,程序中如有多次重复的代码最好使用重复汇编。 2.编写一个完整的程序,分别输入有一个班学生的百分制成绩,根据学生百分制成绩转换出五级分数制。如低于60分为E,60-69为D、70-79为C、80-89为B、90-99为A。并统计该班学生人数。 要求:1、学生成绩从键盘接收; 2、本程序可以重复运行,自行设计退出程序的方法; 3、程序具有可操作性,如,应该有提示语句和判断非法操作的方法和处理方式。 3. 编写一个完整的程序,在屏幕上显示如图所示数字拼成的形状。 0123456789 1234567890 2345678901 3456789012 4567890123 5678901234 6789012345 7890123456 8901234567 9012345678 4、按要求编写一个完整的程序。 要求:1、自BUFFER开始的内存单元中,存有一个ASCII码字符串。查找已知字符串中含有多少个子字符串‘AB’的个数,将统计结果以十进制形式显示输出。 2、在查找到子字符串‘AB’后添加空格字符。 5、按要求编写一个完整的程序。 要求:1、编写子程序SORT,将内存中10个无符号字数据由小到大排序。 2、编写子程序FIND,在上述已排好的数据区里查找某一个数,若找到,显示 其在数据区的位置,否则显示‘N’字符。 3、编写调用程序,完成排序及检索任务。 6、试编写一程序,要求根据用户键入的月份在终端上显示该月的英文缩写名。 7、试编写一程序,要求接收从键盘输入的一个班的学生成绩,并存放于30字的grade数组中,其中grade+1保存学号为了i+1的学生的成绩。然后根据grade中的学生成绩,把学生

汇编语言指令表

汇编语言指令表文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

伪指令 1、定位伪指令 ORG m 2、定义字节伪指令 DB X1,X2,X3,…,Xn 3、字定义伪指令 DW Y1,Y2,Y3,…,Yn 4、汇编结束伪指令 END 寻址方式 MCS-51单片机有五种寻址方式: 1、寄存器寻址 2、寄存器间接寻址 3、直接寻址 4、立即数寻址 5、基寄存器加变址寄存器间接寻址 6、相对寻址 7、位寻址 数据传送指令 一、以累加器A为目的操作数的指令(4条) MOV A,Rn ;(Rn)→A n=0~7 MOV A,direct ;( direct )→A MOV A,@Ri ;((Ri))→A i=0~1 MOV A,#data ; data →A 二、以Rn为目的操作数的指令(3条) MOV Rn ,A;(A)→ Rn MOV Rn ,direct;( direct )→ Rn MOV Rn ,#data; data → Rn 三、以直接寻址的单元为目的操作数的指令(5条) MOV direct,A;(A)→direct MOV direct,Rn;(Rn)→direct MOV direct,direct ;(源direct)→目的direct MOV direct,@Ri;((Ri))→direct MOV direct,#data; data→direct 四、以寄存器间接寻址的单元为目的操作数的指令(3条) MOV @Ri,A;(A)→(Ri) MOV @Ri,direct;(direct)→(Ri) MOV @Ri,#data; data→(Ri) 五、十六位数据传送指令(1条) MOV DPTR,#data16;dataH→DPH,dataL →DPL

A51的汇编控制指令即宏指令

A51汇编器是运行于IBM PC系列及其兼容机上的交叉汇编软件,其主要功能是将MCS-51系列单片机汇编语言源程序翻译成符合Intel目标文件格式的可再定位的目标代码,经过L51连接器的连接和装配,产生可被DS51仿真器调试或其它任何一种与Intel 目标文件格式兼容的仿真器使用的绝对目标代码. 一:A51的符号:在A51中可使用符号表示数值(EQU),地址和寄存器名,符号具有段类型,作用域,值域和可变性等属性. 符号的段属性:指出符号所位于的地址空间.段类型有: NUMBER 无类型符号 DATA DATA段符号(可直接寻址的内部RAM空间) IDATA IDATA段符号(可间接寻址的内部RAM空间) XDATA XDATA段符号(外部数据存储空间) BIT BIT段符号(内部RAM低地址区的可位寻址的空间) CODE CODE段符号(程序存储器空间) REGISTER 寄存器符号 作用域:指出符号是外部的,局部的还是全局的.(PUBLIC,EXTRN关键字说明) 二:标号:定义标号时,标号名后必须接冒号”:”,以示区别,每行只能定义一个标号,标号一经定义,其值为当前地址计数器的当前值,因此标号代表了指令和数据的地址,不能重复定义. 三:特殊的汇编符号:A51宏汇编语言定义了代表CPU寄存器的特殊符号,这些是保留的关键字,AR0---AR7:表示当前工作寄存器的R0—R7的绝对地址,它的值取决于指令所选择的工作寄存器组. 四:运算符:有三种 1):算术运算符包括:+,-(正负号),加---+,减,乘,除,MOD(取模),()—括号,改变运算顺序. 2):二进制运算符号:用来对二进制数进行按位取反,移位或逻辑运算.包 括:NOT(按位取反),HIGH(取右边操作数的高8位,LOW(取右边操作数的低8 位)SHR(右移位),SHL(左移位),AND(逻辑与),OR(逻辑或),XOR(逻辑异或). 3):关系运算符:>=,<=,<>,=,<,>. 所有运算符的优先级顺序:()→NOT,HIGH,LOW→+,-(正负号)→*,/,MOD→+,-(加减)→SHR,SHL→AND,OR,XOR→>=,<=,<>,>,<,=. 数值表达式:数值表达式由运算符和操作数组成,一个操作数又可以是表达式,与符号具有段属性一样,表达式也具有段类型属性,表达式的类型依赖于操作数的类型.表达式的类型如下:BIT,NUMBER,CODE,DATA,IDATA,XDATA.大多数的表达式是无类型的,当表达式中包含有段类型的操作数或者是子表达式时,运算结果的段类型遵循下面的原则: 对于单目运算符:(+/-/HIGH/LOW/NOT)表达式的结果与操作数具有相同的类型. 对于所有的双目运算符(除+/-),表达式的结果均为无类型的结果. 对加减运算,只有当其中的一个操作数具有段类型的时候,运算结果才具有相同的段类型,如果两个操作数具有段类型,即使他们的段类型一样,结果也是无类型的(NUMBER). 总结:只有当操作数加上或者是减去一个无类型时,才可能产生一类型,其他所有的组合均产生无类型的表达式.

第四章 汇编语言程序设计

第四章汇编语言程序设计 1、编程将片内40H~60H单元中的内容送到以3000H为首的存储区内。 答:MOV R1,#40H MOV R2,#21H MOV DPTR,#3000H L1: MOV A,@R1 MOVX @DPTR,A INC R1 INC DPTR DJNZ R2,L1 2、编程计算下列算式的程序 (1)23H+45H+ABH+03H= MOV A,#23H ADD A,#45H ADD A,#0ABH XCH A,B ;溢出处理 ADDC A,#00H XCH A,B ADD A,#03H ;A中为结果低位,B中为高位 (2)CDH+15H-38H-46H= MOV A,#0CDH ADD A,#15H SUBB A,#38H SUBB A,#46H (3)1234H+8347H= MOV A,#34H ADD A,#47H MOV 30H,A MOV A,#12H ADDC A,#83H MOV 31,A ;30H存结果低位,31H存结果高位 (4)AB123H-43ADCH= CLR C MOV A,#23H SUBB A,DCH MOV 30H,A MOV A,#0B1H SUBB A,#3AH MOV 31H,A MOV A,#0AH SUBB A,,#04H MOV 32H,A ;30H为低位,32H为高位 3、设有两个4位BCD码,分别存放在23H、22H单元和33H、32H单元中,求他们的和,并送入43H、42H单元中(低位在低字节,高位在高字节)。

答: MOV A ,22H ADD A ,32H MOV 42H ,A MOV A ,23H ADDC A ,33H MOV 43H ,A 4、略 5、编程计算片内RAM 区50H ~59H 单元中数的平均值,结果存放在5AH 中。 答: MOV R0,#8 MOV R1,#50H MOV A ,#00H L1: ADD A ,@R1 INC R1 DJNZ R0,L1 MOV B ,#8 DIV AB MOV 5AH ,A 6、编写计算下式的程序。设乘积和平方结果均小于255。a 、b 值分别存在片外3001H 和3002H 单元中,结果存于片外3000H 单元中。 (1)?? ???÷?=b a b a Y 25b a b a b a ><=,,, MOV DPTR ,#3001H MOVX A ,@DPTR MOV 30H ,A ;a 暂存30H 单元 INC DPL MOVX A ,@DPTR CJNE A ,30H ,L1 ;是否a=b MOV A ,#25 SJMP SAVE L1: JNC L2 MOV B ,30H MUL AB SJMP SAVE L2: MOV B ,A MOV A ,30H DIV AB SAVE: MOV DPTR ,#3000H MOVX @DPRT ,A (2)?? ???-++++=10)() (10)(222b a b a b a Y 10)(,10)(,10)(,222>+=+<+b a b a b a

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

宏汇编软件的使用宏汇编软件MASM51的使用

宏汇编软件的使用宏汇编软件MASM51的使用 第一节概述 单片机开发可以用手工汇编和机器汇编两种方法。采用手工汇编就是先编写出汇编程序,然后对照单片机汇编表手工将汇编程序翻译成机器码,最后将机器码一个一个地送入开发仿真器的RAM中去进行调试。 由于采用手工汇编的机器码是相对于存储器的绝对地址进行定位的,因此在调试时,若要在程序中增加或删除一条指令,就会造成指令的绝对地址发生变化。这样除修改那条指令外,几乎所有转移、调用指令的操作数都要作相应的修改,稍有疏忽程序就会出错。 而采用机器汇编,在很大程度上可以避免上述麻烦。只要通过键盘输入源程序后,其余作工作都由计算机来进行,即查出相应的机器码,对地址进行定位,建立能被开发装置接收的机器码文件、建立能打印出清单的列表文件等等。机器码不需要再一个一个地从仿真器的键盘上键入,只要从PC机的通讯口直接传送到开发装置中去。因此使用机器汇编大大提高了单片机开发的速度。 源程序被输入到机器中后,以一个文件的形式保存起来,然后就可以对这个文件进行处理了,要对这个文件进行汇编,必须有相应的汇编程序。在PC机上进行汇编的程序有多种,以下介绍的MASM51软件就是其中的一种,它的主要特点有: 1.对用户编写的源程序格式要求不太严格,例如,英文字母的大、小写不受限制,变量名或标号名没有长度限制,对源程序中的空格数也没有严格的要求等等。这些给用户编写程序带来很大的方便。 2.具有较强的功能,例如支持宏语句,使同一程序中类似的程序结构,只要输入一次,在使用时可用宏语句调用。此外还允许用条件汇编语句以及完善的伪指令系统等。减少了编写、输入源程序的工作量。 3.不管用户的源程序有多少错误,它都能全部汇编完,并能形成列表文件及目标文件,以供用户修改错误。 4.可以接收汉字注释,并能完整的将汉字注释复制到列表文件,而其它一些汇编软件则不能处理汉字,或会使列表文件中的汉字注释混乱。 运行MASM51软件的条件很低,现在的PC机都能达到。 第二节如何启动MASM51宏汇编程序 一、启动和退出 MASM51软件有两个文件:MASM51.EXE和MASM51.OVL,只要将这两个文件拷入硬盘的一个目录中(如MASM51)中,然后在DOS命令行中打入: MASM51(回车) 即在显示器上显示如下信息: The Cybernetic Micro Systems CYS-8051 Software Package Version 3.03` for the IBM Personal Computer (C)Copy right Cybrenetic MIcro Systems,Inc 1983,1984,1985, 1986 High Level Language Commands

汇编语言指令

汇编语言指令集 数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2

格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL 影响标志: C,P,Z,S,O ROR,ROL,RCR,RCL

汇编语言指令速查表

附录 附录A 常用80x86指令速查表 指令按助记符字母顺序排列,缩写、符号约定如下: (1) 指令中,dst, src表示目的操作数和源操作数。仅一个操作数时,个别处也表示为opr。 (2) imm表示立即数,8/16/32位立即数记作:imm8/imm16/imm32。 (3) reg表示通用寄存器,8/16/32位通用寄存器记作:reg8/reg16/reg32。 (4) mem表示内存操作数,8/16/32等内存操作数记作:mem8/mem16/mem32等。 (5) seg表示段寄存器,CS, DS, SS, ES, FS, GS。 (6) acc表示累加器,8/16/32累加器对应AL/AX/EAX。 (7)OF, SF, ZF, AF, PF, CF分别表示为O, S, Z, A, P, C,相应位置为:字母,根据结果状态设置;?,状态不确定;-,状态不变;1,置1;0,清0;例如:0 S Z ? P -表示:OF清0,AF不确定,CF不变,其它根据结果设置。若该栏空白,则表示无关。 (8)寄存器符号诸如(E)CX, (E)SI, (E)DI, (E)SP, (E)BP和(E)IP等,表示在16地址模式下使用16位寄存器(如CX),或在32地址模式下使用32位寄存器(如ECX)。 (9)周期数表示指令执行所需的CPU时钟周期个数,即执行时间为:周期数/主频(秒)。 (10)诸如(386+)是表示该指令只能用于80386及以后微处理器上。

·252·

附录 ·253·

·254·

附录 ·255·

·256·

汇编语言常见指令

?PTR?操作符:强制类型转换 MOV BYTE PTR [BX], 20H ;1B立即数20H送DS:[BX] MOV WORD PTR [BX], 20H ;立即数20H送DS:[BX], ;00H送DS:[BX+1] 2.LEA(Load Effective Address) 设:变量X的偏移地址为1020H , (BP)=0020H 执行指令后: LEA DX, X LEA BX, [BP] ; 执行后, (DX) = 1020H ; 执行后, (BX) = 0020H 3.地址传送指令LDS,LES LDS REG16, MEM ; 从存储器取出4B,送入REG16和DS LES REG16, MEM ; 从存储器取出4B,送入REG16和ES 4.符号扩展指令CBW,CWD CBW ;将AL寄存器内容符号位扩展到AH CWD ;将AX寄存器内容符号位扩展到DX 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CBW ;(AX)= 0060H 设:(AX)= 8060H,(DX)=1234H 执行下列指令后 CWD ;(DX)= 0FFFFH,(AX)= 8060H 5.交换指令XCHG 例如,(AX)= 5678H 执行下面指令后 XCHG AH, AL ;(AX)= 7856H 6.换码指令XLAT XLAT ;AL←DS: [BX+AL] 表格的首地址事先存放在内存逻辑地址DS: BX中, AL的内容是相对于表格的位移量, 把对应内存的内容取出放在AL寄存器。 7.逻辑运算符 SHR(右移) SHL(左移) AND(与) OR(或) XOR(异或)

第四章汇编语言

4.1汇编语言概述 语言分机器语言、低级语言、高级语言,机器语言由0和1构成,只有专业人士才能看懂。低级语言就是汇编语言,用助记符来表示,最贴近机器硬件,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言高级语言分为面向过程和面向对象的语言。 1 顺序结构 顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。 2 分支结构 (1).分支程序设计概述 分支程序结构可以有两种形式,如图所示 (2)分支程序设计 分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。根据对条件的判断而选择不同的处理方法是人的基本智能体现。 3 循环程序设计 1.循环程序设计概述 有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序。 循环程序一般由四个部分组成: (1)循环初值部分:这是为了保证循环程序能正常进行循环操作而必须做的准备工作。循环初值分两类:一类是循环工作部分的初值,别一类是控制循环结束条件的初值。 (2)工作部分:即需要重复执行的程序段。这是循环的中心,称之为循环体。 (3)修改部分:按一定规律修改操作数地址及控制变量,以便每次执行循环体时得到新的数据。 (4)控制部分:用来保证循环程序按规定的次数或特写条件正常循环。 4.2 汇编语言的语句 4.2.1语句分类:汇编语言语句分为指令性语句、伪指令、宏指令。 4.2.2语句格式:[标号] 操作码 [操作数] [注释] 汇编语言源程序中的每个语句可以由4项组成,格式如下 [name] operation operand [;comment] [名字项] 操作项操作数项;注释项 下面分别说明各项的表示方法。 1.名字项 源程序中用下列字符表示名字: 字母:A~Z或a~z; 数字:0~9; 专用字符号:?、?、@、―、$; 一般来讲,名字项可以是标号或变量。 (1)标号:在代码段定义,后面跟冒号:

微机原理与接口技术汇编语言指令详解吐血版

第一讲 第三章 指令系统--寻址方式 回顾: 8086/8088的内部结构和寄存器,地址分段的概念,8086/8088的工作过 程。 重点和纲要:指令系统--寻址方式。有关寻址的概念;6种基本的寻址方式及 有效地址的计算。 教学方法、实施步骤 时间分配 教学手段 回 顾 5”×2 板书 计算机 投影仪 多媒体课件等 讲 授 40” ×2 提 问 3” ×2 小 结 2” ×2 讲授内容: 3.1 8086/8088寻址方式 首先,简单讲述一下指令的一般格式: 操作码 操作数 …… 操作数 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在操作码的后面,与操作码一起放在代码段区域中。如图所示。 例如:MOV AX ,3000H

立即数可以是8位的,也可以是16位的。若是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如: MOV AX,DS:[2000H]; 图2-2 (对DS来讲可以省略成 MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄

汇编语言指令的构成

第一讲 第四章汇编语言程序设计-语句特点、伪指令 回顾:8086/8088的内部结构、寄存器功能和工作过程,指令格式、寻址方式和功能。 重点和纲要:汇编语言程序设计-语句特点、伪指令(了解汇编的概念及其方法, 掌握汇编程序的基本格式,常用运算符的使用方 法,汇编的步骤。了解伪指令的功能,掌握定义数据、符号、 段、过程等伪指令的使用方法,能编写格式正确的汇编程序)。 讲授内容: 4.1 汇编语言的基本元素 一、汇编语言的语句格式 由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。每个语句由1~4个部分组成,其格式是: [标号] 指令助记符[操作数][;注解] 其中用方括号括起来的部分,可以有也可以没有。每部分之间用空格(至少一个)分开,一行最多可有132个字符。 1.标识符 是给指令或某一存储单元地址所起的名字。可由下列字符组成: 字母:A ~ z ;数字:0 ~ 9 ;特殊字符:?、·、@、一、$ 。 数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。标识符最长为31个字符。当标识符后跟冒号时,表示是标号。它代表该行指令的起始地址;当标识符后不带冒号时,表示变量;伪指令前的标识符不加冒号。 2.指令助记符

表示不同操作的指令,可以是8088的指令助记符,也可以是伪指令。 3.操作数 是指令执行的对象。依指令的要求,可能有一个、两个或者没有, 例如: RET ;无操作数 COUNT : INC CX ;一个操作数 如果是伪指令,则可能有多个操作数,例如: COST DB 3,4,5,6,7 ;5个操作数 MOV AX ,[BP 十4] ;第二个操作数为表达式 4.注解 该项可有可无,是为源程序所加的注解,用于提高程序的可读性。 二、 汇编语言的运算符 1.算术运算符、逻辑运算符和关系运算符 ① 算术运算符可以应用于数字操作数,结果也是数字。而应用于存储器操作数时,只有+、- 运算符有意义。 2.取值运算符SEG 、OFFSET 、TYPE 、SIZE 和LENGTH · SEG 和OFFSET 分别给出一个变量或标号的段地址和偏移量。 例如,定义: SLOT DW 25 则:MOV AX ,SLOT ;从SLOT 地址中取一个字送入AX MOV AX ,SEG SLOT ;将SLOT 所在段的段地址送入AX MOV AX ,OFFSET SLOT ;将SLOT 所在段的段内偏移地址送AX · TYPE 操作符返回一个表示存储器操作数类型的数值。各种存储器地址操作数类型部分的值如表3-1所示。 · LENGTH 和SIZE 操作符只应用于数据存储器操作数。(用DB/DW/DD 等定义的操作数) LENGTH 返回一个与存储器地址操作数相联系的单元数, SIZE 操作数返回一个为存储器操作数分配的字节数。 例如:若 MULT-WORD DW 50DUP (0) 则 LENGTH (MULT-WORD )=50 表3-1存储器操作数的类型属性及返回值

汇编语言习题与答案

汇编语言习题与答案 一、填空题:把答案填在题中横线上。 1.8位无符号整数的表示范围为0~255,写成16进制形式为00H~__________;8位有符号整数的表示范围为-128~+127,写成16进制形式为__________~__________。 2.8086/8088分段管理存储空间,但每段容量最大不超过__________。 3.逻辑地址为F000:100的存储单元,其物理地址是__________。 4.用来指示堆栈栈顶的偏移地址的是__________寄存器。 5.若要测试AL寄存器D4、D2、D0位是否都为0,则可使用__________指令语句(含操作数),以产生转移条件。这条指令执行后将利用标志位__________实现转移。 6.若定义:bdata db2dup(1,2,2dup(3),4),则dbata变量前5个单元从低地址到高地址的数据依次是__________。 7.假设varw是一个16位变量,则指令“mov varw,ax”的目的操作数的寻址方式是__________。 二、选择题:在每小题给出的四个选项中,只有一项是符合题目要求的,请把所选项前的字母填在题后的括号 内。 1.对汇编语言源程序进行翻译,形成OBJ文件的是 A.汇编程序 B.连接程序 C.编辑程序 D.调试程序[] 2.下列各个8位二进制数的补码中,真值最大的是 A.10001000 B.11111111 C.00000000 D.00000001[] 3.MASM语句中,表达常数不正确的形式是 A.01101001B B.A346H C.’A’ D.5600[] 4.如果SS=600H,则说明堆栈段物理地址起始于 A.60H B.600H C.6000H D.60000H[] 5.dw50dup(?)预留了存储空间的字节数是 A.25 B.50 C.100 D.200[] 6.下列指令中有操作数在代码段中的是 A.mov ax,34h B.add ax,bx C.inc word ptr[34h] D.cmp ax,[34h][] 7.假设AL=5,要使得AL=0FAH,应执行的指令是 A.not al B.and al,0fh C.xor al,0f0h D.or al,0fh[] 8.设置逻辑段应该采用的一对伪指令是 A.segment/ends B.start/end start C.proc/endp D.macro/endm[] 9.条件转移指令JNE条件是 A.CF=0 B.CF=1

汇编语言手册

寄存器与存储器 1. 寄存器功能 . 寄存器的一般用途和专用用途 . CS:IP 控制程序执行流程 . SS:SP 提供堆栈栈顶单元地址 . DS:BX(SI,DI) 提供数据段内单元地址 . SS:BP 提供堆栈内单元地址 . ES:BX(SI,DI) 提供附加段内单元地址 . AX,CX,BX和CX寄存器多用于运算和暂存中间计算结果,但又专用于某些指令(查阅指令表)。. PSW程序状态字寄存器只能通过专用指令(LAHF, SAHF)和堆栈(PUSHF,POPF)进行存取。 2. 存储器分段管理 . 解决了16位寄存器构成20位地址的问题 . 便于程序重定位 . 20位物理地址=段地址* 16 + 偏移地址 . 程序分段组织: 一般由代码段,堆栈段,数据段和附加段组成,不设置堆栈段时则使用系统内部的堆栈。 3. 堆栈 . 堆栈是一种先进后出的数据结构, 数据的存取在栈顶进行, 数据入栈使堆栈向地址减小的方向扩展。 . 堆栈常用于保存子程序调用和中断响应时的断点以及暂存数据或中间计算结果。 .堆栈总是以字为单位存取 指令系统与寻址方式 1. 指令系统 . 计算机提供给用户使用的机器指令集称为指令系统,大多数指令为双操作数指令。执行指令后,一般源操作数不变,目的操作数被计算结果替代。 . 机器指令由CPU执行,完成某种运算或操作,8086/8088指令系统中的指令分为6类: 数据传送,算术运算,逻辑运算,串操作,控制转移和处理机控制。 2. 寻址方式 . 寻址方式确定执行指令时获得操作数地址的方法 . 分为与数据有关的寻址方式(7种)和与转移地址有关的寻址方式(4)种。 . 与数据有关的寻址方式的一般用途: (1) 立即数寻址方式--将常量赋给寄存器或存储单元 (2) 直接寻址方式--存取单个变量 (3) 寄存器寻址方式--访问寄存器的速度快于访问存储单元的速度 (4) 寄存器间接寻址方式--访问数组元素 (5) 变址寻址方式 (6) 基址变址寻址方式 (7) 相对基址变址寻址方式(5),(6),(7)都便于处理数组元素 . 与数据有关的寻址方式中,提供地址的寄存器只能是BX,SI,DI或BP . 与转移地址有关的寻址方式的一般用途: (1) 段内直接寻址--段内直接转移或子程序调用 (2) 段内间接寻址--段内间接转移或子程序调用

单片机汇编语言程序编程规范

引言 软件设计更多地是一种工程,而不是一种个人艺术。如果不统一编程规范,最终写出的程序,其可读性将较差,这不仅给代码的理解带来障碍,增加维护阶段的工作量,同时不规范的代码隐含错误的可能性也比较大。 分析表明,编码阶段产生的错误当中,语法错误大概占20%左右,而由于未严格检查软件逻辑导致的错误、函数(模块)之间接口错误及由于代码可理解度低导致优化维护阶段对代码的错误修改引起的错误则占了一半以上。 可见,提高软件质量必须降低编码阶段的错误率。如何有效降低编码阶段的错误呢?这需要制定详细的软件编程规范,并培训每一位程序员,最终的结果可以把编码阶段的错误降至10%左右,同时也降低了程序的测试费用,效果相当显著。 本文从代码的可维护性(可读性、可理解性、可修改性)、代码逻辑与效率、函数(模块)接口、可测试性四个方面阐述了软件编程规范,规范分成规则和建议两种,其中规则部分为强制执行项目,而建议部分则不作强制,可根据习惯取舍。 1.排版 规则1 程序块使用缩进方式,函数和标号使用空格缩进,程序段混合使用TAB和空格缩进。缩进的目的是使程序结构清晰,便于阅读和理解。 默认宽度应为8个空格,由于Word中为4个空格,为示范清晰,此处用2个代替(下同)。例如: MOV R1, #00H MOV R2, #00H MOV PMR, #PMRNORMAL MOV DPS, #FLAGDPTR MOV DPTR, #ADDREEPROM read1kloop: read1kpage: INC R1 MOVX A, @DPTR MOV SBUF, A JNB TI, $ CLR TI INC DPTR CJNE R1, #20H, read1kpage INC R2 MOV R1, #00H CPL WDI CJNE R2, #20H, read1kloop ;END OF EEPROM 规则2

如何使用宏汇编程序MASM

如何使用宏汇编程序MASM.EXE和连接程序LINK.EXE 1、首先在硬盘上建立一个文件夹,例如:D:\MASM. 2、下载MASM.EXE和LINK.EXE到D:\MASM文件夹里. 3、经过以上两步,我们已经做好了准备工作,接下来书写程序。 我们的程序要求为,计算 y = a × b + c - 18,a、b、c 均为带符号的8位二进制数据,为了实验观看实验结果,我们假设 a = 34H、b = 56H、c = E7H。 程序原代码如下(分号后面内容为注释内容,可以不输入): CC EQU 18 ;伪指令定义CC STACK SEGMENT ;堆栈段起始 DW 256 DUP(?) ;在堆栈段中预留了256个字的内容 TOP LABEL WORD ;TOP为栈顶偏移地址 STACK ENDS ;堆栈段结束 DATA SEGMENT ;数据段起始 DAT1 DB 34H ;DAT1即为题中操作数a,为字节,存于数据段中 DAT2 DB 56H ;DAT2即为题中操作数b,为字节,存于数据段中 DAT3 DB 0E7H ;DAT3即为题中操作数c,为字节,存于数据段中 DATY DW ? ;DATY即为题中计算结果的预留空间为字,存于数据段中 DATA ENDS ;数据段结束 CODE SEGMENT ;代码段起始 ASSUME CS:CODE,DS:DATA,SS:STACK ;分配段地址对应关系 START: MOV AX,DATA ;START为标号,MOV语句完成DATA数据段地址送入AX MOV DS,AX ;将AX内容送入DS,即赋予DS数据段DATA的段地址 MOV AX,STACK ;将STACK堆栈段地址送入AX MOV SS,AX ;将AX内容送入SS,即赋予SS堆栈段STACK的段地址 MOV SP,OFFSET TOP ;SP设初值 MOV AL,DAT1 ;取a,直接寻址方式 MOV BL,DAT2 ;取b,直接寻址方式 IMUL BL ;AX <- AL * BL,即将a * b的值存入AX MOV BX,AX ;将AX内容保存至BX MOV AL,DAT3 ;取c,直接寻址方式 CBW ;由于c是8位有符号数,所以做符号扩展至AH ADD AX,BX ;AX <- AX + BX,即完成的操作为将a*b+c结果存入AX SUB AX,CC ;AX <- AX - 18 MOV DATY,AX ;将a*b+c-18的内容存放至数据段中偏移地址DATY的内存中 MOV AH,4CH ;将4CH存入AH,为了下句调用DOS 21号中断 INT 21H ;调用DOS 21中断,由AH=4CH决定返回DOS操作系统

第四章--汇编语言程序设计

第四章汇编语言程序设计 1编程将片内40H?60H单元中的内容送到以3000H为首的存储区内。答:MOV R1,#40H MOV R2,#21H MOV DPTR,#3000H L1: MOV A,@R1 MOVX@DPT,R A INC R1 INC DPTR DJNZ R2,L1 2、编程计算下列算式的程序 1) 23H+45H+ABH+03H= MOV A , #23H ADD A , #45H ADD A , #0ABH XCH A ,B ;溢出处理 ADDC A , #00H XCH A ,B ADD A ,#03H;A中为结果低位,B中为高位 2) CDH+15H-38H-46H= MOV A,#0CDH ADD A,#15H SUBB A,#38H SUBB A,#46H 3) 1234H+8347H=

MOV A , #34H ADD A , #47H MOV 30H , A MOV A , #12H ADDC A , #83H MOV 31, A ;30H 存结果低位, 31H 存结果高位 4)AB123H-43ADCH= CLR C MOV A , #23H SUBB A , DCH MOV 30H , A MOV A , #0B1H SUBB A , #3AH MOV 31H , A MOV A , #0AH SUBB A ,, #04H MOV 32H , A ;30H 为低位, 32H 为高位 3、设有两个4位BCD 码,分别存放在 23H 22H 单元和33H 、32H 单元中,求他们的和,并 送入43H 、42H 单元中(低位在低字节,高位在高字节) 。 答: MOV A , 22H ADD A , 32H MOV 42H , A MOV A , 23H ADDC A , 33H MOV 43H , A

汇编语言完整题库

一.名词解释(本大题共5小题,每小题3分,共15分)试解释下列名词的含义。 1.逻辑地址 2.物理地址 3.标志寄存器 4.存储器寻址方式 5.补码 二.计算题(本大题共5小题,每小题4分,共20分)试按照各小题的要求给出计算结果。 1.将十进制数100分别转换为二进制、十六进制数,它们的表示形式分别为多少? 2.假设(DS)=0B00H,(BX)=0210H,对于指令MOV DS:120H[BX],AL,其目的操作数的物理地址为多少? 3.假设(BX)=0210H,(DI)=0060H,对于指令ADD DL,[BX][DI],其源操作数的偏移量为多少? 4.假设当前(SP)=0060H,连续执行5条PUSH指令后,(SP)=? 5.对于一个十进制数– 65,其二进制补码表示形式为多少? 三.排错题(本大题共4小题,每小题5分,共20分)每小题列出了一条指令,判断该指令有无语法错误,如果存在语法错误,请指出具体的错误原因,判断正确给2分,分析正确给3分,判断错误不给分。 1.PUSH 5588H 2.MOV DS,1720H 3.ADD AX,CL 4.AND AX,[DX] 四.程序分析题(本大题共6小题,每小题5分,共30分)每小题列出了一段小的程序片段和相关存储单元的初始值,请按题目的要求分析各程序片段的运行结果。(寄存器中的内容请使用十六进制形式给出) 1.阅读如下程序片段 MOV AL,4CH MOV BL,0B5H ADD AL,BL 执行上述程序片段后,(AL)= ,(BL)= , CF= ,OF= ,PF= . 2.阅读如下程序片段 MOV AL,0F3H MOV DL,0C4H ADD AL,DL AND AL,0FH 执行上述程序片段后,(AL)= ,(AF)= ,CF= ,OF= ,PF= . 3.阅读如下程序片段 MOV AL,7EH MOV CL,04H ROL AL,CL 执行上述程序片段后,(AL)= ,(CL)= , CF= ,OF= . 4.阅读如下程序片段 MOV AX,0632H MOV BX,0C202H SUB AX,BX INC AX 执行上述程序片段后,(AX)= ,(CF)= , OF= . 5.阅读如下程序片段,假设(DS)=0100H,字节单元(01024H)=56H,字节单元(01025H)=28H MOV BX,0024H LEA BX,[BX] OR BX,0 ADC BX,[BX] 执行上述程序片段后,(BX)= ,(CF)= , OF= . 6.阅读如下程序片段,假设(SP)=0064H MOV AX,0001H MOV BX,0002H PUSH AX PUSH BX POP CX POP BX 执行上述程序片段后,(AX)= ,(BX)= , (SP)= , 五.程序设计题(本大题共2小题,第一小题7分,第二小题8分,共15分) 1.试编写一程序片段,实现BL高4位与低4位相互交换(7分) 2.试编写一程序片段,不使用乘除法指令,实现((AX)*5+14)/ 2的功能(AX中的数据理解为补码)(8分)

相关主题
文本预览
相关文档 最新文档