微机原理第二次试验字符及字符串输入输出与顺序程序设计实验班级:姓名:学号:日期:字符及字符串输入输出与顺序程序设计实验2.2.1 实验目的1、学习和掌握字符及字符串的输入输出方法。
2、掌握顺序程序的设计方法。
3、进一步掌握调试工具的使用方法。
2.2.2 实验预习要求1、复习DOS功能调用中用于字符输入(功能号01H)、字符输出(功能号02H)、字符串输入(功能号为0AH)以及字符串输出(功能号09H)的调用方法(详见教材5.5.6)。
2、复习BCD码运算调整指令。
3、根据“2.2.3 实验内容”中给出的源程序框架编写完整的源程序,以便实验时调试。
4、从“2.2.4 实验习题”中任选一道题目,编写源程序,以便上机调试。
2.2.3实验内容从键盘输入两个一位十进制数,计算这两个数之和,并将结果在屏幕上显示出来。
1、问题分析比如使用功能号为01H的用于实现单个字符输入的DOS功能调用接收从键盘输入的两个十进制数8和6,这时计算机内部得到的是这两个数的ASCII码值38H和36H。
由于数字0?9的ASCII码值与其代表的数值之间相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数08H和06H,使用ADD指令对它们进行相加后结果为0EH(00001110B),显然需要用非压缩型BCD数加法调整指令对ADD的运算结果进行调整,调整后得到两个非压缩型BCD数01H和04H,将它们分别加上30H后变为其对应的ASCII码31H(1的ASCII码)和34H(4的ASCII码),然后调用功能号为02H用于单个字符输出的DOS功能调用将它们显示出来。
综上所述,需要考虑以下问题。
(1)从键盘输入一个一位十进制数的方法通过功能号为1的DOS功能调用实现从键盘输入一个字符,格式如下:MOV AH, 01HINT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中SUB AL, 30H ;减去30H后得到键入数字所代表的数值(2)提示信息字符串的显示通过功能号为9的DOS功能调用实现字符串显示,注意字符串的最后一个字符必需为’$’。
指令格式如下:MOV D X, OFFSET INFOR1 ;INFOR1为在数据段中定义的要显示的字符串MOV AH, 09HINT 21H(2)非压缩型BCD数加法调整指令的使用设从键盘输入的数值已存放在寄存器AL, BL中,可用下列程序完成数据相加和调整操作:XOR AH,AHADD A L, BLAAA ;执行该指令后,AH中为和的十位上的数字,AL中为个位上的数字请读者考虑,为什么要使用指令“XOR AH,AH”,不用行否?(3)计算结果的显示执行完AAA指令后,只需分别将AH(十位上的数值)和AL(个位上的数值)加上30H,并依次调用功能号为2的DOS 功能调用来显示字符。
具体指令代码如下:PUSH AXMOV DL, AHADD DL, 30HMOV AH, 02HINT 21HPOP AXMOV DL, ALADD DL, 30HMOV AH, 02HINT 21H2、 源程序框架DATA S EGMENTINFOR1 DB "Please Input the First Data(<10):$"INFOR2 DB 0AH,0DH,"Please Input the Second Data(<10):$"INFOR3 DB 0AH,0DH,"The Result is:$" ;0DH 和0AH 分别为非显示字符回;车和换行的ASCII 码值,美圆符号“$”为字符串结束标志,不能省略。
DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATA MOV D S, AXSUBAL, 30H MOV BL, ALSUB AL, 30HPUSH AXPOP AX PUSH AXMOV AH, 4CHINT 21HCODE ENDSEND START3、 程序调试源程序编写完成后,先静态检查,无误后,对源程序进行汇编和连接,生成可执行文件。
在DOS命令提示符下运行该程序,分析运行结果是否正确。
若结果不正确,使用DEBUG对其进行调试。
2.2.4 实验习题1、设a,b,c,d为四个压缩型BCD数,它们被存放在内存dbcd开始的4个存储单元中,计算a+b+c+d,并将结果在屏幕上显示出来(注意压缩型BCD数的表示方法:十进制数38表示成压缩型BCD数时应写成38H)。
程序编写完成并运行正确后,打开源程序,改变a,b,c,d的内容,然后重新进行汇编、连接并运行程序,检查程序运行结果与手工计算结果是否相符。
下面给出几组实验用数据:(1)a=11, b=23, c=25, d=31(2)a=10, b=20, c=30, d=40(3)a=45, b=45, c=45, c=45(4)a=88, b=99, c=77, d=66(注意压缩型BCD数的表示方法:十进制数38表示成压缩型BCD数时应写成38H)2、从键盘输入两个一位十进制数,计算这两个数之积,并将结果在屏幕上显示出来。
3、从键盘输入0?9中任意一个数自然数,将其平方值在屏幕上显示(使用查表法实现)。
2.2.5 实验报告要求1、补全“2.2.3 实验内容”中源程序框架内未写出的程序代码,并说明你在调试该程序过程中遇到了哪些问题,是如何处理的。
补全后的代码如下:STACK SEGMENTSTL DB 100H DUP(?)STACK ENDSDATA S EGMENTINFOR1 DB "Please Input the First Data(<10):$"INFOR2 DB 0AH,0DH,"Please Input the Second Data(<10):$"INFOR3 DB 0AH,0DH,"The Result is:$"DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATA,SS:STACKSTART: MOV AX, DATAMOV D S, AXMOV AX, STACKMOV SS, AXMOV SP, LENGTH STL;表达式“LENGTH STL”的功能为计算STL中定义的变量的个数,;汇编后其值为100H ,详见教材5.2.2MOV D X, OFFSET INFOR1;INFOR1为在数据段中定义的要显示的字符串MOV AH, 09HINT 21HMOV AH, 01HINT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中SUB AL, 30H ;减去30H后得到键入数字所代表的数值MOV BL, ALMOV D X, OFFSET INFOR2;INFOR2为在数据段中定义的要显示的字符串MOV AH, 09HINT 21HMOV AH, 01HINT 21H ;此时程序等待用户键入,键入字符的ASCII码值存在AL中SUB AL, 30H ;减去30H后得到键入数字所代表的数值XOR AH,AHMUL BLAAA ;执行该指令后,AH中为和的十位上的数字,AL中为个位上的数字PUSH AXMOV D X, OFFSET INFOR3;INFOR3为在数据段中定义的要显示的字符串MOV AH, 09HINT 21HPOP AXPUSH AXMOV DL, AHADD DL, 30HMOV AH, 02HINT 21HPOP AXMOV DL, ALADD DL, 30HMOV AH, 02HINT 21HMOV AH, 4CHINT 21HCODE ENDSEND START2、从“2.2.4 实验习题”中任选一道题目,画出流程图,编写源程序,并说明在调试过程中遇到了哪些问题,是如何处理的。
2. 从键盘输入两个一位十进制数,计算这两个数之积,并将结果在屏幕上显示出来。
调试中遇到的问题:开始没有用的AAM指令,即非压缩型BCD乘法调整指令,而是沿用了上例中的AAA指令,结果中有些可以正常显示,如1*2,3*2,3*4,而像5*6,5*5,4*4就不能正常显示。
后查书找到了乘法调整指令,修正后正常运行。
STACK SEGMENTSTL DB 100H DUP(?)STACK ENDSDATA S EGMENTINFOR1 DB "Please Input the First Data(<10):$"INFOR2 DB 0AH,0DH,"Please Input the Second Data(<10):$"INFOR3 DB 0AH,0DH,"The Result is:$"DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATA,SS:STACKSTART: MOV AX, DATAMOV D S, AXMOV D X, OFFSET INFOR1;INFOR1为在数据段中定义的要显示的字符串MOV AH, 09HINT 21HMOV AH, 01HINT 21H;此时程序等待用户键入,键入字符的ASCII码值存在AL中SUB AL, 30H ;减去30H后得到键入数字所代表的数值MOV BL, ALMOV D X, OFFSET INFOR2;INFOR2为在数据段中定义的要显示的字符串MOV AH, 09HINT 21HMOV AH, 01HINT 21H;此时程序等待用户键入,键入字符的ASCII码值存在AL中SUB AL, 30H ;减去30H后得到键入数字所代表的数值MUL BL ;AL BL相乘AAM ;非压缩型BCD码乘法调整指令PUSH A XMOV D X, OFFSET INFOR3;INFOR3为在数据段中定义的要显示的字符串MOV AH, 09HINT 21HPOP AXPUSH AXMOV DL, AH;执行完AAM指令后,只需分别将AH(十位上的数值)和AL(个位上的数值)加上30H,ADD DL, 30H;并依次调用功能号为2的DOS功能调用来显示字符。
MOV AH, 02HINT 21HPOP AXMOV DL, ALADD DL, 30HMOV AH, 02HINT 21HMOV AH, 4CHINT 21HCODE ENDSEND START3、写出实验小结,内容包括实验心得(收获)、不足之处或今后应注意的问题等。