当前位置:文档之家› 微机软件实验习题与答案(完整版)

微机软件实验习题与答案(完整版)

微机原理软件实验实验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 ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码LEA SI,DATA1LEA DI,DATA2L0:LEA DX,STRING1;打印字符串STRING1MOV AH,09INT 21HINPUT1: ;输入第一个数MOV AH,01;输入字符至AL中INT 21HCMP AL,'/'JE L1MOV [SI],ALINC SIJMP INPUT1L1:LEA DX,STRING2;打印字符串STRING2MOV AH,09INT 21HINPUT2: ;输入第二个数MOV AH,01;输入字符至ALINT 21HCMP AL,'/'JE L2MOV [DI],ALINC DIJMP INPUT2L2:MOV SI,0CLC;清空进位标志位CFMOV CX,6PLUSE: ;相加;SUB DATA1[SI],30H;SUB DATA2[SI],30H;这里不能使用这两条指令,因为如果DATA1[5]=00H,00H-30H需要借位相减,使CF=1MOV AL,DATA1[SI]ADC AL,DATA2[SI]AAA;加法调整指令,可使两个ASCII数直接相加MOV DATA1[SI],AL;和赋给DATA1[SI]INC SILOOP PLUSEL3:LEA DX,STRING3;打印字符串STRING3MOV AH,09INT 21HMOV CX,6MOV SI,6SHOW:DEC SICMP DATA1[SI],00HJE SHOWSHOW2:MOV DL,DATA1[SI]ADD DL,30HMOV AH,02INT 21HCMP SI,0JE L4DEC SIJMP SHOW2L4: MOV AH,4CHINT 21HCODES ENDSEND START运行结果如下:输入为低位在前,即输入1234和99999相加实际上是4321和99999相加(即:4321+99999=104320)实验2 两个数相乘的实验(无符号数相乘)实验内容:实现十进制数的乘法。

要求被乘数和乘数均以ASCII码形式各自顺序存放在内存中,乘积在屏幕上显示出来。

完整代码如下:DATAS SEGMENT;此处输入数据段代码STRING1 DB'the output is:','$'DATA1 DB 31H,32H,33HDATA2 DB 35H,36HDATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码MOV DL,10MOV AL,DATA1[0];AL=31HSUB AL,30H ;AL=01HMUL DL;乘10 ;AL=10ADD AL,DATA1[1];AL=10 +32HSUB AL,30H ;AL=10 +32H-30H=12MUL DL ;AL=120ADD AL,DATA1[2];AL=120+33HSUB AL,30H ;AL=120+33H-30H=123MOV BL,AL ;BL=AL;MOV AL,DATA2[0];AL=35HSUB AL,30H ;AL=5MUL DL;乘10 ;AL=50ADD AL,DATA2[1];AL=50+36HSUB AL,30H ;AL=50+36H-30H=56MUL BL ;AX=123x56=6888SUB DX,DX;DX清零MOV BX,1000DIV BX;(DX,AX)/1000,商6在AX中,余数888在DX中PUSH DXMOV DL,ALADD DL,30HMOV AH,02 ;打印最高位6INT 21HPOP DXMOV AX,DX;888赋给AXDIV BL;AX/100,商放在AL中,余数88放在AH中MOV DL,ALMOV CL,AH ;!!!这里千万不能把AH直接赋给AL,因为经过INT 21H 指令后AL,AH会改变ADD DL,30HMOV AH,02;打印第二位INT 21HMOV BL,10MOV AL,CLSUB AH,AH;清空AHDIV BL;AX/10,商放在AL中,余数8放在AH中MOV DL,ALMOV CL,AHADD DL,30HMOV AH,02;打印第三位INT 21HADD DL,30HMOV AH,02;打印第四位INT 21HCODES ENDSEND 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 ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:DATAS START:MOV AX,DATASMOV DS,AX;此处输入代码段代码LEA DX,PRINT1;打印字符串PRINT1MOV AH,09INT 21HLEA SI,STRING1;STRING1地址赋给SILEA DI,STRING2;STRING2地址赋给DIINPUT1:MOV AH,01;输入字符至ALINT 21HCMP AL,'/';输入字符串以‘/’结束,转L0JE L0MOV [SI],ALINC SIJMP INPUT1L0:LEA DX,PRINT2;打印字符串PRINT2MOV AH,09INT 21HINPUT2:MOV AH,01; 输入字符至ALINT 21HCMP AL,'/'JE L1MOV [DI],ALINC DIJMP INPUT2L1: MOV CX,30 ;CX=30代表比较30次MOV SI,00HCOMPARE:;字符串一个一个比较MOV AL,STRING1[SI];取STRING1存储单位中的第SI个字符赋给AL CMP AL,STRING2[SI];AL与STRING2存储单位中的第SI个字符比较JNE NOMATCHINC SILOOP COMPAREJMP MATCHNOMATCH:;打印output:nomatch LEA DX,PRINT5MOV AH,09INT 21HLEA DX,PRINT4MOV AH,09INT 21HJMP L2MATCH:;打印output:matchLEA DX,PRINT5MOV AH,09INT 21HLEA DX,PRINT3MOV AH,09INT 21HL2: MOV AH,4CHINT 21HCODES ENDSEND START 运行结果:实验4 从键盘输入数据并显示的实验实验内容:将键盘输入的2位十六进制数转换为等值的二进制数,并在屏幕上显示。

列如:键入f2,则显示11110010.完整代码如下:DATAS SEGMENT;此处输入数据段代码STRING1 DB'please input a string:','$'STRING2 DB 13,10,'the output is:','$'STRING3 DB 13,10,'input error',13,10,'$'DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX;此处输入代码段代码L0: LEA DX,STRING1;打印字符串STRING1 MOV AH,09INT 21HMOV AH,01;输入第一个字符至AL中INT 21HCMP AL,'0'JB ERROR1CMP AL,'9'JBE ENTER1CMP AL,'A'JB ERROR1CMP AL,'F'JBE ENTER1CMP AL,'a'JB ERROR1CMP AL,'f'JBE ENTER1ERROR1:LEA DX,STRING3;打印字符串STRING3MOV AH,09INT 21HJMP L0ENTER1:CALL ASC2BCD;把ASCII码转化成十进制数BCD码MOV CL,4ROL AL,CLMOV BL,AL;把高四位放到BL寄存器中;输入第二个字符MOV AH,01;输入第二个字符至AL中INT 21HCMP AL,'0'JB ERROR1CMP AL,'9'JBE ENTER2CMP AL,'A'JB ERROR1CMP AL,'F'JBE ENTER2CMP AL,'a'JB ERROR1CMP AL,'f'JBE ENTER2ENTER2:CALL ASC2BCD;把ASCII码转化成十进制数BCD码ADD BL,ALLEA DX,STRING2;打印字符串STRING2MOV AH,09INT 21HMOV CX,9CLC;清空标志位SHOW: ;显示BL中的二进制数DEC CXCMP CX,0JE NEXT ;输出完八位乊后返回DOSROL BL,1 ;循环左移一位,若溢出为1,则CF=1 JC M1JMP M2M1: MOV DL,'1';若CF=1,转至M1打印‘1’MOV AH,02INT 21HJMP SHOWM2: MOV DL,'0';若CF=0,转至M1打印‘0’MOV AH,02INT 21HJMP SHOWNEXT:MOV AH,4CHINT 21HASC2BCD PROCCMP AL,'9'JBE L1 ;若AL≤9,转L1SUB AL,07H ;若输入的数为A~F,或者a~f,则减7,A接在39H后面,A~F=3AH~3FH,a~f=5AH~5FHL1: SUB AL,30H ;减30HAND AL,0FH ;滤除高位,保留低位,因为a~f恰好比A~F大20H,这样a~f就和A~F的数值一样了RETASC2BCD ENDPCODES ENDSEND START输出结果为:(若输出不在0~9,A~F,a~f内,则重新输入)实验5 字符和数据计算的实验实验内容:先在屏幕上显示“input string,”,输入字符串; 再显示“result=”。

相关主题