1、实验7循环程序设计实验 实验6中1、2题参考程序1. 设数据区有双精度数据A、B 定义例如:A DD 2A3D0B2CH B DD 2573ADEH 求自编程序,计算A与B的和与差,并用十六进制和二进制形式分别显示。用16进制形式显示程序:DATA SEGMENT BUF DB 5 DUP(0) A DD 2A3D0B2CH ;存放情况与 A DW 0B2CH,2A3DH相同 B DD 2573ADEH ;存放情况与 B DW 3ADEH,257H相同 C DD 0,0DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX,DATA
2、MOV DS,AX;以下参考本实验参考程序段15,注意设定数据类型,加添变量C MOV AX,WORD PTR A ADD AX,WORD PTR B MOV WORD PTR C,AX MOV AX,WORD PTR A+2 ADC AX,WORD PTR B+2 MOV WORD PTR C+2,AX;以下调用实验5的参考程序段2,注意将显示内容C的高16位放到AX中。;同时注意在数据区有变量BUF与A,且A在BUF后面。 MOV AX,WORD PTR C+2 MOV DI,OFFSET A ;将DI指向BUF的下一单元 MOV CX,0 MOV BX,16 ;准备除以16CBUF10:
3、 DEC DI ;准备存放余数,往前倒存 INC CX MOV DX,0;将除数的高16位(在DX中)清0,DX也将用来存放余数 DIV BX ;DX,AX除以BX (BX=16) ADD DL,30H ;余数变为ASCII码值 MOV BYTE PTRDI,DL ;存储十六进制数 CMP AX,0 ;是否为0? JNZ CBUF10 ;不为0转CBUF10 CHANGE11: MOV DL,BYTE PTRDI;取出存放在BUF中的十六进制数到DL供显示 CMP DL,3AH ;是否小于10? JB CHANGE12 ;如果小于10转显示 ADD DL,7 ;否则为A到F之间数,加7CHAN
4、GE12: MOV AH,2 ;显示1个字符 INT 21H INC DI LOOP CHANGE11;以下再调用实验5的参考程序段2,以显示C的低16位。;注意将显示内容C的低16位放到AX中。;还要注意改变标号CBUF10到CBUF12为CBUF13到CBUF15 MOV AX,WORD PTR C MOV DI,OFFSET A ;将DI指向BUF的下一单元 MOV CX,0 MOV BX,16 ;准备除以16CBUF13: DEC DI ;准备存放余数,往前倒存 INC CX MOV DX,0;将除数的高16位(在DX中)清0,DX也将用来存放余数 DIV BX ;DX,AX除以BX
5、(BX=16) ADD DL,30H ;余数变为ASCII码值 MOV BYTE PTRDI,DL ;存储十六进制数 CMP AX,0 ;是否为0? JNZ CBUF13 ;不为0转CBUF13 CHANGE14: MOV DL,BYTE PTRDI;取出存放在BUF中的十六进制数到DL供显示 CMP DL,3AH ;是否小于10? JB CHANGE15 ;如果小于10转显示 ADD DL,7 ;否则为A到F之间数,加7CHANGE15: MOV AH,2 ;显示1个字符 INT 21H INC DI LOOP CHANGE14 MOV AH,4CH INT 21HCODE ENDSEND
6、START本解存在问题:当低16位字数不到4位时显示结果位数错误。如果利用子程序完成本题,程序如下:DATA SEGMENT BUF DB 5 DUP(0) A DD 2A3D0B2CH ;存放情况与 A WORD OB2CH,2A3DH相同 B DD 2573ADEH ;存放情况与 A WORD 3ADEH,257H相同 C DD 0,0DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX,DATA MOV DS,AX;以下参考本实验参考程序段15,注意设定数据类型,加添变量C MOV AX,WORD PTR A ADD AX,W
7、ORD PTR B MOV WORD PTR C,AX MOV AX,WORD PTR A+2 ADC AX,WORD PTR B+2 MOV WORD PTR C+2,AX;以下调用显示子程序,注意将显示内容C的高16位放到AX中。MOV AX,WORD PTR C+2CALL DISP_16;以下再调用显示子程序,以显示C的低16位。;注意将显示内容C的低16位放到AX中。MOV AX,WORD PTR CCALL DISP_16; MOV AH,4CH INT 21H;以下将实验5的参考程序段2改为子程序。开始定义子程序名,注意结尾用RET返回。;注意子程序的位置在MOV AH,4CH
8、与 INT 21H 二句的后面。;仍然要注意在数据区有变量BUF与A,且A在BUF后面。DISP_16 PROC MOV DI,OFFSET A ;将DI指向BUF的下一单元 MOV CX,0 MOV BX,16 ;准备除以16CBUF10: DEC DI ;准备存放余数,往前倒存 INC CX MOV DX,0;将除数的高16位(在DX中)清0,DX也将用来存放余数 DIV BX ;DX,AX除以BX (BX=16) ADD DL,30H ;余数变为ASCII码值 MOV BYTE PTRDI,DL ;存储十六进制数 CMP CX,4 ;是否4个16进制数字?注意本处略微改动解决了上一解法的
9、问题。 JNZ CBUF10 ;不为0转CBUF10 CHANGE11: MOV DL,BYTE PTRDI;取出存放在BUF中的十六进制数到DL供显示 CMP DL,3AH ;是否小于10? JB CHANGE12 ;如果小于10转显示 ADD DL,7 ;否则为A到F之间数,加7CHANGE12: MOV AH,2 ;显示1个字符 INT 21H INC DI LOOP CHANGE11RETDISP_16 ENDPCODE ENDSEND START注:(1)注意本解中将CMP AX,0这一句改为CMP CX,4就解决了上一解法的问题,即使低16位只有0个、1个、2个、3个非零16进制数
10、字,结果都是正确的。(2)请在本解基础上考虑如果改为10进制显示,只需要改那二个数字?如果改为2进制显示,又只需要改那三个数字?用2进制形式显示程序又一解:DATA SEGMENT BUF DB 5 DUP(0) A DW 0B2CH,2A3DH ;存放情况与 A DW 0B2CH,2A3DH相同 B DW 3ADEH,257H ;存放情况与 B DW 3ADEH,257H相同 C DW 0,0DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX,DATA MOV DS,AX;以下参考本实验参考程序段15,注意设定数据类型,加添变量
11、C MOV AX,WORD PTR A ADD AX,WORD PTR B MOV WORD PTR C,AX MOV AX,WORD PTR A+2 ADC AX,WORD PTR B+2 MOV WORD PTR C+2,AX;以下调用显示子程序,注意将显示内容C分4次放到BL中。MOV BL,BYTE PTR C+3 ;请想一下以下C的4个字节显示次序为什么如此CALL DISP_2MOV BL,BYTE PTR C+2CALL DISP_2MOV BL,BYTE PTR C+1CALL DISP_2MOV BL,BYTE PTR CCALL DISP_2 MOV AH,4CH INT
12、21H;以下将实验6的参考程序段2改为子程序。开始定义子程序名,注意结尾用RET返回。;注意子程序的位置在MOV AH,4CH 与 INT 21H 二句的后面。;要注意显示内容要求放到BL中,每次显示8位。DISP_2 PROC MOV CL,8 NEXT: MOV DL,0 SAL BL,1 RCL DL,1 ADD DL,30H MOV AH,2 INT 21H DEC CL JNE NEXTRETDISP_2 ENDPCODE ENDSEND START减法程序与以上程序类似,不再给出解答。2. 设数据区有双精度数据A=2A3D0B2CH、B= 2573ADEH,其存储情况如下所示。求自
13、编程序,计算A与B的积,放到数据区的X1,X2,X3,X4四个字单元中,再求用十六进制形式显示。 A1 DW 2A3DH A2 DW 0B2CH B1 DW 532DH B2 DW 3ADEH X1 DW 0 X2 DW 0 X3 DW 0 X4 DW 0 提示:如上数据区有字变量X1,X2,X3,X4;初值均为0;X1准备存结果的最高16位;X4准备存结果的最低16位;将A看成A1,A2;A1为高16位,A2为低16位;同样,B看成B1,B2。 那么,可以将B2与A2的积加到X3,X4中;将B2与A1的积加到X2,X3中;将B1与A2的积加到X2,X3中;将B1与A1的积加到X1,X2中;注
14、意进位。DATA SEGMENT BUF DB 5 DUP(0) A DB 0 ;BUF之后标志,满足显示子程序的要求 A1 DW 2A3DH A2 DW 0B2CH B1 DW 532DH B2 DW 3ADEH X1 DW 0 X2 DW 0 X3 DW 0 X4 DW 0DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATASTART:MOV AX,DATA MOV DS,AX;以下参考本实验参考程序段1 MOV AX,A1 MUL B1 MOV X1,AX MOV X2,DX;以下再参考本实验参考程序段1,注意乘数与乘积位置,;再注意以加的方式加到存
15、储单元中 MOV AX,A1 MUL B2 ADD X2,AX ADC X3,DX MOV AX,A2 MUL B1 ADD X2,AX ADC X3,DX MOV AX,A2 MUL B2 ADD X3,AX ADC X4,DX;以下调用显示子程序。MOV AX,X4CALL DISP_16MOV AX,X3CALL DISP_16MOV AX,X2CALL DISP_16MOV AX,X1CALL DISP_16 MOV AH,4CH INT 21H;以下为实验5的参考程序段2改的子程序。;仍然要注意在数据区有变量BUF与A,且A在BUF后面。DISP_16 PROC MOV DI,OFF
16、SET A ;将DI指向BUF的下一单元 MOV CX,0 MOV BX,16 ;准备除以16CBUF10: DEC DI ;准备存放余数,往前倒存 INC CX MOV DX,0;将除数的高16位(在DX中)清0,DX也将用来存放余数 DIV BX ;DX,AX除以BX (BX=16) ADD DL,30H ;余数变为ASCII码值 MOV BYTE PTRDI,DL ;存储十六进制数 CMP CX,4 ;是否到4个字? JNZ CBUF10 ;不为0转CBUF10 CHANGE11: MOV DL,BYTE PTRDI;取出存放在BUF中的十六进制数到DL供显示 CMP DL,3AH ;是
17、否小于10? JB CHANGE12 ;如果小于10转显示 ADD DL,7 ;否则为A到F之间数,加7CHANGE12: MOV AH,2 ;显示1个字符 INT 21H INC DI LOOP CHANGE11 RET DISP_16 ENDPCODE ENDS END START 实验7 循环程序认识与设计练习一、实验内容:自编算术运算、逻辑运算、移位运算程序段,和供参考的数据转换、显示程序段组合成完整程序,上机实现并验证。二、实验目的:1.通过参考程序段的1与2,了解循环程序的结构与意义。2. 复习双精度数运算程序设计方法。 3. 复习逻辑运算、移位运算指令内容与使用方法,学习用这些指
18、令解决实际问题的方法。 4. 熟悉常见的算术运算、逻辑运算、移位运算程序设计方法。 5. 学习1号、2号、9号DOS系统功能调用的使用方法 6. 复习数据转换程序与显示程序设计方法 7. 学习将多个程序段拼凑设计程序的方法三、实验题目1. 求利用2号中断接受从键盘输入的最多4个16进制数字组成一个16进制数,并依次用十六进制、十进制显示的程序。2. 接上题,求将字变量BUF的值乘以上述16进制数,再用十六进制数显示的程序。3. 在内存的源数据区SOURCE处有若干个ASCII码字符,要求将其中的英文大写字母转换为小写字母,其它字符不转换,并存放到结果数据区DEST处。已知数据区如下。DATA
19、SEGMENTSOURCE DB BEIjin2008OLYMPICCOUNT EQU $-SOURCE ;字符个数DEST DB COUNT DUP(?)DATA ENDS分析:英文大写字母AZ,ASCII码值为41H5AH。相应的小写字母为az,ASCII码值为61H7AH。英文大写字母要转换为相应的小写字母只要ASCII码值加20H即可。4. 修改上述程序:将输入到数据区DEST处的字符串在屏幕上显示出来。5. 将以下参考程序段中第3到9题补充完整再上机验证。供参考的程序段: (1)二进制数转换为十六进制数显示。要求在数据区设置BUF DB 10 DUP(0)和D0,例如 D0 DW 1
20、234H MOV DI,OFFSET BUF+10 ;到存储区尾部 DEC DI ;到上一单元 MOV DI,BYTE PTR $ ;9号功能调用要显示内容最后加$表示字串结束 MOV AX,D0 ;取要用来变十进制数的数到AX MOV BX,16 ;准备除以16CHANGE10: DEC DI ;到上一单元 MOV DX,0 ;将除数的高16位(在DX中)清0,DX也将用来存放余数 DIV BX ;DX,AX除以BX (BX=10) ADD DL,30H ;余数变为ASCII码值 MOV BYTE PTRDI,DL ;存储十六进制数 CMP AX,0 ;是否为0? JNZ CHANGE10
21、;不为0转CHANGE10 CHANGE11: MOV DX,DI ;取出存放在BUF中的ASCII码形式的十六进制数首地址到DX中供显示 MOV AH,9 ;显示十六进制数 INT 21H(2)ASCII码表示的十进制数转换为二进制数并显示。要求在数据区设置要求显示的BUF数据,DB类型 MOV SI,OFFSET BUF ;将BUF的地址放到SI中 MOV DX,0 ;清DX为0; MOV CX,5 ;置循环次数为5 MOV BX,10GET_ASC: MOV AL,SI ;取出一个字符 CMP AL,0 ;必须保证5个数都是十进制数(0-9) JB EXIT CMP AL,9 JA EX
22、IT ;判断是否是“0”-“9”DEC_BIN: SUB AL,30H ;减30H变二进制数 MOV AH,0 PUSH AX ;转换为对应的数并置于AX中,转存堆栈 MOV AX,DX MUL BX ;AX内容乘10 MOV DX,AX POP AX ADD DX,AX ;(DX)(DX) * 10 + (AX) INC SI ;使指针SI指向下一个字符 DEC CX JNZ GET_ASC MOV BX,DX ;取要显示的字符到BL中 MOV CL,16 ;移16次,最大数64000NEXT: MOV DX,0 SAL BX,1 RCL DX,1 ADD DX,30H MOV AH,2 I
23、NT 21H DEC CL JNE NEXT(3)以移位方式显示16进制数(要求在数据区设置用来变十六进制数的数D0,例如 D0 DW 1234h)解1: MOV SI,D0 ;取要用来变十六进制数的数到SI MOV BX,4 ;每个字显示4个16进制字符CHANGE10: MOV CX,4 ;准备左移4位(除以16) MOV DX,0 ;将显示内容存储器(在DX中)清0CHANGE20: SHL SI,1 ;SI移一位到进位位 RCL DX,1 ;进位位移到DX LOOP CHANGE20 ;移4次 ADD DL,30H ;一个16进制数变为ASCII码值 CMP DL,3AH ;是否小于1
24、0? JB CHANGE12 ;如果小于10转显示 ADD DL,7 ;否则为A到F之间数,加7CHANGE12: MOV AH,2 ;显示1个字符 INT 21H DEC BX ;处理下一个字符 CMP BX,0 ;是否为0? JNZ CHANGE10 ;不为0转CHANGE10 解2: MOV SI,D0 ;取要用来变十六进制数的数到SI MOV BX,4 ;每个字显示4个16进制字符CHANGE10: MOV CL,4 ;准备循环左移4位 ROL SI,CL ; SI循环左移4位MOV DX,SI ;SI内容送显示 AND DL,0FH ADD DL,30H ;一个16进制数变为ASCI
25、I码值 CMP DL,3AH ;是否小于10? JB CHANGE12 ;如果小于10转显示 ADD DL,7 ;否则为A到F之间数,加7CHANGE12: MOV AH,2 ;显示1个字符 INT 21H DEC BX ;处理下一个字符 CMP BX,0 ;是否为0? JNZ CHANGE10 ;不为0转CHANGE10 (4)ASCII码表示的十六进制数到二进制数的转换INPUT: MOV AH,01H INT 21H ;键盘输入 SUB AL,30H JL EXIT ;输入其它字符 CMP AL,0AH JL CHANGE ;输入0-9 SUB AL,07H CMP AL,0AH JL
26、EXIT ;输入其它字符 CMP AL,0FH JLE CHANGE ;输入A-F SUB AL,20H CMP AL,0AH JL EXIT ;输入其它字符 CMP AL,0FH JLE CHANGE ;输入a-f JMP EXIT ;输入其它字符CHANGE: MOV CL,4 SHL DX,CL MOV AH,0 ADD DX,AX ;(DX)(DX) * 16 + (AX) DEC BL JNZ INPUTEXIT: MOV BX,DX ;取要显示的字符到BL中 MOV CL,16 ;移16次NEXT: MOV DX,0 SAL BX,1 RCL DX,1 ADD DX,30H MOV
27、 AH,2 INT 21H DEC CL JNE NEXT(5)十进制数的ASCII码转换为压缩型BCD码。要求在数据区有ASC_BUF、BCDBUF二个数据集,由若干个十进制数的ASCII码字符组成,要定义其长度放到COUNT中。 MOV SI,OFFSET ASC_BUF MOV DI,OFFSET BCDBUF MOV CX,COUNT MOV BX,CX SHR BX,1 ;BX右移一位,等效于除2 JNC EVEN1 ;(CF)=0,则CX为偶数 MOV BL,SI ;对首位单独进行处理 AND BL,0FH MOV DI,BL DEC CX INC SI INC DIEVEN1:
28、MOV AL,SI AND AL,0FH ;清高4位为0 MOV BL,SI+1 AND BL,0FH ;清高4位为0 MOV DL,16 MUL DL ADD AL,BL MOV DI,AL ADD SI,2 INC DI DEC CX JNZ EVEN1(6)BCD码转换为十进制数的ASCII码,要求在数据区有ASC_BUF数据,DB类型,共3个数据。 MOV SI,OFFSET BCD_BUF ADD SI,3 MOV CX,3 MOV DH,0CHG_OUT1:PUSH CX MOV AL,SI ;取压缩BCD码 DEC SI ;修改指针 MOV DL,AL MOV CL,4 ROR
29、AL,CL AND AL,0FH ;取高半字节BCD码 ADD AL,30H ;生成ASCII码 MOV DL,AL MOV AH,2 INT 21H ;标准设备输出 MOV AL,DL AND AL,0FH ;取低半字节BCD码 ADD AL,30H ;生成ASCII码 MOV DL,AL MOV AH,2 INT 21H ;标准设备输出 POP CX DEC CX JNZ CHG_OUT1 (7)双字除10取余求变10进制数(设双字在DX AX中,除数10在BX中,在数据区中准备字节类型10个字数据区D:D DB 10 DUP(?) ) LEA DI,D+10 MOV DI,BYTE PT
30、R $ ;准备调用9号中断显示程序 DEC DI ;到上一单元 MOV SI,AX ;保存AX MOV AX,DX ;取要用来变十进制数的数的高16位到AX MOV BX,10 ;准备除以10CHANGE10: MOV DX,0;将除数的高16位(在DX中)清0,DX也将用来存放余数 DIV BX ;DX,AX除以BX (BX=10) MOV CX,AX ;保存高16位除以10的商 MOV AX,SI ;再恢复AX中原来的双字的低16位 DIV BX ADD DL,30H ;余数变为ASCII码值 MOV BYTE PTRDI,DL ;存储十进制数 DEC DI ;到上一单元 MOV SI,AX
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1