INT 21H CODE ENDS
END START
4-14 如上题,但数据为压缩BCD制数。
【解答】DATA SEGMENT
BUF1 DD 89457812H BUF2 DD 90123456H SUM DB 5 DUP(?) DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,0 LEA SI,BUF1 LEA DI,BUF2
XOR AH,AH ;AH清零备处理最高位进位时用,同时初始化清零CF。 MOV CX,4
NEXT: MOV AL,BYTE PTR [SI] ADC AL,BYTE PTR [DI] DAA
MOV SUM[BX],AL INC BX INC SI INC DI
LOOP NEXT ADC AH,0
MOV SUM[BX],AH MOV AX,4CH INT 21H CODE ENDS
END START
4-15 DATA数组中有100个有符号字节数组,编写程序求出它们的平均值存入AVE单元中。
【解答】DATA SEGMENT
ARRAY DB 10,-89,111,126,-100,-1,90,67,2,110,90 DUP(8) AVE DB ? ;平均值 YUSHU DB ? ;余数 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,ARRAY MOV AX,0 MOV CX,100 NEXT: MOV BL,[SI] MOV BH,0 XCHG AX,BX CBW
XCHG AX,BX ADD AX,BX INC SI
LOOP NEXT
16
MOV BL,100 IDIV BL
MOV AVE,AL MOV YUSHU,AH MOV AX,4CH INT 21H CODE ENDS
END START
4-16 编写程序实现两个32位无符号数相乘的计算,原始数据和结果乘积都在数据段中,可自行定义。
【程序分析】8086/8088指令系统中只有16×16位乘法指令。因此32位乘法的算法是:将32位乘法拆开成4次的16位乘法,再将4个部分积按下图所示次序相加,得到64位乘积。设被乘数分为高16位为A,低16位为B,乘数分为高16位为C,低16位为D。
【 32位×32位乘法操作示意图】 31 16 15 0 被乘数 A B C D 乘数 ×)
31 0
B× D 部分积1
47 16
A× D 部分积2
B× C 部分积3
63 32
累加) A× C 部分积4
63 0 AB× CD 乘积
【解答】
DATA SEGMENT
MULNUM1 DW 2B6AH, 04D8H ;32位被乘数B,A MULNUM2 DW 0C298H,2147H ;32位乘数D,C MRST DW 4 DUP(?) ;64位乘积 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
LEA SI,MULNUM1 ;SI指向MULNUM1(被乘数) LEA DI,MULNUM2 ;DI指向MULNUM2(乘数) LEA BX,MRST ;BX指向MRST(乘积) MOV AX,[SI] ;AX?B MUL WORD PTR [DI] ;B×D
MOV [BX+2],DX ;保存部分积1(高16位) MOV [BX],AX ;保存部分积1(低16位) MOV AX,[SI+2] ;AX?A MUL WORD PTR [DI] ;A×D
ADD [BX+2],AX ;部分积1(高16位)和部分积2(低16位)相加 ADC DX,0 ;进位加入部分积2 高位
17
MOV [BX+4],DX ;部分积2高位保存 MOV AX,[SI] ;AX?B MUL WORD PTR [DI+2] ;B×C
ADD [BX+2],AX ;部分积3低位加入部分积之和 ADC [BX+4],DX ;部分积3高位加入部分积之和 PUSHF ;保存进位 MOV AX,[SI+2] ;AX?A MUL WORD PTR [DI+2] ;A×C POPF ;弹出进位
ADC DX,0 ;先将部分积3求和时的进位加到部分积4的高位上 ADD [BX+4],AX ;部分积4低位加入部分积之和 ADC DX,0 ;进位加入部分积4高位
MOV [BX+6],DX ;部分积4高位加入部分积之和 MOV AX,4CH INT 21H CODE ENDS
END START
4-17 编写程序把PACKED中的16位压缩BCD数(共占8字节)变成非压缩BCD数存入UNPACKED中。
【解答】DATA SEGMENT
PACKED DB 32H,45H,78H,33H,99H,58H,90H,21H;16位压缩BCD数 UNPACKED DB 16 DUP(?) ;存放16位非压缩BCD数的缓冲区 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,PACKED LEA DI,UNPACKED MOV CX,8 NEXT: MOV AL,[SI] MOV BL,AL PUSH CX MOV CL,4 SHR BL,CL MOV [DI],BL AND AL,0FH MOV [DI+1],AL INC SI INC DI INC DI POP CX
LOOP NEXT MOV AH,4CH INT 21H CODE ENDS
END START
4-18 编写能完成下列要求的程序:测试字节数据STATUS,若其中位1、3、5有一位是 “1”,程序就转至ROUT1;若有二位是“1”,就转向ROUT2;若三位都是“1”,就转向ROUT3;若这三位没有一位是“1”,就转向ROUT4。
18
【程序流程图】
开始 D5= ? 1 D3= ? 1 D1= ? 1 ROUT1 0 0 D3= ? 1 0 D1= ? 1 ROUT2 0 0 D1= ? 1 ROUT3 ROUT4 0 【解答】DATA SEGMENT
STATUS DB 0FFH ;要测试的字节数据 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
MOV AL,STATUS ;取测试数据在AL中 TEST AL,20H ;D5=1?
JZ L1 ;D5=0,转L1 TEST AL,08H ;D5=1,D3=1? JZ L2 ;D5=1,D3=0,转L2 TEST AL,02H ;D5=D3=1,D1=1?
JZ ROUT2 ;D5=D3=1,D1=0,转ROUT2 JMP ROUT1 ;D5=D3=D1=1,转ROUT1 L1: TEST AL,08H ;D5=0,D3=1? JZ L3 ;D5=D3=0,转L3
L2: TEST AL,02H ;D5=0,D3=1,D1=1?或D5=1,D3=0,D1=? JZ ROUT3 ;D5=0,D3=1,D1=0,转ROUT3 JMP ROUT2 ;D5=0,D3=D1=1,转ROUT2 L3: TEST AL,02H ;D5=D3=0,D1=1?
JZ ROUT4 ;D5=D3=D1=0,转ROUT4 JMP ROUT3 ;D5=D3=0,D1=1,转ROUT3
;以下是程序转向的4路分支,为调试程序所需,在各分支中对应D5、D3、D1中有3个1、2个1、1个1及全为0,分别在屏幕输出3、2、1、0提示信息。
ROUT1: MOV DL,'3' MOV AH,2 INT 21H JMP TEXT ROUT2: MOV DL,'2' MOV AH,2 INT 21H JMP TEXT ROUT3: MOV DL,'1' MOV AH,2 INT 21H JMP TEXT ROUT4: MOV DL,'0' MOV AH,2
19
INT 21H
TEXT: MOV AH,4CH INT 21H CODE ENDS
END START
4-19 STRING字符串中的最大长度为80个字符,字符串的结束用字符$表示。编写程序在该字符串中查找是否有空格符(ASCII码为20H),若有就将第一个空格在字符串中的位置(00~4FH)存入POST单元;若无空格则将-1存入POST。
【解答】DATA SEGMENT
POST DB ? DATA ENDS
EDATA SEGMENT
STRING DB 78 DUP(4), ' ' ,'$' EDATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:EDATA START: MOV AX,DATA MOV DS,AX
MOV AX,EDATA MOV ES,AX LEA DI,STRING MOV CX,80 MOV AL,'$' CLD
REPNZ SCASB ;查找'$'结束字符 MOV SI,OFFSET STRING
SUB DI,SI ;计算字符串的长度
MOV CX,DI ;将计算出的字符串长度送入计数器CX
PUSH CX ;CX入栈保存,是为了最后计算‘空格’符在字符串中的位置 MOV AL,20H ;在字符串中搜索20H(空格) LEA DI,STRING REPNE SCASB
JNZ L1 ;没搜索到转L1
POP BX ;搜索到了,计算该空格在字符串中的位置 SUB BX,CX DEC BX
MOV POST,BL ;将计算出的位置值存入POST单元 JMP TEXT
L1: MOV BYTE PTR POST,-1 ;没搜索到,将-1存入POST单元 TEXT: MOV AH,4CH NT 21H CODE ENDS
END START
4-20 BUFFER字节数组中存有一组无序列字节数据,列的长度表示在BUFFER的第一个字节中。KEY中为一个字节数据。编写程序在BUFFER中查找有无KEY,若有就结束,若没有就将KEY 加入到BUFFER中去,并修改列长度。
【解答】
DATA SEGMENT
BUFFER DB 0AH,100,200,190,10,34,56,78,8,1,2
20