8086汇编语言程序设计
8086指令系统及汇编语言程序设计

8086指令系统及汇编语言程序设计8086指令系统是指Intel 8086微处理器所支持的一套机器指令。
8086微处理器是Intel于1978年推出的一款16位微处理器,其指令系统设计清晰简洁,具有良好的可编程性和灵活性。
汇编语言程序设计则是使用汇编语言编写程序,通过汇编器将汇编语言转化为可执行文件的过程。
8086指令系统共有十六个16位的通用寄存器,包括AX、BX、CX和DX四个通用寄存器,在实模式下这些寄存器也可以拆分为两个8位的寄存器AH、AL、BH、BL、CH、CL、DH和DL。
另外,还有SP、BP、SI和DI四个指针寄存器,以及CS、DS、ES和SS四个段寄存器等。
这些寄存器提供了程序在内存中存储和访问数据的能力。
8086指令系统中的指令可以分为数据传输指令、算术指令、逻辑指令和控制指令等几个类别。
数据传输指令可以将数据从寄存器传输到寄存器、从存储器传输到寄存器,或者从寄存器传输到存储器等。
算术指令包括加法、减法、乘法、除法等运算指令。
逻辑指令可以执行与、或、非、异或等逻辑运算。
控制指令可以控制程序的执行流程,例如条件跳转、循环等。
汇编语言程序设计是通过使用汇编语言编写程序来实现特定功能。
汇编语言程序由一系列指令组成,每条指令由操作码和操作数组成。
操作码表示需要执行的操作,操作数则是参与操作的数据。
编写汇编语言程序需要熟悉8086指令系统的指令格式和功能,以及寄存器的使用方法。
汇编语言程序设计的开发流程包括分析问题、编写算法、编写程序、汇编和调试等步骤。
在开始编写程序之前,需要先分析问题,并根据问题需求设计算法。
然后根据算法编写汇编语言程序,并通过汇编器将其转化为机器码。
最后,通过调试工具进行程序的调试和测试,确保程序的正确性和可靠性。
总之,8086指令系统及汇编语言程序设计是一门用于编写底层程序的技术。
通过学习和掌握8086指令系统和汇编语言程序设计,可以编写高效、优化的程序,并深入了解计算机系统的底层运行原理。
8086汇编语言程序设计——第一个程序

8086汇编语⾔程序设计——第⼀个程序本系列以80X86系列微型计算机为基础,以MASM5.0为汇编上机实验环境,重点介绍Intel8086指令系统。
Intel8086指令系统中有100多条指令,利⽤这些指令可以编写出复杂的程序实现更多功能。
汇编语⾔是直接控制计算机硬件⼯作的最简便的语⾔。
学习了汇编语⾔可具有在CPU寄存器级上进⾏控制和操作的能⼒,可获得直接对计算机硬件底层编程的经验。
⼀个计算的例⼦例 *编写⼀个汇编语⾔程序,实现下列公式计算。
假设X=4,Y=5汇编指令如下:如果在DEBUG下⽤A命令输⼊这些指令,必须把X、Y换成具体的数值;Z、Z1是存储单元地址,最后两条指令可写为MOV [0],AL和MOV [1],AH,这样才能⽤T命令执⾏。
D:\dos〉DEBUG-AMOV AL,4ADD AL,5MOV BL,8IMUL BLMOV BL,4MOV BH,0SUB AX,BXMOV BL,2IDIV BLMOV [0],ALMOV [1],AH采⽤DEBUG的A命令输⼊程序的做法明显不⽅便,⼀是⽆法给出变量名即符号地址,⼆是调试修改程序不便。
1. 编写⼀个完整的汇编语⾔源程序需要增加段定义伪指令和定义数据存储单元伪指令等必须有的伪指令。
伪指令与C语⾔等⾼级语⾔中的说明性语句的含义类似,起到说明作⽤。
⽤记事本gedit或者vi编写,保存到dos⽬录下注释符号为;号2. 汇编、链接、执⾏汇编语⾔源程序既可以⽤⼤写字母也可以⽤⼩写字母书写。
汇编语⾔程序建⽴及汇编过程如图所⽰。
⽤户编写的源程序要经汇编程序MASM汇编(翻译)后⽣成⼆进制⽬标程序,⽂件名默认与源程序同名、扩展名为.OBJ;再经过LINK连接⽣成可执⾏程序,⽂件名默认与源程序同名、扩展名为.EXE。
注意:源程序⼀定要和MASM和LINK⽂件放在同⼀个⽂件夹中。
执⾏MASM和LINK命令时需要按多次回车。
3. 在DEBUG下执⾏程序MOV AH,4C指令对应的偏移地址是0023,这就是断点(所谓断点,就是程序执⾏到该处停下来不再继续)。
第3章 8086指令系统-汇编语言程序设计教程-陆遥-清华大学出版社

直接寻址方式可以利用变量名的偏移地址属性来 描述操作数的偏移地址(可直接用变量名,或将 变量名置于方括号[ ]中),段寄存器默认为DS。 如果实际使用的段寄存器不是DS,则必须用段 前缀明确指出。
【例3.7】设数据段内有如下变量定义语句
VAR DB 76H,5CH,0A3H,08H
分析以下指令的执行结果。
3.1 指令系统基本概念
指令是给计算机下达的一个简单操作任务,CPU 所能执行的所有指令构成了一个计算机的指令系 统(也称指令集)。
汇编语言指令是对机器指令的符号化表示,采用 助记符来表示指令的操作功能和操作对象。
指令通常可以分为以下几类:
⑴ 数据传送类指令。 ⑵ 算术运算类指令。
⑸ 程序控制类指令。 ⑹ 处理器控制类指令。
【例3.3】要求将数据68传送给AL寄存器,写出相应的传 送指令。 分析:由于AL寄存器接收数据,所以目的操作数为AL, 采用寄存器寻址方式,而源操作数为常数68,采用立即寻 址方式
MOV AL,68 ;AL←68
【例3.4】设被加数存于寄存器DX中,加数为512,写出相 应的加法指令。 分析:因为被加数由寄存器DX提供,所以DX为目的操作 数,采用寄存器寻址方式,而加数为常数512,采用立即 寻址方式
操作数。
2. ADD指令
指令格式:ADD DST,SRC 指令功能:DST←(DST)+(SRC) 。执行加法运算。 操作数特点:两个操作数。被加数DST为目的操作数,加
数SRC为源操作数。
3. NOT指令
指令格式:NOT OPR 指令功能:OPR←(OPR) 。执行逻辑非运算。 操作数特点:一个操作数。OPR既是目的操作数,也是源
段地址由段寄存器提供,用段前缀(DS:,ES:, CS:或SS:)来指明;偏移地址(亦称有效地址) 则有多种表示形式,由此形成了不同的存储器寻 址方式。
汇编语言程序设计实验报告

汇编语言程序设计实验报告汇编语言程序设计实验报告引言:汇编语言是计算机中最基本的语言,通常用于处理硬件相关问题。
在这个实验中,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
以下是我们的实验报告。
正文:1. 实验环境我们使用的实验环境是Intel 8086微处理器与高级汇编语言。
微处理器使用的是PCB-512主板,而高级汇编语言是MASM。
2. 实验目的我们的实验目的主要是学习汇编语言的基础知识和编程技巧,包括了汇编语言的寄存器、指令、内存管理等方面的知识。
我们的另一个目的是掌握汇编语言的常用编程技巧,能够独立完成一些简单的汇编程序。
3. 实验内容我们的实验内容主要包括以下几点:(1)学习汇编语言的基础知识,包括寄存器、指令、内存管理等方面的知识。
(2)掌握汇编语言的常用编程技巧,包括数据输入输出、运算、跳转等基本操作。
(3)实践用汇编语言编写程序,如计算器、菜单等实用程序。
(4)了解8086微处理器的结构和原理。
4. 实验过程在这个实验过程中,我们完成了以下几个程序:(1)计算器计算器是一个简单的程序,主要用于实现两个数之间的加、减、乘、除等基本运算。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
(2)菜单菜单是一个实用程序,主要用于展示一个简单的菜单并实现用户选择相关功能的功能。
我们使用了汇编语言中的跳转指令、输入输出指令等实现了这个程序。
5. 实验结果在我们的实验中,我们成功完成了上述两个程序。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
6. 实验总结在这个实验过程中,我们学习汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
我们通过编写计算器和菜单等简单实用程序,加深了对汇编语言的理解和认识。
我们认为这个实验对我们今后的学习和工作都有很大的帮助。
结论:通过这个实验,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
常用汇编语言8086程序集锦

一、计算X+Y=Z,将结果Z存入某存储单元。
(1). 实验程序如下:STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTXL DW ? ;请在此处给X低位赋值XH DW ? ;请在此处给X高位赋值YL DW ? ;请在此处给Y低位赋值YH DW ? ;请在此处给Y高位赋值ZL DW ?ZH DW ?DATA E NDSCODE S EGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AX,XL ;X低位送AXADD AX,YL ;X低位加Y低位MOV ZL,AX ;存低位和MOV AX,XH ;X高位送AXADC AX,YH ;X高位加Y高位MOV ZH,AXA1: JMP A1CODE E NDSEND START二、计算X-Y=Z,其中X、Y、Z为BCD码。
实验程序及流程如下:STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTX DW ? ;请在此处给X赋值Y DW ? ;请在此处给Y赋值Z DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AH,00HSAHFMOV CX,0002HLEA SI, XLEA DI, ZA1: MOV AL,[SI]SBB AL,[SI+02H]DASPUSHFAND AL,0FHPOPFMOV [DI],ALINC DIINC SILOOP A1A2: JMP A2CODE ENDSEND START三、乘法运算本实验实现十进制数的乘法,被乘数、乘数和乘积均以BCD码形式存放在内存中,实验程序及流程如下:STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTDATA1 DB 5 DUP(?)DATA2 DB ?RESULT DB 6 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV D S,AXCALL INITMOV S I,OFFSET DATA2MOV B L,[SI]AND B L,0FHCMP B L,09HJNC E RRORMOV S I,OFFSET DATA1MOV D I,OFFSET RESULTMOV C X,0005HA1: MOV A L,[SI+04H]AND A L,0FHCMP A L,09HJNC E RRORDEC S IMUL B LAAMADD A L,[DI+05H]AAAMOV [DI+05H],ALDEC D IMOV [DI+05H],AHLOOP A1MOV C X,06HMOV S I,OFFSET RESULTDISPLAY:MOV AH,01HMOV A L,[SI]ADD A L,30HMOV [SI],ALINC SILOOP DISPLAYA2: JMP A2INIT: MOV SI,OFFSET RESULTMOV C X,0003HMOV A X,0000HA3: MOV [SI],AXINC SIINC SILOOP A3RETERROR: MOV A X,0145HJMP A2CODE ENDSEND START。
8086汇编语言语句的类型和格式

第5章 汇编语言程序设计
表达式是由操作数和运算符组成。即用一个运 算符可以对一个或几个操作数进行运算,构成一个表 达式。 表达式中常用的运算符有以下几种: ⑴ 算术运算符:+、-、*、/和取模运算 MOD。 ⑵ 逻辑运算符:AND、OR、NOT和XOR。 ⑶ 关系运算符:EQ、NE、LT、GT、LE、GE。 结果只有两个全1或全0。 ⑷ 分析运算符:利用分析运算符可以把一个存 储单元地址分解为段地址和偏移地址等。分析运算符 有SEG 、OFFSET 、TYPE、SIZE和LENGTH等。
;等效于MOV AL,1 ;等效于MOV AH,2 ;(AL)←20H,返回DUP前面的数值 ;(CL)←01H ;(BL)←40H ;(DL)←04H
第5章 汇编语言程序设计
⑸ 合成运算符:可以用来建立或临时改变变量或 标号的类型或存储器操作数的存储单元类型。合成运算 符有PTR、THIS等。
第5章 汇编语言程序设计
第5章 汇编语言程序设计
3) 操作数 汇编语言语句中的第三个组成部分是操作数。在指令语句 中是指令的操作数,可能有单操作数或双操作数,也可能无操 作数;而在伪指令中可能有更多个操作数。当操作数不止一个 时,相互之间应该用逗号隔开。
可以作为操作数的有:常数、寄存器、标号、变量和表达式
等。
第5章 汇编语言程序设计
LOOPER: MOV AL,DATA2[SI] ;取一个字节加数 DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数
第一条语句是指令语句,其中“LOOPER:”是名字,“MOV” 是指令助记符,“AL,DATA2[SI]”是操作数,“;”后面是注 释部分;第二条语句是伪指令语句,其中“DATA1”是名字, “DB”是伪指令定义符,“0F8H,60H,0ACH,74H,3BH”是 操作数,“;”后面是注释部分。
第4章 汇编语言程序设计

因此, 因此,对例子中的存储器地址作如下运 算: SUM+2 CYCLE-5 NOT_DONE-GO 是有效的表达式。 是有效的表达式。而 SUM-CYCLE
(2)逻辑运算符 逻辑运算符是按位操作的AND、OR、 、 逻辑运算符是按位操作的 、 XOR和NOT。 和 。 1010 1010 1010 1010B AND 1100 1100 1100 1100B=1000 1000 1000 1000B 1100 1100 1100 1100B OR 1111 0000 1111 0000B=1111 1100 1111 1100B NOT 1111 1111 1111 1111B=0000 0000 0000 0000B
ASSUME CS:MY_CODE, ;规定 和DS 规定CS和 : 的内容 DS:MY_DATA : PORT_VA1 EQU 3 ;端口的符号名 GO: MOV AX, MY_DATA ;DS : 初始化为MY_DATA 初始化为 MOV DS, AX MOV SUM, 0 ;清SUM单元 单元
变量可以具有以下几种寻址方式: 变量可以具有以下几种寻址方式: ① 直接寻址 ② 基址寻址 变址(索引) ③ 变址(索引)寻址 ④ 基址变址寻址
2.运算符(Operators) .运算符( ) 算术运算符( Operators) ① 算术运算符(Arithmetic Operators) 逻辑运算符( Operators) ② 逻辑运算符(Logical Operators) 关系运算符( Operators) ③ 关系运算符(Relational Operators) 分析运算符( Operators) ④ 分析运算符(Analytic Operators) 合成运算符( Operators) ⑤ 合成运算符(Synthetic Operators)
第4章8086,8088微机汇编语言程序设计

2)段内偏移量(Offset) 它是标号与段起始地址之间相距的字节数,为一16位 无符号数。 3)类型(Type) 类型表示该标号所代表的指令的转移范围,分NEA R(近)与FAR(远)两种。NEAR类型的标号仅在 同一段内使用,用2字节指针给出转移的偏移量属性(即 只改变IP值,不改变CS值);而FAR类型的标号无此限 制,必须用4字节指针指出转移的段地址与段内偏移量。 当标号用作JMP或CALL等指令的目标操作数时,若 为段内转移或调用则采用NEAR类型;若为段间转移或 调用则应当采用FAR类型。 JMP FAR PTR LINE
第4章 8086/8088汇编语言程序设计
汇编语言程序设计是开发微机系统软件的基本 功,在程序设计中占有十分重要的地位。
由于汇编语言具有执行速度快和易于实现对硬件的控 制等独特的优点,所以至今它仍然是用户使用得较多的程 序设计语言。特别是在对于程序的空间和时间要求很高的 场合,以及需要直接控制设备的应用场合,汇编语言更是必 不可少了。 由于汇编语言本身的特点,本章将选择目前国内广泛 使用的IBM PC机作为基础机型,着重讨论8086/8088汇编 语言的基本语法规则和程序设计的基本方法,以掌握一般 汇编语言程序设计的初步技术。
(1)立即操作数 立即操作数在指令中直接给出,不需要使用 寄存器,也不涉及访问数据区的操作,只能作为 源操作数。立即操作数是整数,可以是1字节或 2字节。在汇编语言中,立即操作数用常量(包 括数值常量和符号常量)以及由常量与有关运算 符组成的数值表达式表示。 如:MOV BX,1000+5*3 (2)寄存器操作数 通用寄存器AX、BX、CX、DX、BP、 SP、DI、SI以及段寄存器CS、SS、D S、ES都可以作为操作数。如:MOV BX,AX
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验1 简单汇编语言程序设计一、实验目的与要求1.熟悉汇编语言运行、调试环境及方法。
2.掌握简单汇编语言程序的设计方法。
3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。
二、实验内容根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。
1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的地址。
试编写汇编程序,完成Z←((W-X) ÷5-Y)⨯(R+ 2) 。
2.试编写一个程序,测试某数是否是奇数。
如该数是奇数,则把DL 的第0位置1,否则将该位置0。
三、实验报告要求1.程序算法流程图。
2.源程序清单。
3.程序运行结果。
4.调试过程中遇到的问题和解决的方法。
实验2 分支及循环程序设计一、实验目的与要求1.熟悉汇编语言运行、调试环境及方法。
2.掌握分支程序和循环程序的设计方法。
3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。
二、实验内容根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。
1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。
2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。
参考加密方法是:每个数乘以2。
(说明:本题的加密方法,同学们可以自己拟定)三、实验报告要求1.程序算法流程图。
2.源程序清单。
3.程序运行结果。
4.调试过程中遇到的问题和解决的方法。
实验3 子程序程序设计一、实验目的与要求1.熟悉汇编语言运行、调试环境及方法。
2.掌握子程序的设计方法。
3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。
二、实验内容根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。
1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。
2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。
请编程完成此功能。
数据缓冲区参考数据定义如下:EXAMSCORE DB 01 ;学号DB 89,76,54,77,99 ;单科成绩DW ? ;该学生的总分DB 02 ;学号DB 79,88,64,97,92 ;单科成绩DW ? ;该学生的总分三、实验报告要求1.程序算法流程图。
2.源程序清单。
3.程序运行结果。
4.调试过程中遇到的问题和解决的方法。
实验4 综合程序设计一、实验目的与要求1.熟悉汇编语言运行、调试环境及方法。
2.掌握汇编语言程序的设计方法。
3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。
二、实验内容根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。
1. 编写汇编程序接收用户从键盘键入的月份数,在终端上显示该月的英文缩写名。
当用户按下ESC键时,程序退出,返回DOS。
参考程序执行过程如下:month?5↙MAY month?9↙SEP month?2. 按15行×16列的表格形式显示ASCII码为10H~FFH的所有字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII码为0)分隔。
3.在第2题程序的基础上进行修改。
将显示表格的行、列数由固定的15行16列改为由用户从键盘输入。
然后,按用户输入的行列值进行显示。
4.编写汇编程序将内存数据区保存的若干个带符号16位数据按从大到小的顺序排列后,以十进制真值的形式在屏幕上显示。
三、实验报告要求1.程序算法流程图。
2.源程序清单。
3.程序运行结果。
4.调试过程中遇到的问题和解决的方法。
源程序:1.1****************************************************************** DATA SEGMENTx DB 3y DB 1z dw ?w db 23r db 6DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXmov al,wsub al,[x]cbwmov bl,5idiv blsub al,[y]mov bl,radd bl,2imul blmov [z],axMOV AH,4CHINT 21HCODE ENDSEND START1.2****************************************************************** DATA SEGMENTx db 63y db ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXmov al,[x]shr dl,1shr al,1rcl dl,1mov [y],dlMOV AH,4CHINT 21HCODE ENDSEND START2.1****************************************************************** DATA SEGMENTSTRING DB 'g3tRfdtf TR34'MESSAGEONE DB 'Please input the number of string(<10):$'MESSAGETWO DB 'The number of string is:$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXmov ah,9mov dx,offset messageoneint 21hMOV AH,1INT 21HMOV BL,ALMOV DL,10MOV AH,2INT 21HSUB BL,30HCBWMOV CX,BXMOV AL,0MOV BX,OFFSET STRINGBEGIN:MOV DL,[BX]CMP DL,'a'JB RECMP DL,'z'JA REINC ALRE:INC BXLOOP BEGINADD AL,30Hmov bl,almov ah,9mov dx,offset messagetwoint 21hMOV DL,BLMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START2.2****************************************************************** DATA SEGMENTMAXLEN DB 32ACTLEN DB ?STRINGONE DB 32 DUP(?)STRINGTWO DB 32 DUP(?)MESSAGEONE DB 'Please input the string(<31):$'MESSAGETWO DB 'The encryptic string is:$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXmov ah,9mov dx,offset messageoneint 21hMOV DX,OFFSET MAXLENMOV AH,0AHINT 21HSUB CH,CHMOV CL,ACTLENADD DX,2MOV BX,DXMOV BP,OFFSET STRINGTWOMOV DL,10MOV AH,2INT 21HBEGIN:MOV DL,[BX]SUB DL,20HMOV [BP],DLINC BXINC BPLOOP BEGINmov AL,'$'MOV [BP],ALmov ah,9mov dx,offset messagetwoint 21hMOV AH,9MOV DX,OFFSET STRINGTWOINT 21HMOV AH,4CHINT 21HCODE ENDSEND START3.1****************************************************************** CODE SEGMENTMAIN PROC FARASSUME CS:CODESTART:PUSH DSSUB AX,AXPUSH AXMOV AX,0101111010010101BCALL DISPDECCALL CRLFCALL DISPHEXRETMAIN ENDPDISPDEC PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV BX,AXMOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1DCALL DEC_DIVPOPFPOP DXPOP CXPOP BXPOP AXRETDEC_DIV PROC NEAR MOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,2INT 21HRETDEC_DIV ENDP DISPDEC ENDPDISPHEX PROC NEAR PUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV BX,AXMOV CH,4MOV CL,4 ROTATE:ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7H PRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATEPOPFPOP DXPOP CXPOP BXPOP AXRETDISPHEX ENDPCRLF PROC NEARPUSH AXPUSH DXMOV DL,0AHMOV AH,2INT 21HPOP DXPOP AXRETCRLF ENDPCODE ENDSEND START3.2****************************************************************** DATA SEGMENTEXAMSCORE DB 01DB 89,76,54,77,99DW ?DB 02DB 79,88,64,97,92DW ?DB 03DB 43,45,67,87,98DW ?DB 04DB 76,65,27,76,98DW ?DB 05DB 67,78,23,87,87DW ?DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV CX,5MOV BX,OFFSET EXAMSCORE RE:INC BXCALL SUMCALL DISPDECCALL CRLFADD BX,2LOOP RERETMAIN ENDPSUM PROC NEARPUSH CXPUSH DXPUSHFMOV AX,0MOV CX,5BEGAIN:MOV DL,[BX]MOV DH,0ADC AX,DXINC BXLOOP BEGAINMOV [BX],AXPOPFPOP DXPOP CXRETSUM ENDPDISPDEC PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV BX,AXMOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1DCALL DEC_DIVPOPFPOP DXPOP CXPOP BXPOP AXRETDEC_DIV PROC NEARMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,2INT 21HRETDEC_DIV ENDPDISPDEC ENDPCRLF PROC NEARPUSH AXPUSH DXMOV DL,0AHMOV AH,2INT 21HPOP DXPOP AXRETCRLF ENDPCODE ENDSEND START实验3扩展************************************************************;**********************************data segmentstring0 db 'error!$'string1 db 'input dec number:$'string2 db 'input hex number:$'string301 db 'output dec number(1):$' string302 db 'output dec number(2):$' X DB 5 DUP(?)string4 db 'output hex number:$'data ends;***********************************;*********************************** CODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXCALL KEY_DECCALL CRLFCALL DISPDECCALL CRLFCALL DISPDECZCALL CRLFCALL DISPHEXCALL CRLFCALL KEY_HEXCALL CRLFCALL DISPDECCALL CRLFCALL DISPDECZCALL CRLFCALL DISPHEXRETMAIN ENDP;********************************;********************************;输入十进制数并用二进制存储在BX中KEY_DEC PROC NEARPUSH AXPUSH CXPUSH DXPUSHFREERR:MOV DX,OFFSET STRING1MOV AH,9INT 21HMOV BX,0DEC_RE:MOV AH,1INT 21HCMP AL,0DHJE DEC_EXITSUB AL,30HJL DEC_ERRCMP AL,9JG DEC_ERRCBWXCHG AX,BXMOV CX,10MUL CXXCHG AX,BXADD BX,AXJMP DEC_REDEC_ERR:CALL ERRORJMP REERRDEC_EXIT:POPFPOP DXPOP CXPOP AXRETKEY_DEC ENDP;**********************************;********************************** ;输入十六进制数并用二进制存储在BX中KEY_HEX PROC NEARPUSH AXPUSH CXPUSH DXPUSHFHEX_REERR:MOV DX,OFFSET STRING2MOV AH,9INT 21HMOV BX,0HEX_RE:MOV AH,1INT 21HCMP AL,0DHJE HEX_EXITSUB AL,30HJL HEX_ERRCMP AL,0AHJL NEXTSUB AL,7CMP AL,0AHJL HEX_ERRCMP AL,10HJL NEXTSUB AL,20HCMP AL,0AHJL HEX_ERRCMP AL,10HJNL HEX_ERRNEXT:MOV CL,4SHL BX,CLMOV AH,0ADD BX,AXJMP HEX_REHEX_ERR:CALL ERRORJMP HEX_REERRHEX_EXIT:POPFPOP DXPOP CXPOP AXRETKEY_HEX ENDP;********************************;******************************** ;用十进制输出BX中二进制的数方法一DISPDEC PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV DX,OFFSET STRING301MOV AH,9INT 21HMOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1DCALL DEC_DIVPOPFPOP DXPOP CXPOP BXPOP AXRETDEC_DIV PROC NEARMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,2INT 21HRETDEC_DIV ENDPDISPDEC ENDP;**********************************;********************************** ;用十进制输出BX中二进制的数方法二DISPDECZ PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV DX,OFFSET STRING302MOV AH,9INT 21HMOV AX,BXmov BX,0dispdecz_re:MOV DX,0MOV CX,10DDIV CXMOV X[BX],DLINC BXcmp ax,0JNE DISPDECZ_REdispdecz_next:CMP BX,0JE DISPDECZ_EXITDEC BXMOV DL,X[BX]ADD DL,30HMOV AH,2INT 21HJMP DISPDECZ_NEXTDISPDECZ_EXIT:POPFPOP DXPOP CXPOP BXPOP AXRETDISPDECZ ENDP;******************************;******************************* ;用十六进制输出BX中二进制数DISPHEX PROC NEARPUSH AXPUSH CXPUSH DXPUSHFMOV DX,OFFSET STRING4MOV AH,9INT 21HMOV CH,4MOV CL,4ROTATE:ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7HPRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATEPOPFPOP DXPOP CXPOP AXRETDISPHEX ENDP;******************************;****************************** ;输出换行符CRLF PROC NEARPUSH AXPUSH DXMOV DL,0AHMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HPOP DXPOP AXRETCRLF ENDP;********************************;******************************** ;输出错误提示ERROR PROC NEARPUSH AXPUSH DXPUSHFCALL CRLFMOV DX,OFFSET STRING0MOV AH,9INT 21HCALL CRLFPOPFPOP DXPOP AXRETERROR ENDP;********************************;********************************CODE ENDSEND START4.1****************************************************************** DATA SEGMENTMONTH DB'JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DE C'NUM DB 2 DUP(?)STRONE DB 'month?',10,'$'STRTWO DB 'month ERROR!',10,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXBEGIN:MOV DX,OFFSET STRONEMOV AH,9INT 21HMOV BX,0MOV [NUM],BLMOV [NUM+1],BLRE:MOV AH,1INT 21HCMP AL,1BHJE EXITCMP AL,0DHJE NEXTCMP AL,30HJB ERRORCMP AL,39HJA ERRORCMP BX,2JZ ERRORMOV NUM[BX],ALINC BXJMP RENEXT:MOV AL,[NUM]SUB AL,30HJE ERRORMOV BL,[NUM+1]CMP BL,0JE GOSUB BL,30HMOV AH,10MUL AHADD AL,BLCMP AL,12JA ERRORGO:MOV CX,3DEC ALMOV AH,3MUL AHMOV BX,OFFSET MONTHADD BX,AXMOV DL,10MOV AH,2INT 21HOUTPUT:MOV DL,[BX]MOV AH,2INT 21HINC BXLOOP OUTPUTMOV DL,0AHMOV AH,2... INT 21H JMP BEGINERROR:MOV DL,0AHMOV AH,2INT 21HMOV DX,OFFSET STRTWOMOV AH,9INT 21HJMP BEGINEXIT:MOV AH,4CHINT 21HCODE ENDSEND START4.2****************************************************************** CODE SEGMENTASSUME CS:CODESTART:MOV bh,15MOV BL,0FHREONE:MOV CX,16RETWO:INC BLMOV AH,2MOV DL,BLINT 21HMOV DL,0INT 21HLOOP RETWOMOV AH,2MOV DL,0AHINT 21HDEC bhJNZ REONEMOV AH,4CHINT 21HCODE ENDSEND START。