汇编练习及答案

更新时间:2024-04-03 04:02:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

4.2 习 题

1. 写出完成下列要求的变量定义语句:

(1)在变量var1中保存6个字变量:4512H,4512,-1,100/3,10H,65530; (2)在变量var2中保存字符串:’BYTE’, ’word’, ’WORD’; (3)在缓冲区buf1中留出100个字节的存储空间;

(4)在缓冲区buf2中,保存5个字节的55H,再保存10个字节的240,并将这一过程重复7次;

(5)在变量var3中保存缓冲区buf1的长度;

(6)在变量pointer中保存变量var1和缓冲区buf1的偏移地址。

2. 设变量var1的逻辑地址为0100:0000,画出下列语句定义的变量的存储分配图: var1 DB 12,-12,20/6,4 DUP(0,55H) var2 DB ‘Assemble’

var3 DW ‘AB’, ‘cd’, ‘E’ var4 DW var2 var5 DD var2

3. 指令正误判断,对正确指令写出源和目的操作数的寻址方式,对错误指令指出原因(设VAR1, VAR2为字变量, L1为标号):

(1)MOV SI,100 (2)MOV BX,VAR1[SI] (3)MOV AX, [BX] (4)MOV AL, [DX] (5)MOV BP, AL (6)MOV VAR1, VAR2 (7)MOV CS, AX (8)MOV DS, 0100H

(9)MOV [BX][SI], 1 (10)MOV AX, VAR1+VAR2 (11)ADD AX, LENGTH VAR1 (12)OR BL, TYPE VAR2 (13)SUB [DI], 78H (14)MOVS VAR1, VAR2 (15)PUSH 100H (16)POP CS (17)XCHG AX, ES (18)MOV DS, CS (19)JMP L1+5 (20)DIV AX, 10 (21)SHL BL, 2 (22)MOV AL, 15+23 (23)MUL CX (24)XCHG CL, [SI] (25)ADC CS:[0100], AH (26)SBB VAR1-5,154

4. 说明下列指令对的区别:

(1) MOV AX,VAR1 与 MOV AX,OFFSET VAR1 (2) MOV AX,VAR2 与 LEA AX,VAR2

(3) MOV AL,LENGTH VAR1 与 MOV AL,SIZE VAR1 (4) MOV AL,ES: [DI] CMP AL, [SI]与 CMPSB (5) SHR AL,1 与 SAR AL,1 (6) SHR AL,1 与 ROR AL,1 (7) ROL BX,1 与 RCL BX,1

5. 写出下列转移指令的寻址方式(设L1为标号,VAR1为字型变量,DVAR1为双字型变量):

(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

6. 设(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=3412H,(20102)=7856H,(21200)=4C2AH,(21202)=65B7H,求下列指令执行后AX寄存器的内容: (1)MOV AX,1200H; (2)MOV AX,BX; (3)MOV AX, [1200H]; (4)MOV AX, [BX]; (5)MOV AX,1100[BX];(6)MOV AX, [BX][SI]; (7)MOV AX,1100[BX][SI]

7. 执行下列指令后,DX寄存器中的内容是多少?

TABLE DW 25,36,-1,-16,10000,13 PYL DW 7 ??

MOV BX,OFFSET TABLE ADD BX,PYL MOV DX,[BX]

8.如果堆栈的起始地址为2200:0000,栈底为0100H,(SP)=00A8H,求 (1)栈顶地址; (2)SS的内容;

(3)再存入数据5678H,3AF2H后,SP的内容。

9. 设已用伪指令EQU定义了4个标识符:

N1 EQU 2100 N2 EQU 10 N3 EQU 20000 N4 EQU 25000

下列指令是否正确?并说明原因。

(1)ADD AL,N1-N2; (2)MOV AX,N3+N4; (3)SUB BX,N4-N3; (4)SUB AH,N4-N3-N1; (5)ADD AL,N2; (6)MOV AH,N2*N2

10. 按下列要求写出指令:

(1)将AX寄存器的低4位清零,其余位不变; (2)将BX寄存器的低4位置1,其余位不变; (3)将AL寄存器的低4位保持不变,高4位取反;

(4)测试BX中的位1和位2,当这两位同时为0时将AL置0FFH,否则AL清零; (5)测试BX中的位1和位2,当这两位有一位为0时将AL置0FFH,否则AL清零; (6)将AL中保存的字母ASCII码变换成相应的大写字母的ASCII码; (7)将AL中保存的字母ASCII码变换成相应的小写字母的ASCII码; (8)将AX中的各位取反;

(9)将DX中的低7位取反,高9位不变; (10)将CX中的低8位与高8位互换。

11. 写出完成下述功能的程序段: (1)传送40H到AL寄存器;

(2)将AL的内容乘以2; (3)传送16H到AH寄存器; (4)AL的内容加上AH的内容。

计算最后结果(AL)=?

12. 写出完成下述功能的程序段:

(1)从缓冲区BUF的0004偏移地址处传送一个字到AX寄存器; (2)将AX寄存器的内容右移2位;

(3)将AX内容与BUF的0006偏移地址处的一个字相乘; (4)相乘结果存入BUF的0020H偏移地址处(低位在前)。

13. 设(BX)=11001011B,变量VAR的内容为00110010B,求下列指令单独执行后BX的内容:

(1)XOR BX,VAR; (2)AND BX,VAR; (3)OR BX,VAR; (4)XOR BX,11110000B; (5)AND BX,00001111B; (6)TEST BX,1。

14. 设(DX)=10111011B,(CL)=3,(CF)=1,求下列指令单独执行后DX的内容:

(1)SHR DX,1; (2)SAR DX,CL; (3)SHL DX,CL; (4)SHL DX,1; (5)ROR DX,CL; (6)ROL DL,CL; (7)SAL DH,1; (8)RCL DX,CL; (9)RCR DL,1 15. 选择题(各小题只有一个正确答案)

(1)执行下列三条指令后: MOV SP,1000H PUSH AX CALL BX

a. (SP)=1000H; b. (SP)=0FFEH; c. (SP)=1004H; d. (SP)=0FFCH;

(2)要检查寄存器AL中的内容是否与AH相同,应使用的指令为: a. AND AL, AH b. OR AL, AH c. XOR AL, AH d. SBB AL, AH

(3)指令JMP NEAR PTR L1与CALL L1(L1为标号)的区别在于: a. 寻址方式不同; b. 是否保存IP的内容; c. 目的地址不同; d. 对标志位的影响不同。 16. 寄存器DX:AX组成32位数,DX为高位,编写程序段实现: (1)DX:AX右移3位,并将移出的低3位保存在CL中; (2)DX:AX左移3位,并将移出的高3位保存在CL中;

17. 已知在BUF的起始处保存有N个字符的ASCII码,编写汇编语言程序实现,将这组字符串传送到缓冲区BUFR中,并且使字符串的顺序与原来的顺序相反。 18. 利用移位、传送和相加指令实现AX的内容扩大10倍。

19. 在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;如果VAR中保存的为有符号数,则再编写程序实现将其按递减关系排列。

20. 编写程序段实现将BL中的每一位重复4次,构成32位的双字DX:AX,例如当BL=01011101B时,得到的(DX)=0F0FH,(AX)=0FF0FH。

21. 编写程序段实现将AL和BL中的每一位依次交叉,得到的16位字保存在DX中,例如(AL)=01100101B,(BL)=11011010B,则得到的(DX)=10110110 10011001B。 22. 在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实现:

(1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2; (2)当两数均为奇数时,两个变量的内容不变; (3)当两数均为偶数时,两数缩小一倍后存入原处。

23. 已知在字变量VAR1、VAR2和VAR3中保存有3个相同的代码,但有一个错码,编写程序段找出这个错码,并将它送AX,其地址送SI;如果3个代码都相同,则在AX中置-1标志。

24. 分析下列程序段的功能: MOV CL,04 SHL DX,CL MOV BL,AH SHL AX,CL SHR BL,CL OR DL,BL

25. 下列程序段执行后,求BX寄存器的内容: MOV CL,3 MOV BX,0B7H 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)。

2221?2???n??的前n项和刚大于2000的项数n。 41. 编写程序实现求级数

F1?1,F2?1,Fi?Fi?1?Fi?2(i?3),编写

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

从第二个字节开始存放数据,下列的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

本文来源:https://www.bwwdw.com/article/gefr.html

Top