8086汇编语言程序设计
- 格式:doc
- 大小:58.00 KB
- 文档页数:21
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汇编语⾔程序设计——第⼀个程序本系列以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,这就是断点(所谓断点,就是程序执⾏到该处停下来不再继续)。
汇编语言程序设计实验报告汇编语言程序设计实验报告引言:汇编语言是计算机中最基本的语言,通常用于处理硬件相关问题。
在这个实验中,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
以下是我们的实验报告。
正文:1. 实验环境我们使用的实验环境是Intel 8086微处理器与高级汇编语言。
微处理器使用的是PCB-512主板,而高级汇编语言是MASM。
2. 实验目的我们的实验目的主要是学习汇编语言的基础知识和编程技巧,包括了汇编语言的寄存器、指令、内存管理等方面的知识。
我们的另一个目的是掌握汇编语言的常用编程技巧,能够独立完成一些简单的汇编程序。
3. 实验内容我们的实验内容主要包括以下几点:(1)学习汇编语言的基础知识,包括寄存器、指令、内存管理等方面的知识。
(2)掌握汇编语言的常用编程技巧,包括数据输入输出、运算、跳转等基本操作。
(3)实践用汇编语言编写程序,如计算器、菜单等实用程序。
(4)了解8086微处理器的结构和原理。
4. 实验过程在这个实验过程中,我们完成了以下几个程序:(1)计算器计算器是一个简单的程序,主要用于实现两个数之间的加、减、乘、除等基本运算。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
(2)菜单菜单是一个实用程序,主要用于展示一个简单的菜单并实现用户选择相关功能的功能。
我们使用了汇编语言中的跳转指令、输入输出指令等实现了这个程序。
5. 实验结果在我们的实验中,我们成功完成了上述两个程序。
我们通过输入输出指令、存储指令等指令实现了这个程序的功能。
6. 实验总结在这个实验过程中,我们学习汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
我们通过编写计算器和菜单等简单实用程序,加深了对汇编语言的理解和认识。
我们认为这个实验对我们今后的学习和工作都有很大的帮助。
结论:通过这个实验,我们学习了汇编语言的基础知识和编程技巧,并实践了用汇编语言编写程序的方法和技巧。
一、计算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。
汇编语言程序设计实验指导【实验提要】以下列举的10个实验,都是以Intel的8086及后续系列微处理器的指令系统为核心,采用宏汇编工具MASM6. X以及调试工具DEBUG或DEBUG32,针对本教材所述内容进行相关的上机实践。
旨在帮助学生加深认识和理解理论教学知识,通过大量的上机实验熟悉8086 CPU的指令功能、用途和使用技巧,进而提高汇编语言程序设计的能力。
(带*号的为选作内容)实验一调试工具DEBUG的应用实验目的通过实验掌握下列知识:1、8086指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG的功能;2、DEBUG命令: A,D,E,F,H,R,T,U的使用;3、BCD码、ASCII码及用十六进制数表示二进制码的方法;4、寄存器: AX,BX,CX,DX,FLAGS,IP。
内容及步骤注:本次实验可以参照教材上关于DEBUG的叙述内容进行。
一、DEBUG 命令使用1、开机后,切换到命令提示符窗口下,出现提示符后键入命令DEBUG, 进入调试环境,显示提示符 '- '。
2、用命令 F 200 220 'AB' 将'AB'的两个ASCII码循环填入内存。
注:第一个参数200是当前段的起始偏移地址,第二个参数220是终了偏移地址,第三个参数‘AB’是被填入的数值,若不给出第二个参数则填入128(8行)个字节。
3、用命令 D200 观察内存中的十六进制码及屏幕右边的ASCII字符。
4、用命令 F230 23F 12 重复上二项实验,观察结果并比较。
5、用命令 E200 41 42 43 44 45将A-E的ASCII码写入地址为200开始的内存单元中,再用D命令观察结果,看键入的十六进制数和ASCII码的对应关系。
6、用H命令检查下列各组十六进制数的和与差(补码表示):(1)56H,34H (2)23H,45H (3)AB,3045H注:输入 H 12 34 则在下一行显示0046 FFDE,即二者的补码和与差。
《汇编语言程序设计》复习资料一、基本概念1、8088/8086CPU内部寄存器有__14____个,其中的AX、BX、CX、DX是通用寄存器,SP、BP、DI、SI 是基址和变址寄存器,CS、DS、ES、SS、是段寄存器,此外还有指令指针寄存器 IP 和标志位寄存器 FLAGS 两个控制寄存器,所有寄存器都是 16 _位寄存器,每个寄存器可以存放 16 位二进制数。
2、8088/8086CPU的标志位寄存器中有9个标志位,其中的DF、IF、TF是控制标志,OF、SF、ZF、CF、AF、PF 是状态标志。
3、8088/8086CPU有三组总线,它们是数据总线、控制总线和地址总线;地址总线是 20 条,因此它可以寻址的范围是 1M 字节。
通常将 1024 字节称为1K,将 1024K 字节称为1M。
4、8088/8086CPU的存储器采用分段方式管理,每个段最多可以有 64K 字节,全部存储空间可以分成 16 个大小为64K且互相不重叠的段。
5、采用分段方式管理的存储单元的地址分成物理地址和逻辑地址两种,逻辑地址由段地址和偏移地址两部分构成,段地址是每个存储器段的起始地址;偏移地址则是相对于每个段第一个存储单元的偏移值。
段地址存放在段寄存器中,由于8088/8086CPU的段寄存器是16位寄存器,因此在段寄存器中存放的是段地址的 16 位;而CPU对数据的存取是按物理地址进行的,物理地址和逻辑地址间的关系是__ 物理地址=段地址 16D(或10H)+ 偏移地址___。
6、存储器中,数据是以字节为单位存放的,它是一个 8位二进制数,16位二进制数是 2个字节,又称为字;每个存储单元可以存放一个字节;一个字则占用两个存储单元,存放时要将低字节放在地址较小的存储单元中。
7、计算机的指令由操作码字段和操作数字段构成,它们分别给出计算机所要执行的操作和执行操作所要的操作数。
8、指令操作数通常可以存放在指令中,也可以存放在CPU的寄存器中,大多数存放在存储器中,它们分别称为立即数、寄存器操作数和存储器操作数。
实验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。