1、1,典型中断处理程序结构应包括 CPU 中断响应,保护现场,开中断, 执行中断服务程序,关中断,恢复现场,开中断,返回等部分。2,按照总线的规模,用途及其应用场合,总线分为数据总线,地址总线,控制总线3,串行接口 RS-232C 关于机械特性的要求,规定使用一个 9 根插针的标准连接器 4,CPU 与 I/O 接口间传送的信息一般包括数据信息,状态信息,控制信息 3 种类型。3 类信息的传送方向分别应是(从哪到哪)CPUI/O,CPUI/O,CPUI/O5,输入/输出端口有 2 种编址方法,即 I/O 端口与存储器单元统一编址和 I/O 端口单独编址,前一种编址的主要优点是 1,CPU 对外设
2、的操作可使用全部的存储器操作指令 2,由于 I/O 端口的地址空间是内存空间的一部分,这样 I/O 端口的地址空间可大可小从而使外设的数目几乎不受限制,而只受总存储量的限制,从而大大的增加了系统的吞吐率 3,不需要专门的输入/输出指令,降低了对操作码的解码难度6,8088 系统中外围设备请求总线控制权是通过 HOLD 进行的7,8086 通过中断控制器最多可望管理外部中断的个数为 2568,CPU 的 ALU 的主要完成算数,逻辑运算及位移操作9,若设某容量为 2K 字节的 RAM 起始地址为 1000H,则其终止地址为 17FFH10,8088/8086 系统中外围设备可屏蔽中断请求是通过
3、INTR 进行的可编程定时/计数器 8253 的工作方式共有 6 种,其中 3 个定时/计数器通道,3 个地址寄存器11 CPU 马上响应中断的必要条件之一是一条指令执行完毕后12 CPU 与 I/O 接口间信息传送的方式有无条件传送,查询传送,中断传送,DMA 传送,DMA 传送方式为快速传递方式13,8086/8088 的中断响应用了 2 个总线周期,从 INTA 引脚输出 2 个负脉冲,第 1 个总线周期完成 AD15-AD0 浮空,通知中断源,准备中断类型码,复位中断请求信号,第 2 个总线周期完成被响应的外设(或接口芯片)向数据总线 AD7-AD0 输送一个字节的中断类型码14,在
4、Intel 8253A 中通过对其中一个控制端口的编程设定和控制工作方式,其端口地址是当A1A0=11 时的地址,而内存单元的有效偏移地址可由直接寻址方式,寄存器间接寻址方式,寄存器相对寻址方式,变址寻址方式,基址寻址方式,相对基址变址寻址方式15,8088CPU 有 20 根外部地址线,8 根外部数据线,其存储器分段管理,每段最大 64KB,段基地址在段寄存器组中16,8088CPU 工作在最大模式,必须将 CPU 的引脚 MN/MX 接地(MN/MX=0)17,8088CPU 工作在最大模式时,MN/MX=1,用 8288 对 S2,S1,S0 信号译码产生相应的总线控制信号18,8086
5、 对外部请求相应优先级最高的请求是 HOLD19,个人计算机 I/O 寻址空间大小一般为 64K20,一个程序可包含四个段,代码段包含可执行的指令,堆栈段包含一个后进先出的数据警戒区,用于保护子程序调用时的段现场地址,和现场 IP 信息在宏汇编语言源程序中指令 MOV AX,2345 经汇编后变成 MOV AX,0929H(用指令表示)在 DEBUG调试程序中执行该指令后(AX)=2345H 宏汇编默认十进制,DEBUG 默认十六进制21,8088CPU 在执行指令 INT 13H 时,断点地址压栈后,将转而执行中断服务子程序,入口地址存入在内存的 0004CH 单元到 0004FH 单元,其
6、中低地址的字送至寄存器 IP 中,高地址字送至寄存器 CS 中22,若寄存器 DL 内容为 2AH,PORT_VAL 为端口 13H 的符号名,宏汇编语言系统对指令AND DL,PORT_VAL AND OFEH 汇编后产生的语句为 AND DL,12H,DL 内容为 2AH,执行指令后DL=02H23,在串行通信方式中,有两种最基本的通信方式是异步通信(ASYNC)方式,同步通信方式24.8086/8088 中,一个最基本的总线周期由 4 个时钟周期(T 状态)组成,在 T1 状态,CPU 往总线发出地址信息25,8086/8088 复位后从 FFFF0H 地址处开始执行程序26, 在堆栈内
7、,有效地址为 2500H 到 2505H 单元内依次存放 10H,20H,30H,40H,50H,60H 六个数,已知 SP=2502H,执行 POP BX 后,有 SP=2504H,BX=4030H27,能完成将 AL 寄存器清零的有 SUB AL,AL XOR AL,AL MOV AL,028,8086 的内存空间和 I/O 空间是单独编址的,分别是 1MB 和 64KB29,8086 内部由执行单元(EU)和总线接口单元(BIU)两部分组成,其作用分别是从 BIU 中获得指令并执行和从内存储器的指定区域中取出指令送到指令队列中去排队30,8086 的基址加变址寻址方式中,基址寄存器可以是
8、 BX,BP,变址寄存器可以是 SI 和 DI31,标号和变量均是汇源程序中的符号地址,其中标号指向的内存单元中存放的是指令,而变量指向的内存单元中存放的是数据。若 VAR 为一变量,LAB 为一标号,则:JMP LAB 和JMP VAR 两条指令中,只有 JMP LAB 是合法的32,8086/8088 输出指令 OUT DX,AX 的执行结果是将 AX 内容送至(DX)指定 I/O 接口地址33,8086/8088 提供的能接受外部中断请示信号引脚是 NMI 和 INTR,两种请示信号的主要不同处在于 INTR 为可屏蔽中断请求,NMI 为非屏蔽中断请求34,8086 有两种工作模式,即最
9、小模式和最大模式,它由 MN/MX 决定,最小模式的特点是 CPU提供全部的控制信号,最大模式的特点是需总线控制器 828835,8086/8088 系统要锁存 20 位地址和 BHE 信号,需要 3 个 8282 作地址锁存器。除了 8282 之外,8086/8088 系统中也常用 74LS373 作为地址锁存器36,当 M/IO=“0“,RD=“0“,WR=“1“时,CPU 完成的操作为 I/O 读37,在一般微处理器中,算术逻辑单元包含在中央处理器(CPU)内38,8086CPU 认可中断后,CPU 自动执行 1,存下程序计数器 2,存下状态寄存器 3,暂不接受较低优先级别的中断简答1、
10、8088 的寻址方式有哪些?他们各有何特点?分别举例说明答:1 立即寻址方式 :其所提供的操作数直接包含在指令中,与操作码一起放在代码段存储器的区域中,这个操作数称为立即数 eg.MOV AL,57H。2,寄存器寻址方式:要寻找的操作数存放在 CPU 内部某个寄存器中,指令中直接使用寄存器名 eg.MOV AX,BX。3,直接寻址方式:其源操作数为 16 位偏移地址(有直接地址和标号地址两种形式)eg.MOV AX,2000H。4,寄存器间接寻址方式:操作数存放在存储器中,操作数的 16 位段内偏移地址放在 SI,DI 和 BP,BX 中的一个寄存器 eg.MOV AL,SI。5,寄存器相对寻
11、址方式:存放实际操作数的存储器地址值为指令中的变址寄存器 SI,DI 和 BP,BX 中的一个寄存器的内容与指令中给定的相对位置之和 eg.MOV AX,SI+1000H。6,基址变址寻址方式:BX 和 BP 作为基址寄存器,SI 和 DI 作为变址寄存器,将这两种寄存器联合起来进行的寻址 eg.MOV AX,BX+DI。7,相对基址变址寻址方式 eg.MOV AX,DISPBX+DI。8,隐含寻址方式二,简述中断响应,服务,以及返回过程,并以 INT 25H 为例,说明中断向量表的作用答:1,描述中断响应及处理过程 6 步:关中断保留断点保护现场给出中断入口,转入相应的中断服务程序恢复现场开
12、中断与返回(流程图表示更好)2,中断向量表的作用:8086/8088 在内存的 00000H-003FFH 的 1K 空间建立了中断向量表,可以容纳 256 个中断向量(或 256 个中断类型)每个中断向量占用 4 个字节,在这 4 个字节中,包含着这个中断向量(或这种中断类型)的服务程序的入口地址,其中前两个字节为服务程序的 IP,后两个字节为服务程序的 CS,例如:INT 25H,在内存的 00094H-00095H 保存该中断服务程序入口地址 IP,00096H-00097H 保存该中断服务程序入口地址 CS。(图示表达此意思即可)1,8088 的中断系统是如何构成的?2,为什么使用中断
13、技术?3,中断处理过程以及 CPU 进入中断服务程序的过程,4,中断向量表的作用答:中断系统是由系统响应及中断处理过程组成。当 CPU 与外设工作不同步时,很难确保 CPU在对外设进行读写操作时,外设一定是准备好的。为确保数据的正确传输,CPU 而已主动的查询外设以确定其工作状态,但这样会使 CPU 效率降低,为解决上述问题,引入中断技术。上题1,顺序:中断源识别-中断优先级判断-中断嵌套管理-CPU 中断响应-中断服务-中断返回 4 ,上题 2,三,INTR,NMI 有何异同NMI:引入的是不可屏蔽中断请求,采用边沿触发,高电平有效,中断一旦产生立即锁存,到CPU 执行完当前指令后立即响应。
14、该中断的服务子程序的入口地址从偏移地址为“2*4”的中断服务入口地址表中的到,并直接专区执行服务,CPU 不进入 INTA 周期。主要处理系统的意外和故障,如电源掉电,存储器读写错或受到严重的干扰。INTR:引入的是可屏蔽中断请求,电平触发,高电平有效。此中断发生后,CPU 在当前指令执行后,首先检测标志寄存器的 IF 标志位时候置“1”,若“IF=1”CPU 才能响应这一类中断,并通过 INTA 管脚向产生中断请求的中断源发送两个中断响应负脉冲,若“IF=0”则屏蔽所有此类中断。此类中断要求提出中断的设备提供其长度为 8 位的中断类型号,在受到第二个 INTA 负脉冲时送到数据总线即可。该中
15、断的服务子程序的入口地址也通过从偏移地址为“中断类型号*4”的中断服务入口地址表中得到,然后再转去服务。四,为什么要插入 Tw 以及如何处理这种情况?为了解决快速 CPU 与任何速度的存储器或 I/O 设备之间传递速度的时序配合,【当 CPU 对存储区活 I/O 设备进行操作时,若到数据未准备好时,可用一个产生 Ready 信号的电路,使在 T3和 T4 之间产生 1 个或几个 Tw 来解决时序配合问题,在 T3 周期开始采样 Ready 信号,若其为低,则表示被访问的存储器或 I/O 设备未准备好,则在 T3 结束之后不进入 T4,而插入一个 Tw 状态,以后再每个 Tw 周期前沿采样 Re
16、ady 线,直至 Ready 便有有效(高电平)时 Tw 周期才结束,进入 T4 周期,完成数据传送五,ROM 概念:(1)掩膜型 ROM(MROM):用掩膜工艺制造,用定做的掩膜对存储器进行编程,一旦制造完毕,内容固定不能修改(2)可编程 ROM(PROM)由厂家生产出“空白”存储器,用户根据需要,采用特殊方法写入程序和数据,对存储器进行编程,但只能写入一次,写入信息固定,不能更改(3)可擦除的 PROM(EPROM)这种存储器可由用户按规定的方法多次编程,可用紫外线灯制作的擦抹器照射 15min 后芯片中的信息被擦除,成为块干净的 EPROM,可再次写入信息(4)电擦除的 EPROM(EE
17、PROM)能用特定的电信号以字节为单位进行擦除和改写(5)FLASH MEMORY六,SRAM,DRAM 的工作原理,掌握为什么 DRAM 需定时刷新DRAM:写入操作时选择信号“1”,讲数据线上的信息经过导通的 Q1 存入分布电容 Cg 中,若数据线上写入的信息为 1,则 Cg 被充电为高电平,若数据线上的信息为 0,则 Cg 被放电为低电平。读出时,根据行地址译码,使某一行选择线为高电平本行上所有的基本存储电路中的管子 Q 导通,连在每一列上的刷新放大器读取对应存储电容 Cg 上的电压值【因为依靠寄生电容存储电荷来存储消息,由于电容 C 上电流的泄露现象,使电容 C 上的电荷只能保持一段时
18、间,信息在一定时间内会自然丢失,故必须定时刷新,刷新时间通常为 2ms 其作用是使原来处于“1”状态的电容得到电荷补充,而原来处于“0”状态的电容维持“0”状态SRAM:RAM 采用由 6 个晶体管组成的触发器电路组成一个二进制信息的存储单元,写入时,当x 行地址线和 y 列地址线选中 SRAM 六管存储电路,则 T5-T8 导通,若写入数据 D=1,持续不变,即存储了一位信息“1”,读出时,当六管存储器电路存储了信息“1”,则 A=1,D=1,信息被读出七,掌握线性选择和地址译码法(线选,部分译码,全译码)以及产生地址的特点(是否连续)优缺点片选控制方法:1,线选法:除将低位地址直接接到片内
19、地址线外,将其余的高位地址线分别直接作为各个存储器芯片的片选控制信号,而不需要复杂的逻辑译码电路(这些片选地址线在每次寻址时只能有一位有效,不能同时有多位有效)节省译码电路,但是必须要注意他们的地址分布,以及各自的地址重叠区,且不连续 2,部分译码法:存储器芯片的地址线与微机系统总线的地址线依次相接后,剩余的高位地址仅用一部分参加译码,缺点:使存储器芯片的地址空间有重叠,造成了存储器空间的资源浪费,优点:译码电路简单,适用于大容量的 RAM 的连接,连接是连续的 3,全译码法:M 芯片的地址线和微机系统的地址线依次相接后,剩余的高位地址线全部参加译码。优点:M 芯片上的地址空间唯一确定,连接是
20、连续的。缺点:译码电路相对复杂八,计算机内部结构EU 单元中包括 4 个 16 位通用寄存器,AX,BX,CX,DX,AX 为累加器,BX 为基址寄存器,CX 为计数寄存器,DX 为数据寄存器。2 个 16 位指针寄存器 SP 和 BP,SP 用来存放现行堆栈段内偏移地址,并具有步进加 1 和减 1 的功能,称为堆栈指针,BP 称为基址指针。2 个变址寄存器为 SI 和DI,SI 用来寄放源操作数段内偏移量,DI 用来存放目标数段内偏移量。BIU 单元有 4 个段寄存器 CS,DS,SS 和 ES,CS 用来存放当前代码段的基地址,DS 用来存放当前数据段的基地址,SS用来存放堆栈段的基地址,
21、ES 用来存放当前附加段的基地址。存储器对应输入输出方式的优点和缺点: 优点: 内存和外设的地址由一个译码器解决,不需专门的 I/O 指令,全部存储器指令都可用,指令多,使用方便(输入,输出不只局限于累加器); 缺点:占用内存空间,寻址的地址字节增加,增加 了指令的执行时间。存储器对应输入输出方式:也称为 I/0 统一编地址:把一个外设端口当作存 储器的一个单元来看待,每个外设端口占有存储器的一个地址。 从外设输入一个数据,看作存储器一次读操作; 向外设输出一个数据,看作存储器一次写操作; 1,编程实现模拟计算机开机密码输入过程,即显示 i Please input(1-6)password:
22、i,等待用户输入密码(1-6 位),即在用户在输入不足 6 位密码时,敲回车即停止输入,每输入一个字符显示一个 i*i,要求把输入的口令简单加密后存储在 buffer 为起始单元的内存区域,密码加密的方法为把输入字符 ASCII 码循环左移 3 位,例如字符 i0i,ASCII 码为 30H,要求存储信息为 81H,请书写汇编语言源程序DATA SEGMENTINFO DB “Please input(1-6)password:“,“$“BUFFER DB 6 DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATAMAIN PROC
23、 FARBEGIN: PUSH DS MOV AX,0000HPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXLEA BX,BUFFER MOV AH,09HLEA DX,INFOINT 21HMOV DI,06HINPUT1:MOV AH,07HINT 21HCMP AL,0DHJZ OVERMOV CL,03HROL AL,CLMOV BX,ALMOV DL,“*“MOV AH,02HINT 21HINC BXDEC DIJNZ INPUT1OVER:MOV AH,4CHINT 21HRETMAIN ENDPCODE ENDSEND BEGIN2 实现在 CRT 上
24、循环显示 0-9 共 50 次DATA SEGMENTchar db0123456789,$BUFFER DB 50 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATAMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV CX,50M: MOV DX, OFFSET CHARMOV AH,09HINT 21HMOV SI,035FFHM1: MOV BX,0FFFFHM0: DEC BXJNZ M0DEC SIJNZ M1DEC CXJNZ MMAIN ENSPCOD
25、E ENDSEND START加密:DATA SEGMENTMESS DB Password:,$BUFFER DB 6 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AX;初始化数据段LEA DX,MESSMOV AH,09H;字符串显示INT 21HLEA BX,BUFFERMOV CX,6M: MOV AH,07H;键盘输入无回显INT 21HMOV BX,AL;保存加密后密码INC BXMOV DL,BXMOV AH
26、,02H;显示输出MOV DL,*INT 21H;显示*LOOP MRETMAIN ENDPCODE ENDSEND STARTA 口输入,B 口输出:assume cs:code code segment public org 100h start: mov dx,04a6h ;8255 控制端口地址 mov ax, 90h out dx, ax ;设置 A 口输入,B 口输出startl: mov dx, 04a0h ;A 口地址 in ax, dx ;读开关量 mov dx, 04a2h ;B 口地址 out dx, ax ;写发光二极管状态 jmp startl code ends e
27、nd start 为什么 8255A 要提供三种工作方式 ? 为了满足并行输入输出的不同需要,实现可靠的数据传输。若不需要考虑外部设备的状态,则可以选择方式 0,若需要考虑外部设备的状态就需要用选通输入 输出,方式 1,若需要双向传送则需要用方式 2。 定义数据区 BUFFER1(5 个字节数) ,BUFFER2(5 个字节数) ,BUFFER3(保留 5 个字节) ,实现 BUFFER1 区的第 1 个数与 BUFFER2 区的第 5 个数相加,BUFFER1 区的第 2 个数与BUFFER2 区的第 4 个数相加 直到实现 BUFFER1 区的第 5 个数与 BUFFER2 区的第 1 个
28、数相加,且结果依次存储在 BUFFER3 区。Data segment Buffer1 db x0, x1, x2!-x4Buffer2 db y0, y1, y2!-4 Buffer3 db 100 dup (?) Data ends Code segment Assume cs: code, ds: data, es: data Main proc far Begin: push ds mov ax,0000h push ax mov ax, data mov ds, ax ;初始化数据段 mov es, ax ;初始化附加段 lea si, buffer1 lea bx, buffer2
29、 LED 显示开关状态assume cs:code code segment public org 100h start:mov dx,04a0h ; 74LS244 地址 in al,dx ;读输入开关量 mov dx,04b0 ;74LS273 地址 out dx,al 输出至 LED jmp start code ends end start 8255A 的典型应用编程CODE SEGMENT ASSUME CS:CODE, DS:DATA MAIN PROC FAR START: PUSH DS MOVAX,0 PUSH AX MOV AL,90H ;方式控制字 MOV DX,22BH
30、 OUT DX,AL add bx, 4 lea di, buffer3 mov cx,5 m: mov al, si add al, bx mov di, al inc si dec bx inc di dec cx jnz m mov ah,4ch int 21h ;返回 DOS ret Main endp Code ends end begin LED 流水显示assume cs: codecode segment public org 100hstart: mov al, 01h;读输入开关s1: mov dx,04b0h ;74LS273 地址out dx, al ;输出至 LEDR
31、ol al,01hcall delayJmp s1code endsend startLP: MOV DX,228H IN AL,DX ;读入 A 口开关状态 MOV DX,229H OUT DX,AL ;B 口输出 JMP LP RET MAIN ENDP CODE ENDS END START ASSUME CS:CODECODE SEGMENT PUBLICORG 100HSTART: MOV DX,04A6H ;8255 控制端口地址MOV AL,0B4HOUT DX,AL ;设置 A 口输入,B口输出MOV DX,04A4HAG1: IN AL,DXTEST AL,20HJZ AG1
32、MOV DX,04A0H ;A 口地址IN AL,DX ;读开关量MOV BL,ALMOV DX,04A4H ;C 口地址AG2: IN AL,DXTEST AL,02HJZ AG2MOV DX,04A2HMOV AL,BLOUT DX,ALCODE ENDSEND START八个发光管滚动显示code segment org 100hassume cs:codego:mov al,80hmov dx,203hout dx,almov al,01hm: mov dx,201hout dx,al rol al,1call delayjmp mdelay: mov si,6fffhdec sijn
33、z delayretcode endsend go编程实现从键盘输入 20 个以内字符,并换行显示DATA SEGMENTBUFFER DB 20BUFFER1 DB ?BUFFER2 DB 20 DUP(?),“$“DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: PUSH DS MOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA DX,BUFFERMOV AH,0AHINT 21H MOV AH,02HMOV DL,0DHINT 21H MOV AH,02HMOV DL,0AHINT 21
34、H LEA DX,BUFFER2MOV AH,09HINT 21H RET MAIN ENDPCODE ENDSEND START8086/8088 的两种工作方式也称为最小组态和最大组态两种工作组态。最小组态: 系统中只有一片 8088,其存储容量不大,所要连的I/O 端口也不多,总线控制逻辑电路被减到最小。最大组态:构成的系统较大,可能包含不只一片微处理器,或要求有较强的驱动能力,带有一个总线控制器 8288。DOS 软件中断调用过程(1)将功能调用号传送到 AH 中;(2)把调用参数(入口参数)送到规定寄存器或存储器区域中;(3)发中断命令 INT 21H;(4)在返回参数(出口参数)寄
35、存器或存储器区查询执行结果;从键盘输入一个字符回显并保存: DATA SEGMENTBUFFER DB 10 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,BUFFERMOV AH,01HINT 21HMOV BX,AL RETMAIN ENDPCODE ENDSEND START在 CRT 显示器上显示“Hello World!”:DATA SEGMENTBUFFER DB “HELLO WORLD!“,
36、“$“DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATAMAIN PROC FARSTART: PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV AH,09HLEA DX,BUFFERINT 21H ; RETMAIN ENDPCODE ENDSEND STARTDATA SEGMENTFI DB 34567SE DB 76543TH DB 6 DUP(?)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATAMAIN:MOV AX,DATAMOV DS,AXMOV E
37、S,AXLEA SI,FILEA DI,THMOV CL,5CLDCLCPUSHFCICLE:LODSBSUB AL,30HMOV BL,SI+4SUB BL,30HPOPFADC AL,BLAAAPUSHFADD AL,30HSTOSBDEC CLJNZ CICLEMOV AL,0POPFADC AL,0AAAADD AL,30HSTOSBCODE ENDSEND MAIN从键盘输入 10 个字母,并改变大小写换行显示 DATA SEGMENTCRLF DB 0DH,0AH,$MAXLEN DB 11,0,11 DUP(?)CSH1 DB please make sure,$BUFFER D
38、B please put,$jIEG DB 10 DUP(?),$DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXLEA DX,BUFFERMOV AH,9INT 21HMMM: LEA DX,MAXLENMOV AH,0AHINT 21HLEA DX,CRLFMOV AH,9INT 21HLEA BX,JIEGLEA SI,MAXLEN+2MOV CX,10MOV DL,SINAA: CMP DL,zJG CSHCMP DL,aJB DAXSUB DL,20HJMP PPDAX: CMP DL,ZJG CSHCMP DL,AJB CSHADD DL,20HPP: MOV BX,DLINC BXINC SIMOV DL,SILOOP NAALEA DX,JIEGMOV AH,9INT 21HLEA DX,CRLFMOV AH,9INT 21HJMP JSHCSH: LEA DX,CSH1MOV AH,9INT 21HLEA DX,CRLFMOV AH,9INT 21HJMP MMMJSH: MOV AH,4CHINT 21HCODE ENDSEND START