微机软件实验习题与答案(完整版)
- 格式:doc
- 大小:459.50 KB
- 文档页数:42
微机原理软件实验 实验1 两个多位十进制数相加的实验 实验内容:将两个多位十进制数相加,要求加数和被加数均以ASCII码形式各自顺序存放以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。完整代码如下: DATAS SEGMENT ;此处输入数据段代码 STRING1 DB 'input the first number:','$' STRING2 DB 13,10,'input the second number:','$' STRING3 DB 13,10,'the output is:','$' DATA1 DB 6 DUP(00H),'$' DATA2 DB 6 DUP(00H),'$' DATAS ENDS
STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS
CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX
;此处输入代码段代码 LEA SI,DATA1 LEA DI,DATA2
L0: LEA DX,STRING1;打印字符串STRING1 MOV AH,09 INT 21H
INPUT1: ;输入第一个数 MOV AH,01;输入字符至AL中 INT 21H CMP AL,'/' JE L1 MOV [SI],AL INC SI JMP INPUT1
L1: LEA DX,STRING2;打印字符串STRING2 MOV AH,09 INT 21H
INPUT2: ;输入第二个数 MOV AH,01;输入字符至AL INT 21H CMP AL,'/' JE L2 MOV [DI],AL INC DI JMP INPUT2
L2: MOV SI,0
CLC;清空进位标志位CF MOV CX,6 PLUSE: ;相加 ;SUB DATA1[SI],30H ;SUB DATA2[SI],30H
;这里不能使用这两条指令,因为如果DATA1[5]=00H,00H-30H需要借位相减,使CF=1
MOV AL,DATA1[SI] ADC AL,DATA2[SI]
AAA ;加法调整指令,可使两个ASCII数直接相加
MOV DATA1[SI],AL;和赋给DATA1[SI] INC SI LOOP PLUSE
L3: LEA DX,STRING3;打印字符串STRING3 MOV AH,09 INT 21H MOV CX,6 MOV SI,6 SHOW: DEC SI CMP DATA1[SI],00H JE SHOW
SHOW2: MOV DL,DATA1[SI] ADD DL,30H MOV AH,02 INT 21H CMP SI,0 JE L4 DEC SI JMP SHOW2 L4: MOV AH,4CH INT 21H CODES ENDS END START
运行结果如下:输入为低位在前,即输入1234和99999相加实际上是4321和
99999相加(即:4321+99999=104320)
实验2 两个数相乘的实验(无符号数相乘) 实验内容:实现十进制数的乘法。要求被乘数和乘数均以ASCII码形式各自顺序存放在内存中,乘积在屏幕上显示出来。完整代码如下: DATAS SEGMENT ;此处输入数据段代码 STRING1 DB 'the output is:','$' DATA1 DB 31H,32H,33H DATA2 DB 35H,36H DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS
CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX
;此处输入代码段代码
MOV DL,10 MOV AL,DATA1[0];AL=31H SUB AL,30H ;AL=01H
MUL DL;乘10 ;AL=10 ADD AL,DATA1[1];AL=10 +32H SUB AL,30H ;AL=10 +32H-30H=12 MUL DL ;AL=120 ADD AL,DATA1[2];AL=120+33H SUB AL,30H ;AL=120+33H-30H=123 MOV BL,AL ;BL=AL ; MOV AL,DATA2[0];AL=35H SUB AL,30H ;AL=5
MUL DL;乘10 ;AL=50 ADD AL,DATA2[1];AL=50+36H SUB AL,30H ;AL=50+36H-30H=56
MUL BL ;AX=123x56=6888 SUB DX,DX;DX清零 MOV BX,1000 DIV BX;(DX,AX)/1000,商6在AX中,余数888在DX中 PUSH DX MOV DL,AL ADD DL,30H
MOV AH,02 ;打印最高位6 INT 21H POP DX
MOV BL,100 MOV AX,DX;888赋给AX
DIV BL;AX/100,商放在AL中,余数88放在AH中 MOV DL,AL MOV CL,AH ;!!!这里千万不能把AH直接赋给AL,因为经过INT 21H指令
后AL,AH会改变 ADD DL,30H MOV AH,02;打印第二位 INT 21H
MOV BL,10 MOV AL,CL
SUB AH,AH;清空AH
DIV BL;AX/10,商放在AL中,余数8放在AH中 MOV DL,AL MOV CL,AH ADD DL,30H MOV AH,02;打印第三位 INT 21H
MOV DL,CL ADD DL,30H
MOV AH,02;打印第四位 INT 21H CODES ENDS END START
运行结果为:
实验3 字符串匹配实验 实验内容:编写程序实现两个字符串比较。如果相同,则屏幕显示“match”,否则屏幕显示”nomatch” ,完整代码如下: DATAS SEGMENT ;此处输入数据段代码 PRINT1 DB 'input the first string:','$' PRINT2 DB 13,10,'input the second string:','$' PRINT3 DB 'match','$' PRINT4 DB 'nomatch','$' PRINT5 DB 13,10,'output: ','$' STRING1 DB 30 DUP(00H),13,10,'$' STRING2 DB 30 DUP(00H),13,10,'$' DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS
CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS START: MOV AX,DATAS MOV DS,AX
;此处输入代码段代码
LEA DX,PRINT1;打印字符串PRINT1 MOV AH,09 INT 21H
LEA SI,STRING1;STRING1地址赋给SI LEA DI,STRING2;STRING2地址赋给DI
INPUT1: MOV AH,01;输入字符至AL INT 21H CMP AL,'/';输入字符串以‘/’结束,转L0 JE L0 MOV [SI],AL INC SI JMP INPUT1 L0: LEA DX,PRINT2;打印字符串PRINT2 MOV AH,09 INT 21H
INPUT2: MOV AH,01; 输入字符至AL INT 21H CMP AL,'/' JE L1 MOV [DI],AL INC DI JMP INPUT2
L1: MOV CX,30 ;CX=30代表比较30次 MOV SI,00H
COMPARE:;字符串一个一个比较 MOV AL,STRING1[SI];取STRING1存储单位中的第SI个字符赋给AL CMP AL,STRING2[SI];AL与STRING2存储单位中的第SI个字符比较 JNE NOMATCH INC SI LOOP COMPARE
JMP MATCH