ROL BX,1
ROR BX,CL
26. 下列程序段执行后,求BX寄存器的内容:
MOV CL,5
MOV BX,7D5CH
SHR BX,CL
27. 设数组ARRAY的第1个字节存放数组的长度(<256),从第2个字节开始存放无符号8位数,求数组元素之和(结果放在AX中)。如果计算的和超出16位数的范围,则给出溢出标志DX=-1。
28. 设BUF中存放有N个无符号数(或有符号数),编程实现求它们的最小值(存入AX)和最大值(存入DX)。
29. 设BUFFER中存放有N个无符号(第1个字节存放缓冲区的长度),编程实现将其中的0元素抹去,并更新其长度。
30. 编写程序实现N个字乘以或除以1个字,设BUFN存放N个字,BUF1存放乘数或除数,PRODUCT存放乘积,QUOTIENT存放商,REMAINDER存放余数。
31. 编写一个子程序实现统计AL中1的个数,然后检测出字节型缓冲区BUF中0和1个数相等的元素个数。
32. 设有n(设为17)个人围坐在圆桌周围,按顺时针给他们编号(1,2,…,n),从第1个人开始按顺时针方向加1报数,当报数到m(设为11)时,该人出列,余下的人继续进行,直到所有人出列为止。编写程序模拟这一过程,求出出列人的编号顺序。
33. 编写子程序实现以十六进制数在屏幕上显示AL的内容。
34. 从键盘上读入一个正整数N(0≤N≤65535),转换成十六进制数存入AX,并在屏幕上显示出来。
35. 在缓冲区BUFFER中,第1个字节存放数组的长度(<256),从第2个字节开始存放字符的ASCII码,编写子程序完成在最高位给字符加上偶校验。
36. 编写程序完成求多位数(N个字)的绝对值。
37. 已知斐波那契数列的定义为: ,编写求该数列前n项的子程序。
38. 编写程序实现循环显示10条信息,保存每条信息的变量分别为INFOM1~INFORM10。
39. 编写程序实现将包含20个数据的数组ARRAY分成两个数组:正数数组ARRAYP和负数数组ARRAYN,并分别将这两个数组中数据的个数显示出来。
40. 编写程序实现求缓冲区BUFFER100个字中的最小偶数(存入AX)。
41. 编写程序实现求级数 的前n项和刚大于2000的项数n。
42. 已知数组A中包含有15个互不相等的整数,数组B中包含有20个互不相等的整数,编写程序实现将既在数组A中出现又在数组B中出现的整数存放于数组C中。
43. 定义一条宏指令,实现将指定数据段的段地址传送到段寄存器ES或DS的功能。
44. 定义一条宏指令,实现从键盘中输入一个字符串(利用INT 21H的09号功能)。
45. 定义一条宏指令,实现在屏幕上显示出指定的字符串。
46. 定义一条宏指令,实现在屏幕上输出回车、换行。
47. 利用其它指令完成与下列指令一样的功能:
(1)REP MOVSB; (2)REP LODSB;
(3)REP STOSB; (4)REP SCASB。
48. 设在数据段中定义了:
STR1 DB ‘ASSEMBLE LANGUAGE’
STR2 DB 20 DUP(?)
利用字符串指令编写程序段实现:
(1)从左到右将STR1中的字符串传送到STR2;
(2)从右到左将STR1中的字符串传送到STR2;
(3)将STR1中的第6个和第7个字节装入DX;
(4)扫描STR1字符串中有无空格,如有则将第一个空格符的地址传送到SI。
49. 设在数据段中定义了:
STRING DB ‘Today is Sunday & July 16, 2000’
编写程序实现将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<N<100)个8位无符号数已存放在缓存区INX中,其中第一个字节存放个数N,从第二个字节开始存放数据,下列的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<N<=50),并按N+50赋给45名同学的5门课程的成绩,要求编程实现计算每个同学的平均成绩,并根据平均成绩统计全班的成绩各等级的人数(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
CODE SEGMENT