您好,欢迎来到微智科技网。
搜索
您的当前位置:首页汇编语言习题-测验题答案

汇编语言习题-测验题答案

来源:微智科技网


汇编语言各章习题、测试题答案

习题一

1.1 分别将下列二进制数作为无符号数和带符号数转换为十进制和十六进制数

11010011 01110111 10000011 00101111 10101010

1.2 十六进制运算

1A52H+4438H 3967H-2D81H 37H×12H 1250H×4H

1.3 将十进制数变为8位补码并做运算(结果用二进制、十六进制、十进制表示)

29+53 73-24 -66+82 -102-15

1.4 用压缩BCD码计算(结果用二进制、BCD码、十进制表示)

29+53 73-24 66+18 132+75

1.5 符号位扩展(字节扩展为字,字扩展为双字)

20A3H 94H 3456H 7FH EC00H

1.6 若机器字长为16位,其无符号数表示范围是多少?带符号数表示范围是多少?分别用十进制和十六进制表示。

1.7 写出下列十六进制数所能代表的数值或编码: (1)38H (2)FFH (3)5AH (4)0DH

1.8 将下列十进制数分别转换为二进制、十六进制、二进制补码、压缩BCD码和ASCII码: (1)108 (2)46 (3)-15 (4)254

1.9 写出下列算式的8位二进制运算结果,标志位CF、SF、ZF、OF分别是什么值? (1)56+63 (2)83-45 (3)-74+29 (4)-12-37

1.10 查表,指出ASCII码0DH、0AH、07H、1BH、20H、60H、50H、70H对应的控制字符。

测验一

单选题:

1. 已知X=76,则[X]补= 。

A. 76H B. 4CH C.0B4H D.0CCH 2. 已知[X]补=80H,则X= 。

A. 80H B. 0 C. 0FFH D. -80H

3. 已知[X]补=98H,则[X]补/2= 。 A. 0CCH B.4CH C. 49H D. 31H

4. 已知X=78,Y=-83,则[X+Y]补= 。

A. 0F5H B. 0A1H C. 0FBH D. 65H 5. 将124转换成十六进制数的结果是

A. 7CH B. 7DH C. 7EH D. 7BH 6. 将93H看成一个压缩BCD码,其结果是

A. 10010101 B. 10010011 C.10000011 D.10000001 7. 45转换成二进制数是

A.10101101 B.00111101 C. 00101101 D. 10011101 8.6CH转换成十进制数是

A. 118 B. 108 C. 48 D. 68 9. 将93H扩展为字的结果是

A. FF93H B. 0093H C. 1193H D. 1093H

1

10.56的压缩BCD码是

A. 38H B. 56H C. 0506H D. 3536H 11.ASCII中的47H表示的字符是

A. “7” B. “G” C. “g” D. “E” 12.十进制数-128的8位二进制数的补码为

A. 11111110 B. 01111111 C. 10000000 D. 10000001 13.下列为补码表示,其中真值最大的是

A. 10001000 B.11111111 C.00000000 D.00000001

14.十六进制数88H,可表示成下面几种形式,请找出错误的表示 A. 无符号十进制数136 B. 带符号十进制数-120 C. 压缩BCD码十进制数88 D. 8位二进制数-8的补码

15.计算机对字符、符号采用统一的二进制编码。其编码采用的是

A. BCD码 B. 二进制码 C.ASCII D. 十六进制码

第一章 参

习题一答案:

1.1无符号数: 11010011=211=D3H,01110111=119=77H,10000011=131=83H,

00101111=47=2FH,10101010=170=AAH

带符号数:11010011= -45=D3H,01110111=+119=77H,10000011= -125=83H,

00101111=+47=2FH,10101010= -86=AAH

1.2 5E8AH,0BE6H,3DEH,4940H

1.3 00011101+00110101=01010010=52H=82

01001001+11101000=00110001=31H=49 10111110+01010010=00010000=10H=16 10011010+11110001=10001011=8BH= -117

1.4 00101001+01010011=01111100+00000110=10000010=82H=82

01110011-00100100=01001111-00000110=01001001=49H=49 01100110+00011000=01111110+00000110=10000100=84H=84 0000000100110010+01110101=0000000110100111+00000110

=0000001000000111=0207H=207

1.5 000020A3H,FF94H,00003456H,007FH,FFFFEC00H

1.6 无符号数:0~65535,0000H~FFFFH;带符号数:-32768~+32767,8000H~7FFFH 1.7 (1) 38H等于十进制数56,是十进制数56的补码,数字8的ASCII码,十进制数38的压缩BCD码 (2) FFH等于十进制数-1,是带符号数-1的补码,无符号数为255 (3) 5AH等于十进制数90,是十进制数90的补码,大写字母Z的ASCII码 (4) 0DH等于十进制数13,是十进制数13的补码,回车符的ASCII码 1.8 (1) 108=01101100B=6CH,补码01101100B,压缩BCD码0000000100001000,ASCII码313038H (2) 46=00101110B=2EH,补码00101110B,压缩BCD码01000110,ASCII码3436H (3) –15=11110001B=F1H,补码11110001B,ASCII码2D3135H (4) 254=0000000011111110B=00FEH,补码0000000011111110B,压缩BCD码0000001001010100,ASCII码323534H

1.9 (1) 56+63=01110111B,CF=0,SF=0,ZF=0,OF=0 (2) 83-45=00100110B,CF=0,SF=0,ZF=0,OF=0 (3) -74+29=11010011B,CF=0,SF=1,ZF=0,OF=0 (4) -92-37=01111111B,CF=1,SF=0,ZF=0,OF=1

2

1.10 回车、换行、响铃、ESC键、空格键、@、P、p

测验一答案:

1~5 BDACA 6~10 BCBAB 11~15 BCDDC

习题二

2.1 写出冯·诺依曼计算机的基本特点。

2.2 如何解决内存速度与CPU速度不匹配问题。 2.3 计算机总线的分类与作用。

2.4 简述8086CPU寄存器的分组及各自的作用。 2.5 标志寄存器中都有哪些标志位与计算结果有关? 2.6 简述逻辑地址与物理地址的概念,两者的关系。 2.7 存储器为什么要分段?如何分段。

2.8 8086系统把存储器分为哪四种类型的段?各自的特点是什么。

2.9 8086CPU的地址线为20根,寻址空间为1MB。最少可划分为多少个逻辑段?最多呢? 2.10 在四种类型的段中通常使用哪些寄存器表示逻辑地址?

2.11 字节单元和字单元如何区分?若给出一个地址,如何知道要访问的是字节单元还是字单元? 2.12 偶地址单元和奇地址单元在保存数据上有区别吗?

2.13 有一个32K字节的存储区,首地址是3302:5AC8H,写出其首单元和末单元的物理地址。 2.14 什么是有效地址?如何获得有效地址。

2.15 存储单元地址和内容表示如下,请画出存储单元存放形式。 (1) (1280AH)=3456H (2) (20021H)=4DH (3) (33450H)=37A520D1H 2.16 根据逻辑地址计算出物理地址,并解释逻辑地址与物理地址的对应关系。 (1) 23:3DE9H (2) 1230:EC92H (3) 14D9:C202H 2.17 给出段地址和偏移地址如下,计算出对应的物理地址。 (CS)=54C3H,(ES)=2569H,(DS)=1200H,(SS)=4422H,

(BX)=5678H,(SP)=9945H,(IP)=0E54H,(DI)=63B1H

2.18 已知堆栈区大小为512字节,栈底单元的物理地址为15230H。将两个字入栈保存后,当前栈指针所指单元的物理地址是多少? 堆栈区中还能保存多少个数据? 2.19 写出修改当前数据段200H开始的数据区数据的DEBUG命令。 2.20 对当前代码段从100H开始反汇编的DEBUG命令是什么?

2.21 在DEBUG下,要将寄存器CX的值修改为100H,应该执行什么命令? 2.22 在DEBUG下,怎样将数据段的0号~4号字节单元填入'a'、'b'、'c'、'd'?

测验二

单选题:

1. 在微机系统中分析并控制指令执行的部件是 。

A. 寄存器 B. 数据寄存器 C. CPU D. EU

2. 在计算机的CPU中执行算术逻辑运算的部件是 。

A. ALU B. PC C. AL D. AR

3. 执行指令PUCH CX后堆栈指针SP自动 。

A. +2 B. +1 C. -2 D. -1

4. 在标志寄存器中表示溢出的标志是 。

A. AF B. CF C. OF D. SF

3

5. 对汇编语言源程序进行翻译的程序是 。

A. 连接程序 B. 汇编程序 C. 编译程序 D. 目标程序 6. 在汇编语言中,能够翻译成二进制代码的指令是 。 A. 汇编指令 B. 伪指令 C. 机器指令 D. 宏指令 7. 计算机中存储信息的基本单位是一个 位。

A. 二进制 B. 八进制 C. 十进制 D. 十六进制

8. 若计算机字长16位,则无符号整数的范围用十六进制表示为 。 A. 8000H ~FFFFH B.0000H ~7FFFH C. 0000H ~FFFFH D. 0001H ~FFFFH

9. 在计算机中一个字节由 位二进制数组成。 A. 2 B. 4 C. 8 D. 16

10. 将高级语言程序翻译成机器语言代码的实用程序是 。 A. 编译程序 B. 汇编程序 C. 解释程序 D.目标程序 11. 设物理地址(10FF0H)=10H,(10FF1H)=20H,(10FF2H)=30H,从地址10FF1H中取出一个字的内容是 。

A. 1020H B.3020H C.2030H D.2010H

12.用 指出下一条要执行的指令所在单元的偏移地址。 A.IP B. SP C.通用寄存器 D.段寄存器 13. 代码段寄存器是 。

A.IP B. SP C. DS D. CS

14. 某数据段存储单元的偏移地址为2200H~31FFH,则其存储空间大小是 。 A.2K B.4K C. 8K D. 16K

15.在8086标志寄存器中,ZF=1表示 。

A.结果有进位 B. 结果为0 C.结果溢出 D. 结果为负

16.两个操作数运算时,下列哪种结果会发生溢出 。

A.两个负数相加,结果为负 B.两个正数相加,结果为负 C.一正一负相加,结果为负 D.两个正数相加,结果为正

17.设有一个双精度数12A034B0H,将它存入双字单元12000H,那么12003H中存放的是 。 A.B0H B.34H C.A0H D.12H 18.堆栈段的逻辑地址由 组成。

A.DS:BX B.ES:DI C.CS:IP D.SS:SP

19.代码段某单元的逻辑地址为3458:2C92H,其物理地址为 。

A.37212H B. 36FF2H C.34580H D. 32C92H 20.物理地址的计算公式是 。

A.段地址×10+偏移地址 B. 偏移地址×10+段地址 C.段地址×10H+偏移地址 D. 偏移地址×10H+段地址 21.在8086系统中,数据寄存器组为 。

A.SI、DI、SP、BP B. AX、BX、CX、DX C. CS、DS、ES、SS D. CF、SF、ZF、OF 22.在内存中,每一小段的大小为 。

A.KB B. 16KB C.B D. 16B

23.查看用户程序中数据段10号存储单元的DEBUG命令是 。

A.D DS:A A B.D DS:A C.D DS:10 10 D.D DS:10 24.在DEBUG下,修改寄存器AX的命令是 。

4

A. U AX B. R AX C.R D. A AX 25.从200H开始反汇编的DEBUG命令是 。 A.U 200 B. R200 C. D200 D.U

测验二答案:

1~5 CACCB 6~10 AACCA 11~15 BADBB 16~20 BDDAC 21~25 BDABA

第二章 参

习题二答案:

2.9 最少划分为16个逻辑段,最多划分为65536个逻辑段(每段16个字节) 2.10 CS:IP,DS:BX、SI、DI,ES:BX、SI、DI,SS:SP、BP

2.11 字节单元保存8位数,字单元保存16位数。根据源操作数的属性确定要访问的是字节单元还是字单元。

2.12 对于字节单元来说,偶地址和奇地址一样;对于字单元而言,最好用偶地址保存,可减少CPU的访存次数。

2.13 首单元的物理地址=38AE8H,末单元的物理地址=38AE8H+7FFFH=40AE7H 2.16 (1)物理地址=27679H (2) 物理地址=20F92H (3) 物理地址=20F92H

(2)和(3)的物理地址是一样的。说明逻辑地址不唯一,多个逻辑地址可对应到同一个物理单元上。

2.17 代码段CS:IP的物理地址=55A84H 堆栈段SS:SP的物理地址=4DB65H

数据段DS:BX的物理地址=17678H 附加段ES:DI的物理地址=2BA41H 2.18 当前栈指针所指单元的物理地址是1522CH。堆栈区中还能保存254个字。 2.19 执行E 200 2.20 执行U 100

2.21 执行R CX,然后输入100 2.22 执行E DS:0 ‘a’ ‘b’ ‘c’ ‘d’

测验二答案:

1~5 CACCB 6~10 AACCA 11~15 BADBB 16~20 BDDAC 21~25 BDABA

习题三

3.1 名词解释:零地址指令,一地址指令,二地址指令。 3.2 分别写出与数据有关的7种寻址方式并举例说明。

3.3 已知(BX)=1290H,(SI)=348AH,(DI)=2976H,(BP)=6756H,(DS)=2E92H,(ES)=4D82H,(SS)=2030H,请指出下列指令的寻址方式,并求出有效地址EA和物理地址: MOV AX,BX MOV AX,1290H MOV AX,[BX] MOV AX,DS:[1290H] MOV AX,[BP]

MOV [DI][BX],AX

MOV ES:[SI],AX

3.4 寄存器间接寻址方式可以使用哪些寄存器作为间址寄存器?

5

3.5 立即寻址方式和寄存器寻址方式的操作数有物理地址吗? 3.6 什么是段超越?段超越前缀代表什么? 3.7 请指出下列指令的错误:

MOV AX,[CX] MOV AL,1200H MOV AL,BX

MOV [SI][DI],AX MOV ES:[DX],CX MOV [AX],VALUE MOV COUNT,[SI]

3.8 根据题目要求,写出相应的汇编指令:

(1) 把BX寄存器的值传送给AX (2) 将立即数15送入CL寄存器

(3) 用BX寄存器间接寻址方式将存储单元中的字与AX寄存器的值相加,结果在 AX中 (4) 把AL中的字节写入用基址变址寻址的存储单元中

(5) 用SI寄存器和位移量VALUE的寄存器相对寻址方式,从存储单元中读出一个字送入寄

存器AX。

(6) 将AX中的数与偏移地址为2000H存储单元的数相减,结果在AX中

3.9 写出用下列寻址方式将存储单元X中的第3个字取出, AX与其相加再放入Y单元的指令序列。 (1)直接寻址 (2)寄存器相对寻址 (3)基址变址

3.10 在数据寻址方式中,哪种寻址方式的操作数与指令一起存放在代码段?

测验三

单选题:

1. 指令MOV AX,DS:[1000H],源操作数的寻址方式是 。

A.立即寻址 B. 直接寻址 C. 寄存器寻址 D. 基址变址寻址

2. 指令MOV AX,ES:COUNT[DI],源操作数的寻址方式是 。

A.基址变址寻址 B. 立即寻址 C. 寄存器相对寻址 D. 相对基址变址寻址

3. 指令MOV DX,COUNT[BP][DI]的执行结果是 。 A.将COUNT的值传送给DX

B. 将COUNT +BP+DI的值传送给DX

C. 将数据段中有效地址为COUNT +BP+DI的存储单元的值传送给DX D. 将堆栈段中有效地址为COUNT +BP+DI的存储单元的值传送给DX

4. 若(AX)=2530H,(BX)=18E6H,MOV [BX],AL指令正确的执行结果为 。 A.BX寄存器的值为2530H B. BL寄存器的值为30H

C. 18E6H单元的值为30H D. 18E6H单元的值为2530H

5. 若(DS)=1240H,(BX)=36H,则MOV AX,[BX] 源操作数的物理地址是 。

A.1AD36H B. 9B760H C.1AC36H D. 9B76H

6. 若(SS)=1383H,(DS)=2378H,(SI)=492AH,则ADD AX,[SI]源操作数的物理地址是= 。

A.1815AH B. 5CADH C. 6CA2H D. 281AAH

7. 若(SI)=1310H,(BX)=3213H,(DS)=3593H,则SUB DX,[BX][SI]的有效地址EA为 。

A.1310H B. 3213H C. 4523H D. 7AB6H

8. 指令MOV BX,MASK[BP],若MASK=3540H,(SS)=1200H,(DS)=1300H,(BP)=1160H,那么有效地址EA为 。

6

A.4740H B. 46A0H C. 4840H D. 2460H

9. 指令MOV AX,COUNT[BX]完成的操作是 。

A. 从存储单元读出一个字送入AX B. 从存储单元读出一个字节送入AX C. 将AX中的一个字写入存储单元 D. 将AX中的一个字节写入存储单元

10. 指令MOV DX,DELTA[BX][SI]的源操作数保存在 。

A.代码段 B. 堆栈段 C. 数据段 D. 附加段

11. 操作数地址由BX寄存器指出,则它的寻址方式是 。

A.直接寻址 B. 寄存器寻址 C. 立即寻址 D. 寄存器间接寻址

12. 指令“MOV ES:[BX],AX”中,目的操作数的寻址方式为 。

A.立即数寻址 B. 寄存器寻址 C.存储器直接寻址 D. 寄存器间接寻址

13. 一条指令中目的操作数不允许使用的寻址方式是 。 A.寄存器寻址 B. 立即数寻址 C.变址寻址 D. 寄存器间接寻址 14. 下列哪句话是错误的 。

A.指令的目的操作数和源操作数可以同时使用寄存器间接寻址 B. 指令的目的操作数和源操作数可以同时使用寄存器寻址 C. 指令的源操作数可以使用寄存器间接寻址 D. 指令的目的操作数可以使用寄存器寻址

15.用直接寻址将AL的内容保存到16号单元,可用 指令。

A.MOV DS:[0016H],AL B. MOV AL, DS:[0016H] C. MOV DS:[0010H],AL D. MOV AL, DS:[0010H]

第三章参

习题三答案:

3.3 MOV AX,BX 源操作数为寄存器寻址,EA 无,物理地址 无 MOV AX,1290H 立即寻址,EA 无,物理地址 无 MOV AX,[BX] 寄存器间接寻址,EA=1290H, 物理地址=2FBB0H MOV AX,DS:[1290H] 直接寻址,EA=1290H, 物理地址=2FBB0H MOV AX,[BP] 寄存器间接寻址,EA=6756H, 物理地址=26A56H

MOV [DI][BX],AX 目的操作数为基址变址寻址,EA=3C06H, 物理地址=32526H

MOV ES:[SI],AX 寄存器间接寻址,EA=348AH, 物理地址=50CAAH

3.7 MOV AX,[CX] 错。CX不能为间址寄存器

MOV AL,1200H 错。立即数超出8位寄存器范围 MOV AL,BX 错。两个操作数不匹配 MOV [SI][DI],AX 错。两个变址寄存器不能在一起 MOV ES:[DX],CX 错。DX不能为间址寄存器 MOV [AX],VALUE 错。AX不能为间址寄存器 MOV COUNT,[SI] 错。两个操作数不能都是存储单元

3.8 (1) MOV AX,BX (2) MOV CL,15 (3) ADD AX,[BX]

(4) MOV [BX+SI],AL (5) MOV AX,VALUE[SI] (6) SUB AX,DS:[2000H]

7

3.9 (1) ADD AX,[X+4] (2) MOV BX,4 (3) MOV BX,4 MOV Y,AX ADD AX,X[BX] MOV SI,OFFSET X MOV Y,AX ADD AX,[BX+SI] MOV Y,AX 3.10 立即寻址方式中操作数(立即数)和指令一起存放在代码段中。

测验三答案:

1~5 BCDCA 6~10 DCBAC 11~15 DDBAC

习题四

4.1 汇编语言程序有什么特点?什么是源程序? 4.2 简要说明从源程序到可执行程序的操作过程。

4.3 什么是伪指令?汇编指令与伪指令有何区别?写出4种常用的伪指令。 4.4 8086指令系统分为哪几类?举例说明算术运算类指令的用法。

4.5 在8086汇编语言中,哪些段寄存器可以用MOV指令赋值,哪些段寄存器不允许? 4.6 堆栈段寄存器SS和栈指针SP可以修改吗?如何修改?

4.7 入栈指令PUSH和出栈指令POP可以保存字节数据吗?要保存的话,如何实现? 4.8 有哪些方法可以获得操作数的有效地址? 4.9 解释下列伪指令的作用: (1) ASSUME CS:CODE,DS:DATA (2) END START (3) VALUE DW 12,35,-6 (4) STRING DB ‘INPUT:’ (5) MESS DB 5 DUP(?) (6) XX DD 12345678H (7) ORG 0320H (8) CONT EQU 2*3.14 4.10 根据题目,写出相关伪指令:

(1) 定义数据段DATA,并在数据段中定义两个字单元X、Y,初始值都是0 (2) 定义一个字符串SRING,保存’Computer’

(3) 定义有100个字节单元的COUNT数组,初始值均为空 (4) 用赋值伪指令定义PI为3.14

(5) 用类型操作符LABEL将VALUE单元定义为字节型

4.11 下列伪指令有错吗?如果有错,请指出错误原因: (1) X1 DB 35H,0,-80 (2) X2 DB 35,260,-1 (3) X3 DB 1234H (4) X4 DW 100 (5) X5 DW 100(?) (6) X6 DD ‘AB’ 4.12 写出下列指令的执行结果: TABLE DB 3,33,33 H

(1) MOV AL,TABLE

(2) MOV AX,WORD PTR TABLE (3) MOV DX,OFFSET TABLE (4) MOV CL,TABLE+2 (5) MOV BX,SEG TABLE (6) MOV BX,TYPE TABLE (7) LEA DX,TABLE

4.13 写出指令序列,分别求两个双精度数20125D68H和100349A6H的相加和相减运算。

4.14 写出将DX、AX中的32位无符号数减CX中的16位无符号数,结果存放在DX、AX中的指令序列。

8

4.15 写出将extra段的段地址传送给ES寄存器的指令序列。

4.16 根据给出的算式,写出指令序列(设X、Y、W为字节型,Z为字型):

(1) Z=5(X+16) (2) Z=X/4-Y

(3) Z=8X+Y/16-W^2

(4) Z= (X+Y)(X-Y) -X/Y

4.17 分析下列程序段执行情况,给出结果: X DB 5,15,30 Y DB 22,14,6 Z DW ? ……

MOV BX,OFFSET X MOV AL,[BX] ADD AL,Y INC BX

SUB AL,[BX] MOV BL,Y+1 IMUL BL MOV Z,AX

4.18 源程序在汇编过程中,系统是如何获知程序从哪儿开始执行的?

4.19 两个数8576H和9988H,分别作减法和加法运算,写出指令及运算结果。运算结果影响哪些标志?

4.20 乘法和除法指令对于字和字节操作是如何进行的? 4.21 用压缩BCD码实现下列运算:

(1) Y1=56+34 (2) Y2=128-35 (3) Y3=68+23-45

4.22 用非压缩BCD码实现下列运算:

(1) Z1=78+46 (2) Z2=95-27 (3) Z3=12×6-33 (4) Z4=(74+18)/6

4.23 编程序。从键盘输入一个数字,去掉ASCII码后保存到BUFF单元。 4.24 编程序。将键盘输入的小写字母变为大写字母显示在屏幕上。

4.25 X和Y都是字节型数据,编写将两数相加的结果显示出来的程序段。 4.26 编写程序,建立一个0~9的平方根表,查表可得某数的平方根。 4.27 编写查表程序。建立一个班级姓名表,给出学号,可显示出其姓名。 4.28 编程实现公式计算Z=X/4+16Y。

4.29 编写程序段,将AL中的数乘以6,与CL相减后再除以3;把商保存到Y单元,余数保存到Y+1单元。

4.30 用简化的程序格式编程序,在屏幕的5行12列上显示红底白字的字符串“Come”。

测验四

单选题:

1.经过汇编产生的二进制目标文件是 。

A..ASM B..OBJ C..EXE D..MAP

9

2.汇编语言源程序是指 。

A.系统提供的MASM B.用户编写的.ASM C.汇编生成的.LST D.连接生成的.EXE

3. 在汇编期间,为汇编程序提供分段信息的是 。

A.ASSUME伪指令 B.SEGMENT伪指令 C.标号START D.MOV指令

4. 不能用MOV指令赋初值的段寄存器是 。 A.DS B.ES C.CS D.SS

5. 在COUNT DB 5 这条存储单元定义伪指令中,COUNT称为 。

A.助记符 B.变量 C.符号 D.标号

6. 将10个字数据3456H存放在存储单元中的伪指令是 。

A.DW 10H DUP (3456H) B.DW 10 DUP (3456H) C.DW 10H DUP (5634H) D.DW 10 DUP (5634H)

7. 将字符串”INPUT”保存到存储单元MESS,正确的伪指令是 。

A.INPUT DB MESS B.MESS DB INPUT C.INPUT DB “MESS” D.MESS DB “INPUT” 8. 若X已经定义为字型,可以用 改变为字节型。

A.BYTE PTR X B.OFFSET X C.TYPE X D.LABEL X 9. INC WORD PTR [BX]指令中的操作数的数据类型是 。

A.字节 B.字 C.双字 D.四字 10.ABC DW 1, $+2, 5,7,其中$代表 。

A.当前的偏移地址值为0 B.当前的偏移地址值为1 C.当前的偏移地址值为2 D.当前的偏移地址值为3 11. 如果想让程序从100H开始存放及执行,用指令 。

A.START EQU 100H B.ORG 100H C.END START D.MOV START,100H

12. 可用来指出一条汇编指令所在存储单元的符号地址。

A.变量 B. 数组名 C.标号 D.偏移量 13.汇编语言中存储单元的属性不能是 。

A.字符CHAR型 B.字节BYTE型 C.字WORD型 D.双字DWORD型

14.用指令MOV BX,SEG COUNT指令,可以得到存储单元COUNT的 。

A.物理地址 B. 段地址 C. 偏移地址 D. 属性 15.下列传送指令中,有错误的是 。

A.MOV AH,BL B.MOV DS,AX C.MOV CL,DX D.MOV SI,90

16.若AX=1E30H,BX=12E4H则ADD AL,BL的执行结果为AL= ,CF= 。 A.14H ,0 B. 24H ,0 C. 14H ,1 D. 24H,1

17.若AX=1240H,CX=9939H,则ADD AX,CX 执行后,AH= 。

A.ABH B. 79H C.AB79H D. 79ABH

18.若BL=83H,CF=1,则ADC BL,90H执行后,BL= 。

A.14H B. 15H C. 16H D. 17H

19.若DX=1010H,BX=0923H则SUB DX,BX的执行结果为 。

A.168DH B. 06EDH C. F6DDH D. 0087H 20.从键盘输入一串字符使用DOS功能调用的 。

10

A.1号功能 B.2号功能 C.9号功能 D.10号功能

21.DOS功能调用中,功能号应写入 寄存器中。

A.AL B.AH C.DL D.DH

22.SP栈指针内容是1200H,执行两条PUSH指令之后,SP的值为 。 A.1202H B.1204H C.11FCH D.11FEH 23.换码指令XLAT要求给出存储单元的有效地址为 。

A.(BX)+(AL) B.(BX)+(AX) C.(BX) D.(AL) 24.显示一个字符的DOS功能调用要求将字符放入 。

A.DS:DX B.DS:BX C.BL D.DL

25.获得BUFFER单元有效地址的汇编指令为 。

A.MOV BX,BUFFER B.LEA BX,BUFFER C.MOV BX,[BUFFER] D.LDS BX,BUFFER

26. 下列哪个指令可以把字扩展为双字 。

A.CBW B.CWD C.CWB D.CDW 27. 关于字节乘法指令错误的说法是 。

A.被乘数隐含在AL中 B.乘数和被乘数都是字节型

C.被乘数隐含在AX中 D.乘积是字型 28.关于字除法错误的说法是 。

A.16位被除数AX与8位源操作数相除 B.32位被除数DX、AX与16位源操作数相除

C.商在AX寄存器,余数在DX寄存器中 D.带符号除法的商和余数都是补码表示的数 29.非压缩的BCD加法调整指令是 。

A.DAA B.DAS C.AAS D.AAA

30.用直接写显存的方法显示字符,把3行1列上的字符及属性输入到显存 单元。

A.140H+06H, 140H+07H B.1E0H+02H, 1E0H+03H C.140H+02H, 140H+03H D.1E0H+01H, 1E0H+02H

测验四答案:

1~5 BBACB 6~10 BDABC 11~15 BCABC

16~20 CAABD 21~25 BCADB 26~30 BCADB

第四章参

习题四答案:

4.10 (1) DATA SEGMENT X DW 0 Y DW 0 DATA ENDS (2) STRING DB ’Computer’ (3) COUNT DB 100 DUP(?) (4) PI EQU 3.14 (5) VALUE LABEL BYTE 4.11 (1)对。(2)错。260超出了字节范围。(3)错。X3是字节型,1234H是字型,不匹配。 (4)对。(5)错。缺少DUP。(6)对。 4.12 (1)AL=3。(2)AX=2103H。(3)DX=TABLE的偏移地址。(4)CL=33H

11

(5)BX=TABLE的段地址。(6)BX=1。(7)DX= TABLE的偏移地址。 4.13 MOV DX,2012H MOV AX,5D68H MOV CX,1003H MOV BX,49A6H ADD AX,BX (SUB AX,BX) ADC DX,CX (SBB DX,CX) 4.14 SUB AX,CX

SBB DX,0

4.15 MOV AX,extra

MOV ES,AX

4.16 (1) MOV AL,16 ADD AL,X MOV BL,5 IMUL BL MOV Z,AX

(2) MOV BL,4

MOV AL,X IDIV BL SUB AL,Y MOV Z,AX (3) MOV AL,X

MOV BL,8 IMUL BL MOV DX,AX MOV AH,0 MOV AL,Y MOV BL,16 IDIV BL CBW

ADD DX,AX MOV AH,0 MOV AL,W IMUL AL SUB DX,AX MOV Z,DX (4) MOV AL,X

ADD AL,Y MOV BL,X SUB BL,Y MOV AH,0 IMUL BL MOV Z,AX MOV AL,X IDIV Y CBW

SUB Z,AX

12

4.17 Z= (5+22-15)*14= 168

4.18 从伪指令END START处获知程序从START标号开始。 4.19 (1)减法: (2) 加法:

MOV AX,8576H MOV AX,8576H MOV BX,9988H MOV BX,9988H SUB AX,BX ADD AX,BX 结果:AX=EBEEH 结果:AX=1EFEH CF=1,OF=0,ZF=0,SF=1 CF=1,OF=1,ZF=0,SF=0 4.21 (1) MOV AL,56H MOV BL,34H ADD AL,BL DAA MOV Y1,AL (2) MOV AX,128H

MOV BX,35H SUB AX,BX DAS

MOV Y2,AL

(3) MOV AL,68H

MOV BL,23H ADD AL,BL MOV BL,45H SUB AL,BL DAS

MOV Y3,AL

4.22 (1) MOV AX,0708H

MOV BX,0406H ADD AL,BL ADD AH,BH AAA MOV BX,AX XCHG AH,AL AAA

MOV BH,AL MOV Z1,BX (2) MOV AX,0905H

MOV BX,0207H SUB AL,BL SUB AH,BH AAS MOV Z2,AX (3) MOV AX,0102H

MOV BX,0006H MUL BX MOV BX,0303H SUB AX,BX AAS

;不用带进位加 ;加法调整,含进位调整 ;高4位调整 ;保存十位、各位,百位在CF中 ;不用带借位减 ;减法调整 ;乘法先不用调整 ;减法调整

13

MOV Z3,AX

(4) MOV AX,0704H

MOV BX,0108H ADD AL,BL ADD AH,BH AAA ;加法调整 MOV BL,6 AAD ;除法调整 DIV BL

MOV BH,AH ;余数保存在BH AND AX,000FH AAA ;商调整 MOV Z4,AX ;保存商

4.23 编程序。从键盘输入一个数字,去掉ASCII码后保存到BUFF单元。.model small .data

buff db ? .code start:

mov ax,@data mov ds,ax mov ah,1 ;键盘输入 int 21h sub al,30h ;去掉ASCII码 mov buff,al mov ah,4ch int 21h end start

4.24 编程序。将键盘输入的小写字母变为大写字母显示在屏幕上。 .model small .code start:

mov ah,1 ;键盘输入 int 21h

sub al,20h ;变为大写 mov dl,al mov ah,2 int 21h mov ah,4ch int 21h end start

4.25 X和Y都是字节型数据,编写将两数相加的结果显示出来的程序段。

.model small .data

x db 12h y db 34h .code

14

start:

mov ax,@data mov ds,ax mov al,x add al,y ;结果为46H mov ah,al ;AH=46H and al,0fh ;AL=06H mov cl,4 rol ah,cl ;AH=H and ah,0fh ;AH=04H add ax,3030h ;AX=3436H mov bx,ax mov dl,bh ;显示4 mov ah,2 int 21h mov dl,bl ;显示6 int 21h mov ah,4ch int 21h end start

4.26 编写程序,建立一个0~9的平方根表,查表可得某数的平方根。data segment

x db '0.000','1.000','1.414','1.732','2.000'

db '2.236','2.449','2.6','2.828','3.000' ;建立字符表 y db 5 dup(?) ;存放查到平方根 u db 3 ;要查的数 data ends code segment

assume cs:code,ds:data start:

mov ax,data mov ds,ax mov al,u ;要查的数 mov cl,5 mul cl ;u*5=15(号单元开始) mov ah,0 mov bx,ax ;地址保存到bx mov si,0 let1:

mov al,x[bx] ;取出平方根数字 mov y[si],al ;存入y inc si inc bx loop let1 ;循环取出5次 mov ah,4ch int 21h code ends

15

end start

4.27 编写查表程序。建立一个班级姓名表,给出学号,可显示出其姓名。

.model small .data

x1 db 'zhang yan $' ;姓名为10个字符宽度 x2 db 'li li $' x3 db 'wang lan $' x4 db 'zhao xue $' x5 db 'li jiang $' u db 3 ;要查的学号 .code start:

mov ax,@data mov ds,ax mov al,u ;给出学号 mov cl,10 mul cl ;u*10=30(号单元开始) mov ah,0 mov dx,ax ;地址保存到dx mov ah,9 ;9号功能显示字符串 int 21h mov ah,4ch int 21h end start

4.28 编程实现公式计算Z=X/4+16Y。

.model small .data

x db 4 y db 6 z db ? .code start:

mov ax,@data mov ds,ax mov al,x ; mov cl,2 sar al,cl ; X/4 mov cl,4 mov bl,y sal bl,cl ;16Y

add al,bl ;X/4+16Y mov z,al mov ah,4ch int 21h end start

4.29 编写程序段,将AL中的数乘以6,与CL相减后再除以3;把商保存到Y单元,余数保存到Y+1单元。

16

.model small .data y db ?,? .code start:

mov ax,@data mov ds,ax mov al,3 ;设al=3 mov cl,6 mul cl ;al*6 mov cl,4 ;设cl=4 sub al,cl ;相减 mov bl,3

idiv bl ; /3 mov y,al ;商 mov y+1,ah ;余数 mov ah,4ch int 21h end start

测验四答案:

1~5 BBACB 6~10 BDABC 11~15 BCABC

16~20 CAABD 21~25 BCADB 26~30 BCADB

习题五

5.1 转移指令分为哪两大类?转移指令的操作码和操作数如何表示? 5.2 写出与转移地址有关的寻址方式。

5.3 根据标志位转移的指令有哪些?执行什么操作时可以改变标志? 5.4 简述CPU实现分支的过程。

5.5 在短转移格式下,指令跳转的范围是多少?

5.6 在比较转移指令之前可以用什么指令进行判断?

5.7 比较转移指令为什么要分为无符号数比较和带符号数比较两类? 5.8 汇编语言可以控制和改变二进制某一位。有哪些指令可做位操作? 5.9 TEST指令是如何实现判断的?请举例说明。 5.10 移位指令影响标志位吗?影响哪些标志位?

5.11 已知(BX)=70H,写出指令实现逻辑左移2位。请问哪个标志位改变了?5.12 分析下列程序段,给出执行结果: MOV AX,1234H

MOV CL,3

SAR AX,CL AND AX,0FH ADD AL,30H MOV DL,AL MOV AH,2 INT 21H

17

5.13 试说明下列程序段完成了什么操作? MOV AX,X MOV BX,Y CMP AX,0 JGE AA1 NEG AX JMP AA2 AA1: SUB AX,BX AA2: MOV Z,AX

5.14 指出下列指令的错误所在。

(1) AND [SI],3 (2) SUB DS,AX (3) PUSH 5 (4) OR 80H,AL

(5) CMP [BX],TABLE (6) ROL AL,3

5.15 写出将AL.4清零的指令。(AL中除第4位外的其他位保持不变)。 5.16 分别指出每条指令执行结果: MOV AL,37H (1) AND AL,0F0H (2) OR AL,03H (3) NOT AL

(4) XOR AL,0FH

5.17 简述操作系统对可执行程序的加载和执行过程。

5.18 PSP程序段前缀是什么时候建立的?占用多大内存空间?保存了什么内容、作用是什么? 5.19 转移指令中的标号在汇编时被翻译成什么值?这种方法的优点是什么? 5.20 无条件转移指令JMP $+2作用是什么?其转移地址是多少? 5.21 什么是分支表?怎样用分支表实现多路分支? 5.22 哪些逻辑指令可以使操作数清零?请写出指令。 5.23 用逻辑指令实现将AX的低4位清0。

5.24 用移位指令实现AX的高8位和低8位交换。 5.25 写出判断一个操作数是否为负数的程序段。

5.26 写出程序段。判断字节单元X中的数是否为偶数,是偶数则显示’Y’,否则显示’N’。 5.27 分支程序设计。完成如下公式的计算,请写出程序。

(X+3)/2 X>0 Y= 0 X=0

X×4 X<0

5.28 设X、Y、Z为字节单元。如果X≥0,Z=4X-Y/16,否则,Z=X的绝对值。编程序实现。 5.29 字数组M中有10个数据,分类统计其中正数、负数、0的个数,分别存入POSI、NEGA、ZERO 单元。

5.30 试编写程序,从键盘接收一英文单词,以空格结束,将其存入BUF开始的存储单元中,并在最后加上字符串结束符’$’。

5.31编程。将AX寄存器中的16位数分成4组,每组4位,从低到高分别放在AL,BL,CL,DL中。

18

测验五

单选题:

1.在分支指令中,利用符号进行判断的指令是_______。

A.JC B.JS C.JZ D.JO

2.当一个带符号数大于FFH时程序转移,满足条件的是_______。

A.正数和零 B.负数 C.负数和零 D.大于255的数 3.在执行条件转移指令前,不能形成条件的指令有________。

A.CMP B.SUB C.AND D.MOV

4. 无条件转移指令中,段内直接近转移到标号LET1的指令是________。

A.JMP SHORT LET1 B.JMP LET1 C.JMP BX D.JMP WORD PTR LET1 5.条件转移指令的转移范围是________字节。

A.-32768到+32767 B.0到255 C.-128到127 D.0到65535

6.要实现段间转移,下列说法正确的是________。

A.标号的属性为NEAR型的 B.标号的偏移地址送入CS

C.既要改变IP又要改变CS D.转移地址不能用存储单元给出 7.在条件转移指令中,结果不为0则转移的指令是________。

A.JNS B.JZ C.JS D.JNZ

8.两个带符号数比较,不大于则转移的指令是________。

A.JLE B.JBE C.JL D.JAE 9.设A=9210H,B=4582H,如果A>B,做相减运算,否则做相加。执行JG指令后,结果是________。

A.做相减运算 B.做相加运算 C.先做相减再做相加 D.什么都不做

10.在条件判断时,采用操作数相与运算的判断指令是________。

A.TEST B.CMP C.AND D.JCXZ

11.8086的转移指令根据转移的范围分为段内转移及段间转移,下列 是错误的。

A.无条件指令既可以段内转移,也可以段间转移 B.无条件转移指令既可以直接转移,也可以间接转移 C.条件转移指令既可以段内转移,也可以段间转移 D.条件转移指令是段内的直接短转移

12.带符号数乘以2操作用 移位指令实现。

A.SAL AL,1 B.SAL AL,2 C.SHR AL,1 D.ROL AL,2

13.将AL的2、6位屏蔽为0,其余位保持不变,指令为 。

A.AND AL,42H B.AND AL,0BBH C.OR AL,26H D.ADD AL,0FBH 14.将AL的第4位置1,其余位不变,指令为 。

A.OR AL,40H B.AND AL,40H C.OR AL,10H D.AND AL,1FH 15.将AL清0的指令为 。

A.AND AL,AL B.OR AL,0 C.XOR AL,AL D.XOR AL,0

16.对键盘输入的数字和字母进行判断,用指令 。

A.TEST AL,40H B.TEST AL,20H C.CMP AL,40H D.CMP AL,20H

19

17.将键盘输入的小写字母变为大写,用指令 。

A.AND AL,20H B.AND AL,0DFH C.OR AL,20H D.OR AL,0DFH 18.在操作系统下执行用户程序,属于 。

A.段内直接转移 B.段间直接转移 C.段内间接转移 D.段间间接转移

19.如无特殊指定,操作系统将用户程序调入内存时,代码段中第一条机器指令的 。

A.段地址为0 B.段地址由DS指出 C.偏移地址为0 D.偏移地址由SP指出 20.用户程序中的数据段的段地址,用 指令给出。

A.MOV AX,CODE B.MOV CS,CODE

MOV CS,AX MOV DS,CS C.MOV CS,DATA D.MOV AX,DATA

MOV DS,CS MOV DS,AX

测验五答案:

1~5 BADBC 6~10 CDABA 11~15 CABCC 16~20 ABBCD

第五章参

习题五答案:

5.11 进位标志CF=1

5.12 先把AX的值除以8等于0246H,再把高12位屏蔽为0,剩下AL=06H加上30H变为ASCII码显示出来。

5.13 判断X>0,是,Z=X-Y;否则Z=X的绝对值

5.14 (1) 目的操作数是存储单元时,要用PTR伪操作指出单元的属性。

(2)DS段寄存器使用非法 (3)立即数使用非法。

(4)目的操作数不允许是立即数 (5) 两个操作数不允许都是存储单元

(6)移位次数超过1要用CL表示。 5.15 AND AL,11011111B 5.16 (1) AL=30H (2) AL=B7H (3) AL=C8H (4)AL=38H 5.27分支程序设计。完成如下公式的计算,请写出程序。

(X+3)/2 X>0 Y= 0 X=0

X×4 X<0

程序:

DATA SEGMENT X DB 23 Y DB ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA

20

MOV DS,AX MOV AL,X CMP AL,0 JE SUB2 JG SUB1 MOV CL,2

SAL AL,CL

JMP SHORT SUB2 SUB1:ADD AL,3 SAR AL,1 SUB2: MOV Y,AL

MOV AH,4CH

INT 21H CODE ENDS END START

5.28 设X、Y、Z为字节单元。如果X≥0,Z=4X-Y/16,否则,Z=X的绝对值。编程序实现。 程序如下:

DATA SEGMENT X DB 3 Y DB 5 Z DB ? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 JL SS1 MOV CL,2 SAL AL,CL MOV BL,Y MOV CL,4 SAR BL,CL SUB AL,BL

JMP OUT1

SS1: NEG AL OUT1: MOV Z,AL MOV AH,4CH INT 21H CODE ENDS

END START

5.29 字数组M中有10个数据,分类统计其中正数、负数、0的个数,分别存入POSI、NEGA、ZERO 单元。 程序如下:

DATA1 SEGMENT

M DW 21,-34,32,112,-324,0,76,0,48,50

21

POSI DW ? NEGA DW ? ZERO DW ? DATA1 ENDS

CODE1 SEGMENT ASSUME CS: CODE1,DS:DATA1 START: MOV AX,DATA1 MOV DS,AX MOV CX,10 LEA SI,M

AGAIN: CMP WORD PTR [SI],0 JL LOWER JE EQUAL INC POSI JMP LPP1 LOWER: INC NEGA JMP LPP1 EQUAL: INC ZERO LPP1: ADD SI,2 DEC CX JNZ AGAIN MOV AH,4CH INT 21H CODE1 ENDS END START

5.30 试编写程序,从键盘接收一英文单词,以空格结束,将其存入BUF开始的存储单元中,并在最后加上字符串结束符’$’。 主要程序部分:

LEA BX,BUF LOP: MOV AH,1 INT 21H CMP AL,20H JE NEXT MOV [BX],AL INC BX JMP LOP

NEXT: MOV BYTE PTR[BX],’$’

5.31 编程。将AX寄存器中的16位数分成4组,每组4位,从低到高分别放在AL,BL,CL,DL中。 程序段:

START:MOV AX,1234H MOV BX,AX AND AL,0FH ;4 AND BL,0F0H ;3 AND AH,0FH MOV CL,AH ;2 AND BH,0F0H

22

MOV DL,BH ;1

习题六

6.1 循环指令有哪几种?分别写出指令格式及作用。 6.2 循环指令根据什么判断循环是否结束? 6.3 用转移指令能否构成循环?试举例说明。 6.4 多重循环的循环控制如何实现?

6.5 在多重循环中转移指令的使用要注意哪些问题? 6.6 串处理过程中用到循环了吗?怎么使用的? 6.7 列出学过的串处理指令。

6.8 在串处理过程中,如何找到源串和目的串?

6.9 串处理指令都应和哪些重复前缀配合使用?请举例说明。

6.10 在串处理中,方向标志DF的作用是什么?方向标志如何设置?6.11 写出下列程序段的执行结果。 BUFF DB 10,22,14,6,31 TOTAL DB ? …… MOV BX,OFFSET BUFF MOV CX,TOTAL-BUFF MOV AL,0 AA1: ADD AL,[BX] INC BX LOOP AA1 MOV TOTAL,AL

6.12 分析下列程序段的功能。 X DB 2,-3,15,0,9,4 …… LEA BX,X MOV CX,6 MOV AX,0 AA2:MOV AL,[BX] CMP AL,0 JNE NEXT INC AH

NEXT:INC BX

LOOP AA2

6.13 判断下列程序段能否完成给定功能。如有错误,请指出并改正。 (1)统计AL中1的个数。要求AL保持原值。 MOV BL,0

MOV CX,8

BB1:RCL AL,1 JNC NEXT INC BL

23

NEXT:LOOP BB1

(2)在ALPHA中查找字母”T”,找到后退出循环。 ALPHA DB “ERTYU”

……

MOV BX,OFFSET ALPHA MOV CX,5

BB2:CMP [BX],’T’ LOOPNE BB2

6.14 源串STRG1和目的串STRG2分别放在数据段和附加段中,请写出含有各种段定义的程序段,完成将STRG1传送到STRG2的功能。

6.15 写出计算Y=1×2+3×4+5×6+7×8+9×10的程序段。

6.16 写程序段。查找CATT表中的字符”@”,找到后将SIGN单元置1,否则SIGN单元置0。 6.17 写程序段。在长度为N的字数组VALUE中统计负数的个数并保存到AX中。 6.18 编程。从键盘输入一个数字,在屏幕上显示出以该数字开始的10个数字串。

6.19 编程。比较两个字符串是否相同,统计并显示出相同的字符个数和不同的字符个数。 6.20 编程。在FOUND字数组中找出最小数存入MIN单元。

6.21 STRI单元存有10个字符的字符串,以0结尾,编程去掉其中的空格符,并将后续字符向前递补。

6.22 某班级30名学生,编程序将全班成绩按升序排序。

6.23 将内存中用ASCII码表示的100以内的十进制数转变为二进制数。十进制数不够3位以20H(空格)补齐。

第六章参

习题六答案:

6.11 累加和TOTAL=83

6.12 循环统计X中0的个数

6.13 (1) 将BB1:RCL AL,1改为BB1:ROL AL,1

(2) 将BB2:CMP [BX],’T’ LOOPNE BB2 改为: DEC BX BB2:INC BX

CMP [BX],’T’

LOOPNE BB2

6.15 计算Y=1×2+3×4+5×6+7×8+9×10的程序段答案: MOV AL,1 MOV BL,2 MOV DX,0 MOV CX,5 AA1:MUL BL ADD DX,AX INC BL MOV AL,BL INC BL

24

LOOP AA1

6.16 写程序段。查找CATT表中的字符”@”,找到后将SIGN单元置1,否则SIGN单元置0。 catt db 'asd@ddd' sign db ? ……

mov ax,extra mov es,ax mov sign,0 mov al,'@' lea di,catt cld

mov cx,7 repnz scasb jcxz nee mov sign,1 nee: mov ah,4ch int 21h

6.17 写程序段。在长度为N的字数组VALUE中统计负数的个数并保存到AX中。

value dw 2,-4,-5,3,6,6,-8 n equ ($-value)/2 ;元素个数

……

start: mov ax,data mov ds,ax mov cx,n mov bx,0 mov ax,0 rept1:

mov si,value[bx] ;取出元素 cmp si,0 jge let1 ;≥0 转let1 inc ax ;为负数,ax加1 let1: add bx,2 loop rept1

6.18 从键盘输入一个数字,在屏幕上显示出以该数字开始10个数字串。

CODE SEGMENT ASSUME CS:CODE

START: MOV AH,1

INT 21H MOV CX,10 MOV BL,AL

REPT1: CMP BL,'9'

JLE NEXT SUB BL,10

NEXT: MOV DL,BL

25

MOV AH,2 INT 21H INC BL

LOOP REPT1 MOV AH,4CH INT 21H

CODE ENDS END START

编程。比较两个字符串是否相同,统计并显示出相同的字符个数和不同的字符个数。

data segment

bunch1 db 'stadent' bunch2 db 'studEnt' data ends code segment

assume cs:code,ds:data,es:data start:

mov ax,data mov ds,ax mov es,ax lea si,bunch1 lea di,bunch2 mov bx,0 ;bh=相同的个数,bl=不同的个数 mov cx,7 let1:

mov al,[si] cmp al,[di] ;两字符比较 jz equl ;相同转equl inc bl ;不同bl加1 jmp out1 equl: inc bh out1:inc si inc di loop let1 mov dl,'n' ;显示'n',代表不同 mov ah,2h int 21h

add bl,30h ;加上ASCII码 mov dl,bl ;显示不同的个数 int 21h

mov dl,'e' ;显示'e',代表相同 int 21h add bh,30h mov dl,bh ;显示相同的个数 int 21h mov ah,4ch int 21h code ends

26

6.19

end start

6.21 STRI单元存有10个字符的字符串,以0结尾,编程去掉其中的空格符,并将后续字符向前递补。 DATA SEGMENT STR DB ‘SDABF G H0’ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA MOV DS,AX LEA DI,STR

SPACE:MOV CX,10 MOV AL,[DI] CMP AL,0 JE OUT CMP AL,20H JE DELETE JMP EXIT

SUB CX,DI MOV SI,DI

DELETE:

MOV BL,[SI+1]

MOV [SI],BL INC SI LOOP DELETE EXIT:JMP SPACE OUT:MOV AH,4CH INT 21H CODE ENDS END START

6.23 将内存中用ASCII码表示的100以内的十进制数转变为二进制数。十进制数不够3位以20H(空格)补齐。

设计思路:

(1) 用EQU伪指令获得需转换的十进制数的个数;

(2) 用双重循环。外循环控制个数,用x作为中间变量;

(3) 内循环将一个3位十进制数去掉ASCII码后按位数扩大10倍再相加,保存后即存储为

二进制数;

(4) 分两个数组保存ASCII码表示的十进制数和转换后的二进制数。 程序如下:

; 6-23.asm 将内存中用ASCII码表示的100以内的十进制数转变为二进制数 data segment

score1 db 36h,37h,20h,31h,30h,30h,38h,35h,20h,31h,30h,30h

;即67,100,85,

27

100 x dw ? n equ 3

num equ (x-score1)/n score2 dw num dup(0)

data ends code segment

assume cs:code,ds:data start: mov ax,data mov ds,ax mov cx,num mov si,-2

mov bx,0

rept1: push cx

mov cx,n

rept2: mov al,score1[bx] cmp al,30h

jl exit cmp al,39h jg exit and ax,000fh xchg ax,x

mov dx,10

mul dx

;三位数 ;十进制数个数 ;保存转换后的二进制数

;保存外循环次数

;从score1取数 ;判断是否0-9

;去掉ASCII码

;将ax中前一次形成的数扩大10倍

28

xchg ax,x add x,ax

;相加后保存到x ;取下一位数

exit: inc bx

loop rept2 pop cx add si,2 mov ax,x mov score2[si],ax mov x,0 loop rept1 mov ah,4ch int 21h

;转换后的数据保存到score2

;弹出外循环次数

code ends

end start

运行结果:

可以看到,67转换为0043,100转换为00,85转换为0055。在DEBUG下显示的内存单元是十六进制表示,实际存储的是二进制数。

测验六

单选题:

1.下列描述错误的是 。

A.LOOP指令以CX为循环控制计数器

B.LOOPE指令循环的条件是CX≠0且ZF=0 C.LOOPE指令循环的条件是CX≠0且ZF=1 D.LOOPNE指令循环的条件是CX≠0且ZF=0

2.串处理操作需要循环重复执行,________不能出现在串处理指令中。

A.REP B.REPZ C.REPNZ D.LOOP

3. 对于LOOP LET1循环指令,构成循环的范围是________。

A.在-128字节之内 B.在+127字节之内

29

C.在-128~+127字节之间 D.在-256~+255字节之间 4.在串传送指令中,串的转送方向由________标志位决定。

A.DF B.CF C.ZF D.OF

5.串传送指令中,源串和目的串的偏移地址由________寄存器指出。 A.BX和DX B.DS和DX C.SI和DI D.SI和CX 6.串扫描SCAS指令要求目的串放在________中。

A.数据段 B.代码段 C.堆栈段 D.附加段 7.串扫描SCASW指令隐含地将______寄存器作为查找的内容。 A.AX B.BX C.CX D.AL 8.循环指令LOOP可以实现________的循环。

A.循环次数已知 B.循环次数未知 C.循环次数累加 D.循环次数不变

9. LOOPNE指令的循环计数值放在________寄存器中。

A.CL B.BX C.CX D.IP

10.在多重循环程序中,从外循环再次进入内循环时,内循环的计数值________。

A.不必考虑 B.重新赋值 C.置0 D.置1

11.循环指令的控制条件除CX寄存器之外,还可把标志位________作为控制条件。A.CF B.SF C.ZF D.OF 12.循环指令LOOPNZ终止循环的条件是________。

A.CX=0且ZF=0 B.CX=0或ZF=1 C.CX≠0且ZF=0 D.CX≠0或ZF=0 13.下列指令不能构成循环的是_______。 A.JMP B.JNZ C.LOOP D.DEC CX

14.串传送指令MOVSW,执行CLD指令后,每传送一次,串的_______。 A.偏移地址+1 B.偏移地址+2 C.偏移地址-1 D.偏移地址-2 15.在串处理指令中,设置方向标志为1的指令是_______。 A.STD B.CLD C.HLT D.CWD

测验六答案:

1~5 BDAAC 6~10 DAACB 11~15 CBDBA

习题七

7.1 在汇编语言中,主程序是如何调用子程序的?

7.2 怎样才能正确地从子程序返回到主程序,先决条件是什么? 7.3 子程序名代表什么含义?子程序名是断点吗?为什么?

7.4 什么叫做跨段调用?从子程序调用指令CALL中能得知是跨段调用吗? 7.5 CALL指令如何将断点入栈保存的?

7.6 RET指令在何处使用?RET指令执行了哪些操作? 7.7 CALL指令为什么必须和RET指令成对使用? 7.8 为什么要用过程定义伪指令PROC来定义子程序? 7.9 子程序的属性是如何确定的?

7.10 为什么要进行现场保护?怎样做现场保护?

7.11 有哪几种常用的子程序参数传递方法?分别写出各自的特点。 7.12 阅读下列子程序,解释该程序的功能。

30

SUBR1 PROC NEAR PUSH AX PUSH BX MOV AL,X ADD AL,BL MOV Y,AL POP BX POP AX RET SUBR1 ENDP

7.13 解释下列子程序的功能。 SUBR2 PROC NEAR MOV SI,0 LET1: MOV AH,1

INT 21H

CMP AL,0DH JZ OUT1

MOV KEY[SI],AL INC SI JMP LET1

OUT1: RET SUBR2 ENDP

7.14 给出下列子程序的功能和执行结果。 X DB 3AH

……

SUBR3 PROC NEAR

MOV AL,X MOV BL,10 MOV DX,0 LETE : MOV AH,0

DIV BL

MOV DL,AH

PUSH DX CMP AL,0 JNZ LETE RET SUBR3 ENDP

7.15 写出子程序,从键盘输入一位十进制数,并保存到BUFFER单元中。

7.16 写出子程序,从键盘输入一个多位十进制数,并分别保存到BUFFER开始的单元中。7.17 从键盘输入多位数字,转换成十进制数并保存到X单元中。 7.18 写出求数组元素累加和的子程序。

7.19 写出子程序。查十进制数的ASCII码表,对AL中的BCD码显示出十进制数。 7.20 编写将X单元中的二进制数显示为十六进制数的子程序。 7.21 编写将BX中的二进制数用十进制数显示出来的子程序。 7.22 编写将BX中的二进制数用二进制数显示出来的子程序。

7.23 写出对内存单元X中的补码求真值子程序,补码保存在BX中。 7.24 写出两数相加运算的子程序。

31

7.25 写出两数相减运算的子程序。 7.26 写出两数相乘运算的子程序。 7.27 写出两数相除运算的子程序。

7.28 写出对AX中的二进制数按位相加子程序。 7.29 编写求数组中最大数的子程序。

7.30 编制一个计算数组中所有负数之和的子程序。并利用此子程序分别计算A数组和B数组中的负数之和,结果分别放在SUM1和SUM2单元中。

第七章参

习题七答案:

7.12 功能:两个字节数相加。X和BL相加保存到Y。

7.13 功能:键盘输入的字符保存到KEY单元中,直到按回车为止。

7.14 功能:将X单元中的十六进制3AH变为十进制入栈保存,AH中为余数。先将0008H入栈,再将0005H入栈,结果为58。

7.16 写出子程序,从键盘输入一个多位十进制数,并分别保存到BUFFER开始的单元中。 KEY_IN PROC PUSH AX PUSH BX MOV BX,0

LET1:MOV AH,1

INT 21H CMP AL,0DH ;输入回车退出 JZ EXIT MOV BUFFER[BX],AL ;保存到BUFFER INC BX JMP LET1 EXIT:POP BX POP AX

RET

KEY_IN ENDP

7.17 从键盘输入多位数字,转换成十进制数并保存到X单元中。 KEY_IN_DEC PROC PUSH AX PUSH BX MOV X,0 MOV BX,0 MOV SI,0

LET1:MOV AH,1

INT 21H CMP AL,0DH ;输入回车退出 JZ EXIT MOV BUFFER[SI],AL ;保存到BUFFER INC SI JMP LET1 EXIT:MOV CX,SI ;位数放在CX MOV SI,0

32

LET2:MOV AL, BUFFER[SI] SUB AL,30H MOV AH, 0 XCHG AX,X ;形成十进制数 MOV BX,10 MUL BX XCHG AX,X ADD X,AX ;保存 INC SI LOOP LET2

POP BX

POP AX

RET

KEY_IN _DEC ENDP

7.23 写出对内存单元X中的补码求真值子程序,补码保存在AX中。 calcu proc push ax push bx

push si mov ax,0 mov al,x and al,al jns zz neg al

mov fuhao,'-' zz:

mov si,0

mov bx,10 ;将ax变为十进制数真值 let1: mov dx,0 inc si ;统计余数个数 idiv bx

mov y[si], dx ;在y单元保存余数 cmp ax,0 jnz let1

pop si pop bx pop ax ret calcu endp

7.30 编制一个计算数组中所有负数之和的子程序。并利用此子程序分别计算A数组和B数组中的负数之和,结果分别放在SUM1和SUM2单元中。 DATA SEGMENT A DB 9,-8,-7,6,5 B DB -8,7,6,-5,4 SUM1 DB ?

33

SUM2 DB ? DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,5 MOV SI,OFFSET A CALL LADD MOV SUM1,BL MOV SI,OFFSET B CALL LADD MOV SUM2,BL MOV AH,4CH INT 21H

LADD PROC NEAR PUSH CX PUSH AX PUSH SI XOR BL,BL NEXT: MOV AL, [SI] AND AL,AL JNS JJJ ADD BL,AL JJJ: INC SI LOOP NEXT POP SI

POP AX

POP CX RET LADD ENDP CODE ENDS END START

测验七

单选题:

1. 如果子程序的属性为FAR,下列说法错误的是 。

A.可以段内直接调用 B.可以段间间接调用 C.可以段间直接调用 D.只能段间调用 2.在子程序调用过程中,断点指的是 。

A.CALL指令本身 B.CALL的下一条指令 C.CALL的下一条指令的地址 D.子程序名 3.执行CALL SUBR1指令后,完成的操作是 。

A.将SUBR1的偏移地址入栈保存 B.将断点的偏移地址入栈保存 C.将断点的偏移地址→IP

34

D.将SUBR1的段地址→CS,偏移地址→IP 4.子程序的属性是用__________定义的。

A.CALL指令 B.PROC过程定义伪指令 C.FAR PTR D.RET指令

5.执行段间返回RET指令时,从堆栈中________。

A.先弹出断点的偏移地址,再弹出段地址 B.先弹出断点的段地址,再弹出偏移地址 C.弹出断点的偏移地址 D.弹出断点的段地址

6.子程序结构中,保存现场指的是________。

A.保存CALL指令 B.保存断点的地址

C.保存主程序用到的寄存器 D.保存子程序用到的寄存器 7.CALL指令和RET指令的用法,正确的说法是________。

A.CALL指令和RET指令都对堆栈操作 B.只有CALL指令使用堆栈 C.只有RET指令使用堆栈

D.CALL指令和RET指令都不用堆栈 8.CALL指令和JMP指令的区别是________。

A.CALL指令使程序转移 B.子程序名可以是标号

C.CALL指令将断点地址保存 D.CALL指令可以段间调用

9.CALL指令和RET指令对堆栈操作,正确的说法为__________。

A.CALL指令从堆栈中取出子程序的地址 B.RET指令从堆栈中取出子程序的地址 C.CALL指令从堆栈中取出断点的地址 D.RET指令从堆栈中取出断点的地址

10.执行CALL FAR PTR SUBR2时,正确的说法是 。

A.先将断点的段地址入栈,再将偏移地址入栈 B.先将断点的偏移地址入栈,再将段地址入栈

C.先将SUBR2的段地址入栈,再将偏移地址入栈 D.先将SUBR2的偏移地址入栈,再将段地址入栈

11.用CALL指令调用子程序时,从子程序返回到主程序________。

A.用JMP指令 B.用INT 21H指令 C.只能用RET指令

D.既可以用RET又可以用JMP

12.在用CALL指令实现子程序嵌套调用时,子程序的RET指令 ________。A.返回到最初始的调用程序中 B.返回到上一级调用程序中 C.可以换为JMP指令返回 D.可以不用

13.子程序参数传递时,用存储单元传参方法,________。

A.只能主程序访问传参单元 B.只能子程序访问传参单元

C.主程序和子程序都能访问传参单元

D.主程序读传参单元,子程序写传参单元

35

14.用寄存器传参,在子程序作现场保护时,________。

A.传参寄存器必须保存 B.传参寄存器不必保存 C.传参寄存器可以改写 D.根据情况确定保存与否

15.如果在子程序中进行了现场保护,那么子程序中________。

A.恢复现场在RET指令之前 B.恢复现场在RET指令之后 C.直接用RET指令返回 D.直接用JMP指令返回

测验七答案:

1~5 DCBBA 6~10 CACDA 11~15 CBCDA

第八章 高级汇编技术

习题八

8.1 宏的作用是什么?宏是一种程序结构吗? 8.2 分别解释宏定义、宏调用、宏展开。 8.3 宏与子程序的区别是什么?

8.4 宏指令是什么?它能被翻译成机器代码吗?

8.5 写出宏调用的过程和子程序调用的过程,并对二者做一对比。 8.6 宏是怎样实现传参的?请与子程序传参进行对比。 8.7 请举例说明宏的变元是操作数和变元是操作码的用法。 8.8 利用宏可以定义多个存储单元吗?如何定义? 8.9 在宏定义中可以使用标号吗?是否需要说明? 8.10 在宏定义中能否出现分支程序段? 8.11 如何建立宏库?怎样打开宏库? 8.12 结构伪操作的作用是什么?

8.13 请举例说明结构预置和结构引用的用法。

8.14 写出重复汇编和条件汇编的主要作用。它们可以生成机器代码吗?8.15 编写多模块程序时,需要加入哪些参数设置? 8.16 分析下列宏定义,指出它的作用。 EXM1 MACRO X1 MOV AH,X1 INT 21H ENDM

8.17 解释下列宏的功能。 EXM2 MACRO A,B,C MOV AX,A ADD AX,B MOV C,AX ENDM

8.18 指出下列宏的作用。 EXM3 MACRO C1 MOV AH,2

36

MOV DL,C1 INT 21H ENDM

8.19 分析下列宏,指出它的作用。 EXM4 MACRO A1,A2 VALUE DW A1 DUP(A2) ENDM

8.20 下列宏是一个分支程序,宏定义中缺少标号的处理。请添加,并指出宏的功能。

EXM5 MACRO B1,B2 MOV AL,B1 SUB AL,B2 JNS LETT1 NEG AL LETT1:RET ENDM

8.21 定义宏。完成两个操作数相乘,乘积在第3个操作数中。 8.22 分别写出子程序使用的保护现场和恢复现场的宏。 8.23 定义键盘输入一个字符的宏指令INPUT。

8.24 定义显示一个字符的宏指令OUTPUT,要显示的字符用哑元DISP表示。 8.25 定义宏指令KEY_STR,实现从键盘输入一串字符。 8.26 定义宏指令DISPLAY,显示一串字符。

8.27 利用宏指令INPUT和OUTPUT实现将键入的大写字母变为小写显示。 8.28 用宏指令DISPLAY显示存储单元ALPHA中的字符串’Computer’。

8.29 编程序。在键盘输入时,调用宏指令INPUT。对输入的字符判断是否为负号“-”,是则对X求补,不是则继续输入。

8.30 编程序。键盘输入两个一位的十进制数,做加法运算。加法结果调整为非压缩的BCD码,并显示出十进制结果(4-8.asm)。要求改用调用宏INPUT和宏OUTPUT实现键盘输入和显示部分。

习题八答案:

8.16 宏的作用:DOS功能调用。功能号用哑元指出。

8.17 宏的作用:两个操作数相加,结果保存在第3个数中。 8.18 宏的作用:DOS的2号显示功能。

8.19 宏的作用:定义VALUE数组,数组长度和初值由哑元指出。

8.20 缺少标号定义LOCAL LETT1。宏的作用:两个哑元相减,结果为负则求补。 8.27 程序:

.model small .stack 100h .code start:

37

input add al,20h output al

mov ah,4ch int 21h end start

8.28 程序:

.model small .data

alpha db ‘Computer’ .code start:

display alpha

mov ah,4ch int 21h end start

8.29 程序:

.model small .stack 100h .code start:

input

cmp al,‘-’ jnz start

;键盘输入 ; 大写变为小写 ; 显示

;显示字串

;键盘输入

38

neg x mov ah,4ch int 21h end start

8.30 程序:

.model small .stack 100h .code start:

input

mov bl,al input

add al,bl mov ah,0 aaa

add ax,3030h output ah output al

mov ah,4ch int 21h end start

;求补

;键盘输入

;输入第2个数

;非压缩BCD码加法调整

;显示高位 ;显示低位

39

测验八

单选题:

1.有关宏的作用,下列说法不正确的是 。

A.宏可以被多次调用 B.宏调用时不用保存断点 C.宏定义体中不可以有标号 D.宏展开是汇编程序完成的 2.宏定义时,是通过 实现参数传递的。

A.哑元和实元 B.堆栈 C.寄存器 D.存储单元 3.宏调用是通过 实现的。

A.汇编指令 B.宏指令 C.宏展开 D.机器指令 4.宏定义的伪指令是 。

A.PROC … ENDP B.MACRO … ENDM C.SEGMENT … ENDS D.STRUC … ENDS 5.宏定义体中的标号通过 伪指令用来指定。

A.PUBLIC B.MACRO C.EXTRN D.LOCAL 6.有关宏展开的说法正确的是 。

A.在宏展开时,所有的伪指令被加入 B.用宏定义体替换宏指令 C.哑元表中的哑元仍然保留 D.可以将宏指令变为机器代码 7.宏与子程序的区别是 。

A.宏可以被多次调用 B.宏是一段程序 C.宏可以实现参数传递 D.宏调用时不用返回 8.宏库可以保存多个宏,在程序中用 伪指令打开宏库。

A.INCLUDE B.MACRO C.SEGMENT D.STRUC 9.宏库文件的扩展名是 。

A..ASM B..LST C..MAP D..MAC 10.定义结构伪操作的指令是 。

A.PUBLIC B.MACRO C.STRUC D.LOCAL 11.重复汇编和条件汇编 。

A.都是汇编指令 B.都可以变为机器代码 C.不能在程序中使用 D.都是伪操作 12.多模块结构指的是 。

A.多个子程序 B.多个代码段下的源程序 C.多个宏 D.多个.LST文件 13.各个模块间共用的变量要用 伪指令用来说明。

A.PUBLIC B.INCLUDE C.EXTRN D.LOCAL 14.EXTRN伪指令说明某个变量是 。

A.其它模块定义的,在本模块中引用 B.本模块定义的,在其它模块中引用 C.其它模块定义的,在其它模块中引用 D.本模块定义的,在本模块中引用

15.在多模块程序设计中,错误的说法是 。

A.至少定义一个堆栈段

B.结束伪指令END START必须在主模块中

40

C.其它模块的END语句不能带有标号 D.各个代码段名不能相同

测验八答案:

1~5 CABBD 6~10 BDADC 11~15 DBAAD

习题九

9.1 软件中断都有哪些?CPU是如何处理的?

9.2 硬件中断发生时,CPU怎样获知?CPU如何处理硬件中断? 9.3 中断的重要性是什么?若没有中断系统,微机能否工作?

9.4 什么是中断向量?什么是中断向量表?80X86系统的中断向量表在哪儿?9.5 80X86系统可以有多少个中断类型?中断类型号是如何划分的? 9.6 给出一个中断类型号,如何得到其中断向量?

9.7 每个中断类型都有一个中断处理程序吗?中断处理程序在那儿存放? 9.8 中断过程和子程序调用过程一样吗?有何异同? 9.10 中断返回指令和子程序返回指令作用一样吗?

9.11 子程序可以嵌套调用,中断可以嵌套吗?嵌套的条件是什么? 9.12 如何设计用户自己的中断?都有哪些工作要做? 9.13 用什么指令可以设置中断向量? 9.14 用什么指令可以读取中断向量? 9.15 如何实现中断驻留? 9.16 怎样才能触发中断?

9.17 如何设置光标的位置?请举例说明。 9.18 写出实现清屏的指令序列。

9.19 用BIOS中断的什么功能可以显示带颜色的字符? 9.20 如何读取系统日期和时间?有几种方法可以实现? 9.21 定义一个带有哑元的宏,实现在屏幕上开窗口功能。 9.22 定义置光标宏,可以通过变元任意设定光标位置。 9.23 定义窗口宏,用红底黄字显示一行字符并上卷。 9.24 定义读取日期宏。 9.25 定义读取时间宏。

9.26 分析下列程序段,指出其功能。

mov ah,06h mov al,0

mov ch,row1 mov cl,rank1 mov dh,row2 mov dl,rank2 mov bh,color int 10h

9.27 解释下列程序的作用。

mov ah,2

mov dh,5 mov dl,10 mov bh,0 int 10h

41

9.28 下列宏的作用是什么?

enter macro mov ah,2 mov dl,0dh int 21h mov dl,0ah int 21h endm

9.29 写出下列程序段的功能。

reptt2:

mov ah,00h int 1ah

mov higher1,cx mov lower1,dx

cmp dx,91 jl reptt2

9.30 下列程序的作用是什么?试用直接写中断向量表的方式改写。

mov dx,offset win_time mov ax,seg win_time mov ds,ax

mov al,1ch mov ah,25h int 21h

9.31 编程序。在屏幕上0页7行13列显示蓝底黄字的字符串“Windows”。 9.32 编程序。清屏后显示出一串字符,在下一行上可照样输入。 9.33 编写在窗口内显示3行内容的菜单程序。 9.34 编写在窗口中显示当前时间的程序。

9.35 编程实现在窗口中将键盘输入的小写字母加密后显示出来。提示:可在字母上加上某数做加密。 9.36 编写程序,在屏幕上显示彩色的26个英文字母。

9.37 编写程序,在窗口中将键盘输入的一串字符中的大写字母和小写字母的个数分别统计并显示出来。

9.38 编写对键盘输入一段英文的操作计时的程序。

9.39编写读取时钟计数器的值,经过变换产生百位以内随机数的程序。 9.40编写80H号中断处理程序。中断发生时,显示彩色的0~9十个数字。

习题九答案:

9.26 在屏幕的row1、rank1到row2、rank2开窗口,清窗口,设置字符颜色为color。 9.27 将光标设置在5行10列上。 9.28 回车换行宏。

9.29 读取时钟计数器当前计数值,cx保存高位,dx保存低位;判断计数是否到91次(5秒),没到,继续循环读取,到5秒后做下面内容。 9.30 设置1CH号中断的中断向量(win_time),将其保存到中断向量表中。 9.35 编程实现在窗口中将键盘输入的小写字母加密后显示出来。

程序如下:

include 9-3.mac ;宏库

42

.model small .data

letter db 'Input Letter: $' cont db ? .code start:

mov ax,@data mov ds,ax clearsc clearsw reptt:

;置显示光标 mov ah,2 mov dh,11 mov dl,30 mov bh,0 int 10h ;显示串 mov ah,9

mov dx,offset letter int 21h

;置输入光标 mov ah,2 mov dh,15 mov dl,30 mov bh,0 int 10h

;输入小写字母 mov ah,1 int 21h add al,20h ;显示加密后的字符 mov dl,al mov ah,2 int 21h ;开窗口 mov ah,6 mov al,1 mov ch,8 mov cl,30 mov dh,15 mov dl,60

mov bh,27h int 10h inc cont cmp cont,3 jne reptt

;清屏 ;窗口清屏

;在11行30列显示

;在15行30列输入

;加密

;上卷1行

;从8行30列到15行60列;绿底灰字 ;可输入3次

43

out1:

mov ah,4ch int 21h end start

编写程序,在屏幕上显示彩色的26个英文字母。 程序如下:

.model small .data

letter db ? n='a' ;重复汇编 m=1eh ;蓝底黄字开始 rept 26 ;26个小写字母 db n,m n=n+1 m=m+1 endm .code start:

mov ax,@data ;各个段都在代码段中 mov ds,ax ;开窗口 mov ah,06h mov al,0

mov bh,37h ;白底黑字0f0h,兰灰底灰白字37h,黄底白字0e7h mov ch,3 ;从8行30列到15行60列 mov cl,3 mov dh,15 mov dl,60 int 10h ;置光标 locate: mov ah,2 mov dh,6 ;光标在6行30列 mov dl,30 mov bh,0 int 10h

;显示彩色的26个英文字母 mov bx,offset letter+1 mov bp,bx

mov bx,seg letter+1 mov es,bx mov ah,13h mov al,3 mov bh,0 mov cx,26 ;26个字母 int 10h mov ah,4ch

44

9.36

int 21h end start

9.37 编写程序,在窗口中将键盘输入的一串字符中的大写字母和小写字母的个数分别统计并显示出来。 程序如下:

include 9-4.mac .model small .data

mess1 db 'input: $'

mess2 db 29,32 dup(?) daxie db ?

xiaoxie db ? .code start:

mov ax,@data mov ds,ax clearsc clearsw 8,30,15,60,27h cursor 12,30 ;显示提示 mov ah,9

mov dx,offset mess1 int 21h ;输入串 mov al,0 mov ah,10

mov dx,offset mess2 int 21h ;统计 mov cx,0

mov cl,mess2+1 mov bx,2 let1:

mov al,mess2[bx] test al,20h jz let2 inc xiaoxie jmp let3 let2:

inc daxie let3: inc bx loop let1

windows 8,30,15,60,27h cursor 14,30 add xiaoxie,30h displ xiaoxie

;宏库 ;清屏 ;开窗口,绿底灰白字 ;置显示光标 ;输入的个数 ;从第2个单元存放键入的字母 ;区分大小写 ;为0,即大写转 ;小写加1 ;大写加1 ;窗口内上卷 ;在16行30列显示 ;显示小写个数

45

windows 8,30,15,60,27h ;窗口内上卷 add daxie,30h displ daxie ;显示大写个数 out1:

mov ah,4ch int 21h end start

编写对键盘输入一段英文的操作计时的程序。 程序如下:

include 9-4.mac .model small .data

letter1 db 'Time start= ','$' letter2 db 'Time end = ','$' letter3 db 'Time total= ','$' input db 100,102 dup(?) hour db ? minutes db ? seconds db ? persec db ? cont db 0 .code start:

mov ax,@data mov ds,ax clearsc ;清屏 cursor 2,50 ;置光标 mov ah,9

mov dx,offset letter1 ;显示串1 int 21h sss:

;读时间并显示 mov ah,2ch ;CH=小时,CL=分,DH=秒,DL=百分秒int 21h mov bx,0 mov bl,ch

call disp_2_10 ;显示小时 displ ':' ;显示: mov bx,0 mov bl,cl

call disp_2_10 ;分 displ ':' ;显示: mov bx,0 mov bl,dh

call disp_2_10 ;秒 displ ':' ;显示: mov bx,0

46

9.38

mov bl,dl

call disp_2_10 ;百分秒 sub ch,hour ;计算时间差 sub cl,minutes sub dh,seconds sub dl,persec mov hour,ch ;保存时间差 mov minutes,cl mov seconds,dh mov persec,dl inc cont cmp cont,2 ;显示2次时间 jz out1

cursor 7,10 ;置输入光标 mov dx,offset input ;键盘输入 mov ah,10 int 21h

cursor 3,50 ;置光标 ;显示串2 mov ah,9

mov dx,offset letter2 int 21h jmp sss out1:

cursor 4,50 ;置光标 mov ah,9

mov dx,offset letter3 ;显示串3 int 21h

;显示时间差 mov cx,3

mov si,offset hour mov bx,0 www:

mov bl,[si] ;取出时、分、秒 call disp_2_10 ;3次调用 displ ':' ;显示: inc si

loop www mov ah,4ch int 21h

;子程序。二-十进制数转换。bx值用十进制显示。disp_2_10 proc store_ss ;保护现场 mov ax,bx ;bx传参 mov cx,0 mov bx,10 ;将ax变为十进制数

47

let1: mov dx,0 inc cx ;统计余数个数 idiv bx push dx

;保存余数

cmp ax,0 jnz let1 let2: ;显示结果

pop ax ;将余数弹入ax add ax,0030h ;调整为ascii码

mov dl,al mov ah,2 int 21h loop let2 restore_ss ;恢复现场

ret

disp_2_10 endp end start

测验九

单选题:

1.80X86系统中,CPU是通过 获知硬件可屏蔽中断发生的。A.INTR引脚 B.NMI引脚 C.中断允许标志IF D.INT n指令

2.CPU对软件中断的处理,下列说法正确的是 。

A.中断允许标志IF必须为1

B.通过8259A中断控制器管理中断 C.不需要得知中断类型号

D.执行INT n指令时立即转入中断处理

3.在中断处理系统中,中断向量指的是 。

A.中断类型号 B.中断子程序 C.中断子程序的入口地址 D.中断源 4.有关中断向量表的说法正确的是 。

A.中断向量表就是中断向量

B.中断向量表中保存的是中断向量 C.中断向量表中保存的是中断类型号 D.中断向量表中保存的是中断子程序

5.在80X86中断系统中,中断优先级最高的是 。

A.可屏蔽中断 B.非屏蔽中断 C.内部中断 D.单步中断 6. 8086系统的中断向量表位于 。

A.内存的0号~255号字节单元 B.BIOS的ROM中 C.硬盘的0号~255号字节单元 D.系统CMOS中 7.当硬件中断发生时,CPU通过 获得中断类型号。

A.INTR引脚 B.INT n指令

48

C.数据总线 D.中断源

8.在8086指令系统中,取出中断向量的指令是 。

A.MOV AH,35H B.MOV AH,25H

INT 21H INT 21H C.MOV AH,31H D.MOV AH,4CH

INT 21H INT 21H

9.编写中断子程序时,下列说法错误的是 。

A.允许中断嵌套 B.不允许开中断 C.应该保护和恢复现场 D.必须用IRET指令返回 10.中断调用和子程序调用过程相同的是 。

A.保存断点 B.保存标志寄存器 C.将IF和TF清零 D.中断源有优先级 11.BIOS中断设置光标位置的指令是 。

A.MOV AH,01H B.MOV AH,02H

INT 10H INT 10H C.MOV AH,01H D.MOV AH,02H

INT 21H INT 21H

12.BIOS中断显示字符串的指令是 。

A.MOV AH,0EH B.MOV AH,13H

INT 10H INT 10H C.MOV AH,02H D.MOV AH,09H

INT 21H INT 21H

13.BIOS中断从键盘读出一个字符的指令是 。

A.MOV AH,00H B.MOV AH,01H

INT 10H INT 10H C.MOV AH,00H D.MOV AH,01H

INT 16H INT 21H

14.BIOS中断读取时钟计数器的指令是 。

A.MOV AH,00H B.MOV AH,2AH

INT 1AH INT 10H C.MOV AH,01H D.MOV AH,2AH

INT 1AH INT 21H

15.DOS中断读取系统时间的指令是 。

A.MOV AH,1CH B.MOV AH,2CH

INT 10H INT 16H C.MOV AH,1CH D.MOV AH,2CH

INT 21H INT 21H

测验九答案:

1~5 ADCBC 6~10 ACABA 11~15 BBCAD

49

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务