《微型计算机原理及应用》习题题解(4)

2019-08-30 20:43

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


《微型计算机原理及应用》习题题解(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:班组反违章管理实施细则

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: