编写程序实现将STRING中的’&’用’/’代替。 50. 分析下列程序段完成的功能: MOV CX,100 LEA SI,FIRST LEA DI,SECOND REP MOVSB
51. 分析下列程序段:
LEA DI,STRING MOV CX,200 CLD
MOV AL,20H REPZ SCASB JNZ FOUND JMP NOT_FOUND 问:转移到FOUND的条件。
52. 设在数据段的变量OLDS和NEWS中保存有5个字节的字符串,如果OLDS字符串不同于
NEWS字符串,则执行NEW_LESS,否则顺序执行程序。 53. 编程实现将STRING字符串中的小写字母变换成大写字母。 54. 设在数据段中定义了:
STUDENT_NAME DB 30 DUP(?) STUDENT_ADDR DB 9 DUP(?) STUDENT_PRINT DB 50 DUP(?)
编写程序实现:
(1)用空格符清除缓冲区STUDENT_PRINT; (2)在STUDENT_ADDR中查找第一个’_’字符; (3)在STUDENT_ADDR中查找最后一个’_’字符;
(4)如果STUDENT_NAME中全为空格符,则STUDENT_PRINT全存入’*’; (5)将STUDENT_NAME传送到STUDENT_PRINT的前30个字节中,将STUDENT_ADDR传送到STUDENT_PRINT的后9个字节中。
55. 在DS:X_BUF为起始地址的表中存有按由小到大顺序排列的一组16位无符号数,其中
该表的第一、二两字节存放数据个数。现在DS:X_KEY中存有一个关键字(16位无符号数),要求从上述表中查找第一个此关键字,若找到此关键字,则DI中存放该关键字在该表中的偏移量;若无此关键字,则将该关键字插入X_BUF表中,使该表依然有序,并将该关键字在表中的偏移量存放在DI中。 56. 分析下列子程序FUNC1,并回答相应的问题。
FUNC1 PROC NEAR XOR CX,CX MOV DX,01 MOV CL,X JCXZ A20
INC DX INC DX DEC CX JCXZ A20 A10: MOV AX,02 SHL AX,CL ADD DX,AX LOOP A10 A20: MOV Y,DX RET FUNC1 ENDP
若该子程序的入口参数为X(0≤X≤10),其输出参数为Y,则:
(1) 该子程序的功能是Y=f(X)= ; (2) 若X=0 , 则Y= ; 若X=3 , 则Y= ; 若X=5 , 则Y= 。
57. 已知N(3 从第二个字节开始存放数据,下列的FUNC2子程序完成对这N个数据按由大到小排序,在划线处填入必要指令,使以下子程序完整。 FUNC2 PROC NEAR LEA SI,INX XOR CX, CX MOV CL, [SI] DEC CX B10: INC SI MOV DI,SI PUSH SI MOV AL,[SI] B20: INC SI CMP AL,[SI] MOV AL,[SI] MOV DI,SI B30: LOOP B20 POP CX POP SI MOV AH,[SI] MOV [SI],AL MOV [DI],AH LOOP B10 FUNC2 ENDP 58. 假设X和X+2单元的内容为双精度数P,Y和Y+2单元的内容为双精度数Q (P,Q均 为无符号数,其中X,Y为低位数),下列的子程序FUNC3完成使 2P>Q时,(AX)=1;2P<=Q时,(AX)=-1 ,在划线处填入必要指令,使以下子程序完整。 FUNC3 PROC NEAR MOV DX,X+2 MOV AX,X ADD AX,AX ADC DX,DX JC C10 CMP DX,Y+2 C20 C10 CMP AX,Y C20 C10: MOV AX,1 C30 C20: MOV AX,-1 C30: RET FUNC3 ENDP 59. (上机题)编写程序实现,将缓冲区BUFFER中的100个字按递增排序,并按下列格式顺 序显示: 数据1 <原序号> 数据2 <原序号> ?? 60. (上机题)按同余法产生一组随机数N(1 课程的成绩,要求编程实现计算每个同学的平均成绩,并根据平均成绩统计全班的成绩各等级的人数(A:90~100,B:80~89,C:70~79,D:66~69,E:60~65,F:60分以下),按下列格式显示: Total <总人数> A: <人数1> B: <人数2> C: <人数3> D: <人数4> E: <人数5> F: <人数6> 61. (上机题)编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择: (1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示: <原字符串>例如:abcdgyt0092 <新字符串> ABCDGYT0092 按任一键重做;按Esc键返回主菜单。 (2)按数字键“2”,完成在字符串中找最大值。用户输入由英文大小写字母或数字 0~9组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示: <原字符串> The maximum is <最大值>. 按任一键重做;按Esc键返回主菜单。 (3)按数字键“3”,完成输入数据组的排序。用户输入一组十进制数值(小于255), 然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示: <原数值串> <新数值串> 按任一键重做;按Esc键返回主菜单。 (4)按数字键“4”,完成时间的显示。首先提示用户对时,即改变系统的定时器 HH:MM:SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时 间:HH:MM:SS。 按任一键重新对时;按Esc键返回主菜单。 (5)按数字键“5”,结束程序的运行,返回操作系统。 [参考答案] 1. 解:(1)var1 DW 4512H,4512,-1,100/3,10H,65530 (2)var2 DB ’BYTE’, ’word’, ’WORD’ (3)buf1 DB 100 DUP(?) (4)buf2 DB 7 DUP(5 DUP(55H), 10 DUP(240)) (5)var3 DB LENGTH buf1 (6)pointer DW var1, var2 3. 答: (1)MOV SI,100 ;指令正确,源:立即数寻址,目的:寄存器寻址 (2)MOV BX,VAR1[SI] ;指令正确,源:寄存器相对寻址,目的:寄存器寻址 (3)MOV AX, [BX] ;指令正确,源:寄存器间接寻址,目的:寄存器寻址 (4)MOV AL, [DX] ;指令错误,DX不能用作为地址寄存器 (5)MOV BP, AL ;指令错误,类型不一致 (6)MOV VAR1, VAR2 ;指令错误,MOV指令不能从存储器到存储器传送 (7)MOV CS, AX ;指令错误,CS不能用作为目的操作数 (8)MOV DS, 0100H ;指令错误,MOV指令不能将立即数传送到段寄存器 (9)MOV [BX][SI], 1 ;指令错误,类型不定 (10)MOV AX, VAR1+VAR2 ;指令错误,MOV指令中不能完成加法运算 (11)ADD AX, LENGTH VAR1 ;指令正确,源:立即数寻址,目的:寄存器寻址 (12)OR BL, TYPE VAR2 ;指令正确,源:立即数寻址,目的:寄存器寻址 (13)SUB [DI], 78H ;指令错误,类型不定 (14)MOVS VAR1, VAR2 ;指令正确,源:隐含寻址,目的:隐含寻址 (15)PUSH 100H ;指令错误,立即数不能直接压入堆栈 (16)POP CS ;指令错误,CS不能用作为目的操作数 (17)XCHG AX, ES ;指令错误,XCHG指令中不能使用段寄存器 (18)MOV DS, CS ;指令错误,MOV指令不能从段寄存器到段寄存器 (19)JMP L1+5 ;指令正确,段内直接转移 (20)DIV AX, 10 ;指令错误,DIV指令格式错误 (21)SHL BL, 2 ;指令错误,移位指令的移位数要么是1,要么是CL (22)MOV AL, 15+23 ;指令正确,源:立即数寻址,目的:寄存器寻址 (23)MUL CX ;指令正确,源:寄存器寻址,目的:隐含寻址 (24)XCHG CL, [SI] ;指令正确,源:寄存器间接寻址,目的:寄存器寻址 (25)ADC CS:[0100], AH ;指令正确,源:寄存器寻址,目的:直接寻址 (26)SBB VAR1-5,154 ;指令正确,源:立即数寻址,目的:直接寻址 5. 答:(1)JMP L1 ;段内直接寻址 (2)JMP NEAR L1 ;段内直接寻址 (3)JNZ L1 ;段内相对寻址 (4)JMP BX ;段内间接寻址 (5)JG L1 ;段内相对寻址 (6)JMP VAR1[SI] ;段内间接寻址 (7)JMP FAR PTR L1 ;段间直接寻址(8)JMP DVAR1 ;段间间接寻址 7. 答:DX寄存器中的内容为10FFH 9. 答:(1)ADD AL,N1-N2 ;指令错误,因为N1-N2超出一个字节的范围 (2)MOV AX,N3+N4 ;指令正确 (3)SUB BX,N4-N3 ;指令正确 (4)SUB AH,N4-N3-N1 ;指令错误,因为N4-N3-N1超出一个字节的范围 (5)ADD AL,N2 ; 指令正确 (6)MOV AH,N2*N2 ;指令正确 11. 解:(1)MOV AL,40H (2)SHL AL,1 (3)MOV AH,16H (4)ADD AL,AH 执行后(AL)=96H 13. 解:(1)XOR BX,VAR; 执行后(BX)=00F9H (2)AND BX,VAR; 执行后(BX)=0002H (3)OR BX,VAR; 执行后(BX)=00FBH (4)XOR BX,11110000B;执行后(BX)=003BH (5)AND BX,00001111B;执行后(BX)=00C4H (6)TEST BX,1 ; 执行后(BX)=00CBH(不变) 15. 答:(1)d (2)c (3)b 17. 解: 设要传送的字符串有30个。 N=30 STACK SEGMENT STACK 'STACK' DW 100H DUP(?) TOP LABEL WORD STACK ENDS DATA SEGMENT ASC1 DB 'abcdefghijklmnopqrstuvwxyz1234' ASC2 DB 30 DUP(?) DATA ENDS