自考
MOV AL,[SI] MOV BL,[SI] LP1: INC SI
CMP AL,[SI] JB NEXT1 CMP BL,[SI] JA NEXT2 JMP NEXT NEXT1: MOV AL,[SI] JMP NEXT NEXT2: MOV BL,[SI] NEXT: LOOP LP1
MOV MAX,AL MOV MIN,BL MOV AX,4CH INT 21H CODE ENDS
END START
4-10 将有符号数组中的正数、负数分别存储,并统计其正数和负数的个数。
【解答】DATA SEGMENT
ARRAY DW -3,6,-89,99,-50,11,3,34,68,127,-128,1,4,6,100,-100,-2,-5,0,3 N EQU ($-ARRAY)/2 PLUS DW N DUP(?) NEGA DW N DUP(?) NP DB 0 NN DB 0 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA BX,ARRAY LEA SI,PLUS LEA DI,NEGA MOV CX,N LP: MOV AX,[BX] CMP AX,0 JGE LP1
MOV [DI],AX ADD DI,2 INC NN JMP NEXT LP1: MOV [SI],AX ADD SI,2 INC NP NEXT: INC BX INC BX LOOP LP
MOV AX,4CH INT 21H CODE ENDS
END START
4-11 编写程序使该字符串能符合偶校验的要求。
【解答】DATA SEGMENT
STRING DB 'ABCDEFGHIJKLMNOPQ','$' N EQU $-STRING DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX
第11页【本课后解答题共32页】
自考
LEA BX,STRING MOV CX,N LP: MOV AL,[BX] AND AL,AL JP NEXT OR AL,80H MOV [BX],AL NEXT: INC BX LOOP LP
MOV AX,4CH INT 21H CODE ENDS
END START
4-12 编写程序把CHAR、CHAR1和CHAR2中的英文字母字符数据按英文字母次序排列。
【解答】DATA SEGMENT
CHAR DB 'H67JFDF61235--==65KJ8922' CHAR1 DB '8fggYYUF89Aljkj'
CHAR2 DB 'HWOPY65bxnmbcvb??URYT\\#$56@$' N EQU $-CHAR BUFFER DB N DUP(?) DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,CHAR LEA DI,BUFFER MOV BX,0 MOV CX,N LP: MOV AL,[SI] CMP AL,'A' JB LP1 CMP AL,'Z' JA LP2
LP3: MOV [DI],AL INC DI INC BX JMP LP1 LP2: CMP AL,'a' JB LP1 CMP AL,'z' JA LP1 JMP LP3 LP1: INC SI LOOP LP
MOV CX,BX DEC CX
LOOP1: MOV DI,CX MOV SI,0
LOOP2: MOV AL,BUFFER[SI] CMP AL,BUFFER[SI+1] JBE COTINUE
XCHG AL,BUFFER[SI+1] MOV BUFFER[SI],AL COTINUE:INC SI
LOOP LOOP2 MOV CX,DI LOOP LOOP1 MOV AX,4CH INT 21H CODE ENDS
END START
第12页【本课后解答题共32页】
自考
4-13 BUF1和BUF2都有一个4字节无符号数据,存放次序为低位在前,编写程序进行求和,并将结果存入SUM中,需计及可能产生的进位。
【解答】DATA SEGMENT
BUF1 DD 8899AABBH BUF2 DD 90123456H SUM DW 3 DUP(?) DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,0
MOV AX,WORD PTR BUF1 ADD AX,WORD PTR BUF2 MOV SUM,AX
MOV AX,WORD PTR BUF1+2 ADC AX,WORD PTR BUF2+2 MOV SUM+2,AX ADC BX,0
MOV SUM+4,BX MOV AX,4CH 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
第13页【本课后解答题共32页】
自考
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 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(乘积)
第14页【本课后解答题共32页】
自考
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 高位 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
第15页【本课后解答题共32页】