1、35微机原理及接口技术习题及答案第一章习题及答案1. 微处理器内部包含哪三大部分?解:运算器、控制器和寄存器组。2. 完成下列数制的转换10101101B=( )D=( )H解:10101101B=173D=ADH。0.11B=( )D解:0.11B=0.75D。211.25=( )B =( )H解:211.25=11010011.01B=D3.4H。10111.0101B=( )H=( )BCD解:10111.0101B=17.5H=23.3125D=(0010 0011.0011 0001 0010 0101)BCD3. 已知X=+1011010B,Y=0011011B,设机器数为8位,分
2、别写出X、Y的原码、反码和补码。解: 4. 已知X的真值为32,Y的真值为19,求解:5. 已知X=51,Y=86,用补码完成下列运算,并判断是否产生溢出(设字长为8位)。 XY XY XY XY解:X补=00110011BY补=Y反+1=11010110反+1=10101001+1=10101010BX+Y补=X补+Y补=00110011B+10101010B=11011101BX+Y=X+Y补 补=11011101 补=10100010+1=10100011B 10100011B,因为,所以未产生溢出。 11110111B,因为,所以产生溢出。 01110111B,因为,所以产生溢出。 0
3、0100011B,因为,所以未产生溢出。6. 若使与门的输出端输出高电平,则各输入端的状态是什么?解:各输入端为高电平。 7. 若使与非门的输出端输出低电平,则各输入端的状态是什么? 解:各输入端为高电平。8. 如果74LS138译码器的Y4端输出低电平,则C、B、A三个输入端的状态分别是什么?解:C、B、A三个输入端的状态分别是1,0,0。第二章习题及答案1. 8086/8088CPU由哪两大功能部分所组成?简述它们的主要功能?解:8086/8088CPU由EU和BIU两大功能部分组成。执行单元EU主要完成指令的译码和执行。执行单元通过EU控制电路从BIU中取出指令,经过指令译码形成各种定时
4、控制信号,向EU内各功能部件发出相应的控制命令,以完成指令所规定的操作。 总线接口单元BIU是8086/8088同外部联系的接口。它负责所有涉及外部总线的操作,包括取指令、读操作数、写操作数、地址转换和总线控制等。BIU内部设置指令预取队列,每当指令队列有两个或两个以上的字节空间,且执行单元未向BIU申请读/写存储器操作数时,BIU顺序地预取后续指令的代码,并填入指令队列中。当EU执行的是转移指令时,则BIU清除当前的指令预取队列的内容,从新的地址取回指令,并立即送到EU去执行,然后,从后续的指令序列中取回指令填满队列。2. 什么是指令流水线?指令流水线需要哪些硬件支持?解:指令流水线是指80
5、86/8088CPU内部的执行单元EU和总线接口单元BIU通过指令预取队列协同工作从而实现指令的并行执行。指令流水线最主要的硬件支持是BIU内部的指令预取队列。3. 逻辑地址如何转换成物理地址?已知逻辑地址为2D1EH:35B8H,对应的物理地址是什么?解:逻辑地址是段基址和段内偏移地址形式的地址。物理地址段基址16段内偏移已知逻辑地址为2D1EH:35B8H,则对应的物理地址4. 8088和8086的指令预取队列的长度分别是多少?解:8088的指令预取队列的长度为4字节;8086的指令预取队列的长度为6字节。5. 简述8086/8088CPU内部的各寄存器的作用。解:AX、BX、CX和DX通
6、用寄存器一般用于存放参与运算的数据或运算的结果。SP:用于存放堆栈栈顶的段内偏移量。BP:用于存放访问内存时的偏移地址。SP和BP也可以用来存放数据,它们的默认段寄存器都是SS。SI和DI通常在间接寻址方式中存放操作数的偏移地址。在串操作指令中,DI的默认段寄存器是ES。SI和DI也可以用来存放数据。CS:代码段寄存器,用于存放代码段的段基址。DS:数据段寄存器,用于存放数据段的段基址。SS:堆栈段寄存器,用于存放堆栈段的段基址。ES:附加段寄存器,用于存放附加段的段基址。IP:指令指针寄存器,用于存放CPU即将执行的下一条指令在代码段中的段内偏移地址。FLAGS:标志寄存器,用于存放指令执行
7、结果的特征。6. 8086/8088CPU内部的状态标志寄存器共有几位标志位?各位的含义是什么?解:状态标志寄存器共有9位标志位,其中包含6个状态标志位和3个控制标志位。状态标志位:CF(Carry Flag):进位标志。当算术运算结果使最高位产生进位或借位时,则CF=1;否则CF=0。PF(Parity Flag):奇偶标志。若运算结果中的低8位含有偶数个1,则PF=1;否则PF=0。AF(Auxiliary carry Flag):辅助进位标志。运算过程中若D3位向D4有进位或借位时,AF=1;否则AF=0。ZF(Zero Flag):零标志。若运算结果为0,则ZF=1;否则ZF=0。SF
8、(Sign Flag):符号标志。若运算结果为负,则SF=1;否则SF=0。OF(Overflow Flag):溢出标志。当带符号数的补码运算结果超出机器所能表达的范围时,就会产生溢出,这时OF=1;否则OF=0。控制标志位:DF(Direction Flag):方向标志。控制串操作指令的地址变化的方向。当DF=0时,串操作指令的地址指针按增量变化;当DF=1时,串操作指令的地址指针按减量变化。IF(Interrupt Flag):中断允许标志。控制微处理器是否允许响应可屏蔽中断请求。若IF=1,则允许响应;否则禁止响应。TF(Trap Flag):单步标志。TF=1时,CPU工作在单步方式。
9、7. 8086/8088系统中存储器的分段原则是什么?解:分段原则是要求段的起始单元的物理地址是16的整数倍,每段的物理长度为64KB。8. 当ALE有效时,8088的地址/数据总线上将出现什么信息?解:当ALE有效时,8088的地址/数据总线上将出现地址信息。9. READY管脚的作用是什么?解:READY用于微处理器时序中插入等待状态。若该引脚被置为低电平,则微处理器进入等待状态并保持空闲;若该引脚被置为高电平,则它对微处理器的操作不产生影响。CPU在读、写操作时序中的T3时钟周期开始处,通过检测READY管脚的状态来决定是否插入TW等待时钟周期,以解决CPU与存储器或I/O接口之间速度不
10、匹配的矛盾。10. 为什么在基于8086/8088的系统中经常需要使用缓冲器?解:由于基于8086/8088的系统驱动能力的不足,需要使用缓冲器。11. 8088工作在最小模式下包含哪些控制信号?解:最小模式下包含的控制信号有: RD、WR、IO/M、ALE、DT/R、DEN和INTA等信号。12. 若CS=4000H,则当前代码段可寻址的存储空间范围是多少?解:CS=4000H时,当前代码段可寻址的存储空间范围为40000H4FFFFH。第三章习题及答案1. 什么叫寻址方式?8086指令系统中有哪几种寻址方式?解:寻址方式,即获得地址的方法,主要指获得段内偏移地址的方法,段基址常采用默认方式
11、获得。8086CPU指令系统的寻址方式有两类:获得指令中操作数地址的方法。获得要执行的下一条指令的地址的方法。8086指令系统中有8种操作数寻址方式,立即寻址。2. 下列指令中BUFF为字节类型变量,DATA为常量,指出下列指令中源操作数的寻址方式:(1)MOV AX, 1200(2)MOV AL, BUFF(3)SUB BX, 2000H(4)MOV CX, SI(5)MOV DX, DATASI(6)MOV BL, SIBX(7)MOV DI, AX(8)ADD AX, DATADI+BP(9)PUSHF(10)MOV BX, ES:SI解: (1)MOV AX, 1200 ;立即寻址(2
12、)MOV AL, BUFF ;直接寻址(3)SUB BX, 2000H ;直接寻址(4)MOV CX, SI ;寄存器间接寻址(5)MOV DX, DATASI ;寄存器相对寻址(6)MOV BL, SIBX ;基址变址寻址(7)MOV DI, AX ;寄存器寻址(8)ADD AX, DATADI+BP ;基址变址相对寻址(9)PUSHF ;隐含寻址(10)MOV BX, ES:SI;寄存器间接寻址3. 指出下列指令的错误并改正。(1)MOV DS, 1200(2)MOV AL, BX(3)SUB 33H, AL(4)PUSH AL(5)MUL 45H(6)MOV BX, SI(7)MOVS
13、BYTE PTRDS:DI, BYTE PTR DS:SI(8)ADD DATADI+BP, ES:CX(9)JMP BYTE PTRSI(10)OUT 3F8H, AL解:(1)MOV DS, 1200 ;不能用立即数给段基址寄存器赋值(2)MOV AL, BX ;操作数类型不一致(3)SUB 33H, AL ;立即数不能作为目的操作数(4)PUSH AL;压栈指令的操作数必须是字类型(5)MUL 45H;乘法指令中的操作数不能是立即数(6)MOV BX, SI;源和目的操作数不能同时为内存操作数(7)MOVS BYTE PTR DS:DI, BYTE PTR DS:SI; 目的操作数应该在
14、ES段。(8)ADD DATADI+BP, ES:CX;CX不能做间址寄存器使用(9)JMP BYTE PTRSI;操作数必须是字类型(10)OUT 3F8H, AL;16位的端口地址不能直接在输入输出指令中使用。4. 根据要求写出一条(或几条)汇编语言指令。(1)将立即数4000H送入寄存器BX。(2)将立即数4000H送入段寄存器DS。(3)将变址寄存器DI的内容送入数据段中2000H的存储单元。(4)把数据段中2000H存储单元的内容送段寄存器ES。(5)将立即数3DH与AL相加,结果送回AL。(6)把BX与CX寄存器内容相加,结果送入BX。(7)寄存器BX中的低4位内容保持不变,其他位
15、按位取反,结果仍在BX中。(8)实现AX与-128的乘积运算。(9)实现CX中高、低8位内容的交换。(10)将DX中D0、D4、D8位置1,其余位保持不变。解:(1)将立即数4000H送入寄存器BX。MOV BX,4000H(2)将立即数4000H送入段寄存器DS。MOV AX, 4000HMOV DS, AX(3)将变址寄存器DI的内容送入数据段中2000H的存储单元。MOV 2000H,DI(4)把数据段中2000H存储单元的内容送段寄存器ES。MOV AX,2000HMOV ES,AX(5)将立即数3DH与AL相加,结果送回AL。ADD AL,3DH(6)把BX与CX寄存器内容相加,结果
16、送入BX。ADD BX,CX(7)寄存器BX中的低4位内容保持不变,其他位按位取反,结果仍在BX中。MOV AX, BX,NOT AXAND AX,0FFF0HAND BX,000FHOR BX,AX(8)实现AX与-128的乘积运算。MOV BX,-128IMUL BX(9)实现CX中高、低8位内容的交换。MOV AL,8ROL CX AL(10)将DX中D0、D4、D8位置1,其余位保持不变。0R DX,0111H5. 设SS=2000H,SP=1000H,SI=2300,DI=7800,BX=9A00H。说明执行下面每条指令时,堆栈内容的变化和堆栈指针的值。PUSH SIPUSH DIP
17、OP BX解:PUSH SI(0FFFH)=23H(0FFEH)=00HSP=0FFEHPUSH DI(0FFDH)=78H(0FFCH)=00HSP=0FFCHPOP BXBX=7800HSP=0FFEH6. 内存中18FC0H、18FC1H、18FC2H单元的内容分别为23H、55、5AH,DS=1000H,BX=8FC0H,SI=1,执行下面两条指令后AX=?DX=?MOV AX, BX+SILEA DX, BX+SI解:AX=5A55HDX=8FC1H7. 回答下列问题:(1)设AL=7FH,执行CBW指令后,AX=?(2)设AX=8A9CH,执行CWD指令后,AX=?DX=?解:(1
18、)设AL=7FH,执行CBW指令后,AX=007FH(2)设AX=8A9CH,执行CWD指令后,AX=8A9CH DX=FFFFH8. 执行以下两条指令后,FLAGS的6个状态标志位的值是什么?MOV AX, 847BHADD AX, 9438H结果为118B3H解:CF=1 PF=0(为运算结果的低8位奇偶) AF=1 ZF=0 SF=0 OF=1 9. 下面程序段将03E8H转换成十进制数并显示,填写指令后的空格。MOV AX, 03E8H;AH= 03H , AL= E8H MOV CX, 4 MOV DI, 2000H ;DI= 2000H MOV BX, 10 ;BH= 00 , B
19、L= 0AHGO0: SUB DX, DX ;CF= 0 , ZF= 1 DIV BX ;AX= 64H , DX= 0 MOV DI, DL ;DI= 0 INC DI LOOP GO0 ;CX= 3 MOV CX, 4 GO1: DEC DI ;DI=2003HMOV DL, DI ;DL=01OR DL, 30H ;DL=31H MOV AH, 02 ;显示1位十进制数1 INT 21H LOOP GO1 10. 用串操作指令替换以下程序段:ABC:MOV AL, SI MOV ES:DI, AL INC SI INC DI LOOP ABC解:REP MOVSB11. 设AX=AAH,
20、顺序执行下列各条指令,填写空格。(1)XOR AX, 0FFFFH ;AX= (2)AND AX, 13A0H ;AX= (3)OR AX, 25C9H ;AX= (4)TEST AX, 0004H ;AX= 解: (1)XOR AX, 0FFFFH ;AX= FF55H (2)AND AX, 13A0H ;AX= 00A0H (3)OR AX, 25C9H ;AX= 25EBH (4)TEST AX, 0004H ;AX= 00AAH 12. 试写出执行下列3条指令后BX寄存器的内容。MOV CL,2HMOV BX,CO2DHSHR BX,CL解: BX=300BH13. 执行下列程序段后,
21、AX、BX的内容各是什么?(1) MOV AX,0001HMOV BX,8000HNEG AX ;0-0001HMOV CX,4AA:SHL AX,1 RCL BX,1 LOOP AA HLT解:AX=FFF0H BX=000FH(2)MOV AX,0 MOV BX,1 MOV CX,100 A: ADD AX,BX INC BX LOOP A HLT解:AX=8080H BX=0101H14. 编写程序段,实现下述要求:(1) 使AX寄存器的低4位清0,其余位不变。(2) 使BX寄存器的低4位置1,其余位不变。(3) 测试AX的第0位和第4位,两位都是1时将AL清0。(4) 测试AX的第0位
22、和第4位,两位中有一个为1时将AL清0。解:(1)使AX寄存器的低4位清0,其余位不变。 AND AX, 0FFF0H(2) 使BX寄存器的低4位置1,其余位不变。OR AX, 0FH(3)测试AX的第0位和第4位,两位都是1时将AL清0。TEST AX,01HJZ AATEST AX,10HJZ AAMOV AL,0HLTAA: .(4)测试AX的第0位和第4位,两位中有一个为1时将AL清0。TEST AX, 11HJZ AAMOV AL,0AA: .15. 编写程序段,完成把AX中的16进制数转换为ASCII码,并将对应的ASCII码依次存入MEM开始的存储单元中。例如,当AX的内容为37
23、B6H时,MEM开始的4 个单元的内容依次为33H,37H,42H,36H。解:MOV CX,4LEA SI,MEMADD SI,3;SI指向MEM+3CC: MOV BX,AX ;保存原始数据AND AX, 000FH ;取个位数CMP AL, 9JA AA ;在AB之间就加37HADD AL,30H ;在09之间就加30HJMP BBAA: ADD AL,37HBB: MOV SI,AL ;保存ASCII值DEC SIPUSH CXMOV AX,BXMOV CL,4SHR AX,CL ;准备取下一个数POP CXLOOP CC16. 编写程序段,求从TABLE开始的10个无符号数的和,结果
24、放在SUM单元中。解:LEA SI,TABLEMOV CX,10XOR AX,AXNEXT:ADD AL,SIADC AH,0INC SILOOP NEXTMOV SUM,AX17. 编写程序段,从键盘上输入字符串HELLO,并在串尾加结束标志$。解: LEA DX,STRING ;设置字符串存放缓冲区首地址 MOV AH ,0AH ;调用10号功能,输入字符串 INT 21H MOV CL,STRING+1 ;实际键入的字符个数送CLXOR CH,CH ADD DX,2ADD DX,CX ;得到字符串尾地址MOV BX,DXMOV BYTE PTRBX,$ 18. 编写程序段,在屏幕上依次显
25、示1、2、3、A、B、C。解: LEA BX,STR ;STR为6个字符的存放区域首地址 MOV CX,6LPP: MOV AH,2 MOV DL,BX INC BX INT 21H;利用2号功能调用依次先生6个字符 LOOP LPP19. 编写程序段,在屏幕上显示字符串“Hello World”。解: LEA DX,STRING ; STRING字符的存放区域首地址MOV AH,09HINT 21H ; 利用9号功能调用显示字符串20. 编写程序段,把内存中首地址为MEM1的200个字节送到首地址为MEM2的区域。解: MOVAX,SEG MEM1MOVDS,AX;设定源串段地址MOVAX,
26、SEG MEM2MOVES,AX;设定目标串段地址MOVSI,0;设定源串偏移地址MOVDI,0;设定目标串偏移地址MOVCX,200;串长度送CXCLD;(DF)=0,使地址指针按增量方向修改REP MOVSB;每次传送一个字节,并自动HLT 21. 编写程序段,以4000H为起始地址的32个单元中存有32个有符号数,统计其中负数的个数,并将统计结果保存在BUFFER单元中。解:START: MOV DI,OFFSET BUFFERXOR AL,ALMOV DI,ALMOV SI,4000HMOV CX,32AA:MOV AL,SIOR AL,ALJNS X1INC DI X1: INC S
27、INEXT:LOOP AAHLT第四章习题及答案1. 什么叫汇编?汇编语言源程序的处理过程是什么?解:任何CPU都只能执行机器语言程序。汇编语言不是机器语言,汇编语言程序必须通过具有“翻译”功能的系统程序的处理,处理的过程称为汇编。汇编语言源程序经过汇编生成机器语言目标程序,简称目标程序。目标程序经过连接程序连接,就得到可执行的机器语言程序文件。2. 汇编语言的语句类型有哪些?各有什么特点?解:汇编语言的语句类型有两种:指示性语句和指令性语句。指示性语句可以位于任何段中,指令性语句必须位于代码段内。l 指示性语句又称为伪操作语句,它不是8088/8086CPU的指令,它与汇编程序(assemb
28、ler)有关。指示性语句的功能主要是变量定义、为数据分配存储空间、告诉汇编程序如何对源程序汇编等。源程序汇编后指示性语句不生成目标代码,所以常被称为伪指令。l 指令性语句指令性语句是可执行语句,是8088/8086CPU的指令。源程序汇编后指令性语句生成目标代码。第3章中介绍的所有指令都是指令性语句的主体,其操作数最多只能有两个。3. 汇编语言源程序的基本结构是什么?解:汇编语言源程序由若干段组成:数据段、附件数据段、堆栈段和代码段等,段与段之间的顺序可以随意排列,每一段由SEGMENT开始,以ENDS结束,每段的开始和结束都附有相同的名字。一个程序一般定义三个段:数据段、堆栈段和代码段,必要
29、时增加定义附加数据段,能独立运行的程序至少包含一个代码段。4. 写出完成下述要求的变量定义的语句:(1) 为缓冲区BUFF保留200个字节的内存空间(2) 将字符串BYTE,WORD存放于某数据区(3) 在数据区中存入下列5个数据:2040H,0300H,10H,0020H,1048H解:(1)为缓冲区BUFF保留200个字节的内存空间BUFF DB 200 DUP(?)(2)将字符串BYTE,WORD存放于某数据区DB BYTE,WORD(3)在数据区中存入下列5个数据:2040H,0300H,10H,0020H,1048HDW 2040H,0300H,10H,0020H,1048H5. 画
30、出下面数据段汇编后的内存图,并标出变量的位置。DATA SEGMENTAA EQU 78HAA0 DB 09H,-2,45H,2 DUP(01H, ?),AB AA1 DW -2,34H+AAAA2 DD 12H ;双字类型DATAENDS解:如图所示。6. 设程序中的数据定义如下:NAME DB 30 DUP(?)LISTDB 1,8,3,2ADDR DW 30 DUP(?)(1) 取NAME的偏移地址放入SI(2) 取LIST的前两个字节存入AX(3) 取LIST实际长度解:(1)取NAME的偏移地址放入SIMOV SI,OFFSET NAME(2)取LIST的前两个字节存入AXMOV A
31、X,WORD PTR LIST(3)取LIST实际长度MOV AX,SIZE LIST ;P857. 依据下列指示性语句,求表达式的值。SHOW0 EQU 200SHOW1 EQU 15SHOW2 EQU 2 SHOW0X100+55 SHOW0 AND SHOW1-15 (SHOW0/SHOW2) MOD SHOW1 SHOW1 OR SHOW0解:(1) SHOW0 X 100+55=200X100+55 SHOW0 AND SHOW1-15=C8H AND 0FH - 0FH = 0;减法的优先级过于AND (SHOW0/SHOW2)MOD SHOW1=100 MOD 15=10 SHO
32、W1 OR SHOW0=0FH OR C8H=CF8. 编写程序,统计寄存器BX中二进制位“1”的个数,结果存在AL中。DATA SEGMENTNUM DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXMOV AL,0 MOV BX,NUM ;把数X传送给BXMOV CX,16 NEXT: SHL AX,1 JNC NEXT1 INC AL NEXT1: LOOP NEXT MOV AH,4CH INT 21HCODE ENDSEND START9. 某数据块存放在BUFFER开始的100个字节
33、单元中,试编写程序统计数据块中正数(不包括0)的个数,并将统计的结果存放到NUMBER单元中。解DATA SEGMENTBUFFER DB 100(?) NUMBER DB 0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXXOR DX, DXMOV CX,100MOV SI,OFFSET BUFFERNEXT: MOV AL,SIINC SITEST AL,80H ;是正数吗?JNZ GOON;否,转移到GOONCMP AL,0 JZ GOONINC DXGOON: LOOP NEXTMOV NU
34、MBER,DXMOV AH,4CH INT 21HCODE ENDSEND START10. 阅读下面程序段,指出它的功能。DATA SEGMENTASCII DB 30H, 31H, 32H, 33H ,34H ,35H, 36H, 37H, 38H, 39HHEX DB 04HDATA ENDS CODE SEGMENT ASSUME CS:CODE, DS: DATASTART:MOV AX, DATAMOV DS, AXMOV BX,OFFSET ASCIIMOV AL,HEXAND AL,0FHMOV AL,BX+ALMOV DL,ALMOV AH,2INT 21HMOV AH,4C
35、HINT 21HCODE ENDSEND START解:这时一个查表程序,查表取出HEX的ASCII。并在屏幕上显示ASCII码11. 某数据区中有100个小写字母,编程把它们转换成大写字母,并在屏幕上显示。解:DATA SEGMENTBUFFER DB 100(?) DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXMOV CX,100MOV SI,OFFSET BUFFERNEXT: MOV AL,SIINC SICMP AL,61H ;是小写字母吗?JB GOON;否,转移到GOON(小于则转移)
36、SUB AL,20H MOV DL,ALMOV AH,2INT 21HGOON: LOOP NEXTMOV AH,4CH INT 21HCODE ENDS END START12. 子程序的参数传递有哪些方法?解:主程序在调用子程序时,要为子程序预置数据,在子程序返回时给出数据处理的结果,这称为数据传送或变量传送。方法主要有以下几种: 寄存器传送。 地址表传送,需要传送的参数较多时可以利用存储单元传送。在调用子程序前,把所有参数依次送入地址表,然后将地址表的首地址作为子程序入口参数传递给子程序。 堆栈传送,这种方式要审慎注意堆栈的变化情况。13. 过程定义的一般格式是什么?子程序开始处为什么常
37、用PUSH指令?返回前用POP指令?解:格式见P90,如果一个子程序被多次调用,保护与恢复(主程序)现场就非常重要。主程序每次调用子程序时,主程序的现场不会相同,保护与恢复现场的工作就只能在子程序中进行。原则上,在子程序中,首先把子程序中要用到的寄存器、存储单元、状态标志等压入堆栈或存入特定空间中,然后子程序才可以使用它们,使用完后再将它们弹出堆栈或从特定空间中取出,恢复它们原来的值,即恢复主程序现场。保护和恢复现场常使用PUSH和POP指令。14. 阅读下面程序段,指出它的功能。DATA SEGMENT STRING DB ExxperienceLENG DW 100KEY DB xDATA
38、 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATAMAIN PROC FARSTART:MOV AX, DATAMOV DS, AXDI-DI+SI+SP-BPBP-BP+IP-IP+BP+4-SICLCHBP+6-DIBLBHMOV ES, AXLEA BX, STRING ;字符串地址-BXLEA CX, LENG ;字符串长-CXPUSH BXPUSH CXMOV AL, KEYCALL DELCHARMOV AH, 4CHINT21HMAIN ENDPDELCHAR PROC PUSH BPMOV BP, SPPUSH SIPUSH DIC
39、LDMOV SI, BP+4MOV CX, SIMOV DI, BP+6REPNE SCASBJNE DONEMOV SI, BP+4DEC WORD PTRSIMOV SI, DIDEC DIREP MOVSBDONE: POP DIPOP SIPOP BPRETDELCHAR ENDPCODE ENDSEND START解:从字符串中删去多余的X字符。15. 显示两位压缩BCD码值(099),要求不显示前导0。解:DATA SEGMENTBUF DB ? ; 内存中的两位压缩BCD码DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV
40、AX,DATA MOV DS,AXMOV AL, BUFMOV BL,ALNEXT: MOV CL,4 SHR AL, CL AND AL,0FHCMP AL,0JZ GOONADD AL,30H ;显示高位BCD码MOV DL,ALMOV AH,2INT 21HGOON: MOV AL,BLAND AL,0FH ADD AL,30H ;显示低位BCD码MOV DL,ALMOV AH,2INT 21HMOV AH,4CH INT 21HCODE ENDSEND START16. 某数据区中连续存放着100个整数,要求将其中为0的元素删除,并将保留的数据连续存放。解:DATA SEGMENT STRING DB 100(?)LENG DW 100KEY DB 0