汇编语言课后习题解答

更新时间:2023-10-08 09:19:01 阅读量: 综合文库 文档下载

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

第1章 汇编语言基础知识

1.简述汇编语言源程序、汇编程序、和目标程序的关系。

答:用汇编语言编写的程序称为汇编源程序;汇编源程序在汇编程序的翻译下转换成计算机语言变成目标程序。 2. 简述汇编语言的优缺点。 答:(1) 汇编语言的优点:

① 可有效地访问、控制计算机各种硬件设备,如磁盘、存储器、CPU、I/O端口等。. ② 目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。 ③ 可与高级语言配合使用,应用十分广泛。 (2) 汇编语言的缺点:

① 通用性和可移植性较差

② 相对于高级语言来说较繁锁、易出错、不够直观。

3.CPU的寻址能力为8KB,那么它的地址总线的宽度为多少? 答:13

4. 1KB的存储器有多少个存储单元? 答:1024个字节。

5. 指令中的逻辑地址由哪两部分组成?

答:指令中的逻辑地址由段基址和偏移量组成。

6. 以下为用段基址:偏移量形式表示的内存地址,试计算它们的物理地址。 (1) 12F8:0100 (2) 1A2F:0103 (3) 1A3F:0003 (4) 1A3F:A1FF 答: (1) 13080H (2) 1A3F3H (3) 1A3F3H (4) 245EFH

7. 自12FA:0000开始的内存单元中存放以下数据(用十六进制形式表示): 03 06 11 A3 13 01,试分别写出12FA:0002的字节型数据、字型数据及双字型数据的值。 答: 字节型数据:11H 字型数据:0A311H

双字型数据:0113A311H

8. 内存中某单元的物理地址是19318H,段基地址为1916H,则段内偏移地址为多少?若段内偏移地址为2228H,则段基地址为多少?

答:若段基地址为1916H,则段内偏移地址为01B8H;若段内偏移地址为2228H,则段基地址为170FH

9. 在实模式环境中,一个段最长不能超过多少字节? 答:64KB

10. 实模式可寻址的内存范围是多少? 答:1MB

第2章 汇编语言源程序格式

1.请解释变量和标号的含义,两者有何区别?

答:标号代表一条指令所在单元的地址,在代码段中定义;变量是存放数据的存储单元的地址符号名,在除代码段以外的其他段中定义。变量和标号的主要区别在于变量指的是数据,而标号则对应的是指令。 2. 变量和标号有什么属性?

答:都具有三种属性:段属性、偏移属性和类型属性

3. 伪指令语句与指令语句的区别是什么?伪指令有什么用途?

答:伪指令并不像指令语句那样在程序运行期间由计算机自动执行,而是在汇编程序对源程序汇编期间由汇编程序处理的操作。伪指令可以完成如处理器选择、定义程序模块、数据定义、存储区分配、指示程序开始和结束等功能。

4. 数值返回运算符有哪几种?简述LENGTH和SIZE的区别。

答:⑴数值返回运算符包括:SEG(取段地址)、OFFSET(取偏移地址)、TYPE(取类型值)、LENGTH(取长度)、SIZE(取总字节数)。⑵对于变量中使用DUP的情况,LENGTH回送分配给该变量的单元数,对于其他情况则送1;而SIZE会送分配给变量的总字节数,也就是LENGTH和TYPE的乘积。

5. 画图说明下列伪指令所定义的数据在内存中的存放形式。 (1) ARR1 DB 6,34H,-7 (2) ARR2 DW 3C5DH,1,?

(3) ARR3 DB 2 DUP(1,2,DUP(2,5),3) (4) ARR4 DB ‘HELLO’ (5) ARR% DB ‘1234’ 答:(1) 见题图2.1

06H34HF9HARR1

题图2.1

(2) 见题图2.2

ARR25DH3CH01H00H- -- -

题图2.2

(3) 见题图2.3

ARR301H02H05H02H05H03H01H02H05H02H05H03H

题图2.3

(4) 见题图2.4

ARR448H45H4CH4CH4FH

题图2.4

(5) 题图2.5

ARR531H32H33H34H

题图2.5

6. 写出下列变量定义语句。

(1) 为缓冲区BUF1预留20B的存储空间。

(2) 将字符串‘ABCD’,‘1234’存放于BUF2存储区中。 答: (1) BUF1 DB 20 DUP(?) (2) BUF2 DB ‘ABCD’ DB ‘1234’ 7. 符号定义语句如下:

BUF DB 2,3,4,5,‘345’ EBUF DB 8

LT DB EQU EBUF-BUF 问LT的值是多少? 答:LT的值为7

8. 假设程序中的数据定义如下: A DW ?

B DB 16 DUP(?) C DD ? T EQU $-A

问T的值是多少?它表示什么意义?

答:T的值是22;它表示从变量A到T之间分配的存储空间(字节)数目。

9. 如何规定一个程序执行的开始位置?主程序执行结束应该如何返回DOS?源程序在何处停止汇编过程?

答:程序开始位置:END伪指令后的标号所对应的地址;应用程序开始伪指令.STARTUP处。

返回DOS:RET指令结合PUSH DS等指令;用DOS功能调用的第4CH号中断;.EXIT伪指令。

END伪指令处停止汇编过程。

10.EQU伪指令与“=”伪指令有何区别?

答:在同一程序中,“=”伪指令可对一个符号重复定义 11.指出下列伪指令表达方式的错误,并改正之。 (1) DATA SEG

(2) SEGMENT ‘CODE’ (3) MYDATA SEGMENT ┇

DATA ENDS

(4) MAIN PROC FAR ┇

END MAIN MAIN ENDP

答:(1) SEG改为SEGMENT (2) 没有段名

(3) DATA ENDS改为MYDATA ENDS (4) END MAIN删除

第3章 8086/8088寻址方式及指令系统

1.什么是寻址方式,8086/8088微处理器有几种寻址方式,各类寻址方式的基本特征是什么?

答:寻址方式就是寻找指令中操作数的方式,或寻找指令转移目的地址的方式。

8086/8088微处理器的寻址方式分为数据寻址方式和程序转移寻址方式。数据寻址方式主要包括立即数寻址方式、寄存器寻址方式、直接寻址方式、寄存器间接寻址方式、寄存器相对寻址方式、基址变址寻址方式和相对基址变址寻址方式;程序转移寻址方式主要包括段内直接寻址、段内间接寻址、段间直接寻址、段间间接寻址。

立即数寻址:操作数就在指令中,作为指令的一部分,跟在操作码后存放在代码段。 寄存器寻址:操作数在寄存器中,指令中指定寄存器号。

直接寻址方式:操作数在存储器中,指令直接包含操作数的有效地址EA。

寄存器间接寻址:操作数在存储器中,操作数的有效地址在SI,DI,BX,BP这4个寄存器之一中。

寄存器相对寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器(SI,DI)的内容加上8位或16位的位移之和。

基址变址寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)加上变址寄存器(SI,DI)的内容。

相对基址变址寻址:操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)和变址寄存器(SI,DI)的内容加上8位或16位的位移之和。

段内直接寻址:转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和。

段内间接寻址:转向的有效地址是一个寄存器或是一个存储单元的内容。 段间直接寻址:在指令中直接提供了转向段地址和偏移地址。

段间间接寻址:用存储器里的两个相继字的内容来取代IP和CS寄存器中的原始内容,以达到段间转移的目的。

2. 假定(DS)=1000H,(SI)=007FH,(BX)=0040H,(BP)=0016H,变量TABLE的偏移地址为0100H,试指出下列指令的源操作数字段的寻址方式,它的有效地址(EA)和物理地址(PA)分别是多少?

(1) MOV AX,[1234H] (2) MOV AX,TABLE

(3) MOV AX,[BX+100H] (4) MOV AX,TABLE[BP][SI]

答:(1) 直接寻址,EA=1234H,PA=11234H (2)直接寻址,EA=0100H,PA=10100H

(3) 寄存器相对寻址,EA=0140H,PA=10140H(4)相对基址变址寻址,EA=0195H,PA=10195H

3. 若TABLE为数据段0032单元的符号名,其中存放的内容为1234H,试问下列两条指令有什么区别?执行完指令后,AX寄存器的内容是什么? MOV AX,TABLE LEA AX,TABLE

答:第一条指令是取0032单元的内容,执行完后AX的内容是1234H 第二条指令是取TABLE的偏移地址,执行完后AX的内容为0032H 4. 指出下列指令的错误。

(1) MOV CX,DL (2) MOV IP,AX (3) MOV ES,1234H (4) MOV ES,DS (5) MOV AL,300H (6) MOV [SP],AX (7) MOV AX,BX+DI (8) MOV 20H,AH

答:(1) 两操作数长度不一致 (2) 目的操作数不能为IP

(3) 立即数不能直接送段寄存器

(4) 两个段寄存器之间不能直接进行数据传送 (5) 两操作数长度不一致 (6) SP不能用作间址寄存器

(7) BX+DI改为[BX][DI]或[BX+DI] (8) 目的操作数不能为立即数 5. 指出下列指令的错误。 (1) POP CS

(2) SUB [SI],[DI] (3) PUSH AH (4) ADC AX,DS

(5) XCHG [SI],30H (6) OUT DX,AH (7) IN AL,3FCH (8) MUL 5

答:(1) POP指令不允许使用CS

(2) 两操作数不能同时是存储器寻址方式 (3) 堆栈的操作必须以字为单位 (4) 段寄存器不允许直接参加运算

(5) XCHG指令的操作数不允许是立即数 (6) OUT指令只能用AL做源操作数

(7) 端口号大于255,必须将其放到DX中 (8) MUL指令源操作数不允许是立即数 6. 请分别用一条汇编语言指令完成如下功能。

(1) 把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器。

(2) 用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容

相加,并把结果送到AL中。

(3) 用BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和CX寄存器的

内容相加,并把结果送回存储器中。

(4) 把数0A0H与AL寄存器的内容相加,并把结果送回AL中。 答:(1)ADD DX,BX

(2)ADD AL,[BX+SI] (3)ADD [BX+0B2H],CX (4)ADD AL,0A0H

7. 求出以下各十六进制数与十六进制数58B0之和,并根据结果设置标志位SF、ZF、CF和OF的值。 (1) 1234H (2) 5678H (3) 0AF50H (4) 9B7EH

答:(1)和为6AE4H,SF=0,ZF=0,CF=0,OF=0 (2)和为0AF28H,SF=1, ZF=0, CF=0, OF=1 (3)和为0800H, SF=0, ZF=0, CF=1, OF=0 (4)和为0F42EH, SF=1, ZF=0, CF=0, OF=0

8. 执行指令ADD AL,72H前,(AL)=8EH,标志寄存器的状态标志OF、SF、ZF、AF、PF和CF全为0,指出该指令执行后标志寄存器的值。

答:指令执行后,AL的内容为0000000H,且有进位,标志寄存器中各标志位的值为:OF=0,SF=0,ZF=1,AF=1,PF=1,CF=1 9. 已知程序段如下: MOV AX,1234H MOV CL,4 ROL AX,CL DEC AX MOV CX,4 MUL CX

试问:1、每条指令执行完后,AX的内容是什么? 2、每条指令执行完后,CF、SF和ZF的值是什么? 3、程序执行完后,AX和DX的内容是什么? 答:(1)(2)

MOV AX,1234H ; (AX)=1234H,各标志位不变 MOV CL,4 ; (AX)=1234H,各标志位不变

ROL AX,CL ; (AX)=2341H,CF=1,其它标志位不变 DEC AX ; (AX)=2340H,CF不变,SF=0,ZF=0 MOV CX,4 ; (AX)=2340H,各标志位不变 MUL CX ; (AX)=8D00H,CF=0,ZF=0,SF=0 (3) 程序执行完后,(AX)=8D00H,(DX)=0000H

10. 编程序段,将AL、BL、CL、DL相加,结果存在DX中。 答:MOV AH,0

ADD AL,BL ADC AH,0 ADD AL,CL ADC AH,0 ADD AL,DL ADC AH,0 MOV DX,AX

11. 编程序段,从AX中减去DI,SI和BP中的数据,结果送BX。 答:SUB AX,DI

SUB AX,SI SUB AX,BP MOV BX,AX

12. 假设(BX)=0E3H,变量VALUE中存放的内容为79H,确定下列各指令单独执行后的结果。

(1) OR BX,VALUE (2) AND BX,VALUE (3) XOR BX,OFFH (4) AND BX,01H (5) TEST BX,05H

(6) XOR BX,VALUE 答: (1) (BX)=0FBH

(2) (BX)=61H (3) (BX)=1CH (4) (BX)=01H (5) (BX)=0E3H (6) (BX)=9AH

13. 已知数据段500H~600H处存放了一个字符串,说明下列程序段执行后的结果。

MOV SI,600H MOV DI,601H MOV AX,DS MOV ES,AX

MOV CX,256 STD

REP MOVSB

答:将数据段501H~600H中存储的字符串移到数据段502~601H中 14. 说明下列程序段的功能。

CLD

MOV AX,0FEFH MOV CX,5 MOV BX,3000H MOV ES,BX MOV DI,2000H REP STOSW

答:将附加段的32000H开始的连续5个字初始化为0FEFH 15. 判断下列程序段跳转的条件。 (1) XOR AX,1E1EH JE EQUAL

(2) TEST AL,10000001B JNZ THERE (3) CMP CX,64H JB THERE

答:(1) AX中的值为1E1EH时会跳转(2) AL的最低和最高位至少有一位为1时发生跳转

(3) CX中的值小于64H时发生跳转 16. 选取正确指令,完成以下任务。

(1) 右移DI三位,并将0移入最左一位。(2) AL内容左移一位,0移入最后一位。(3) DX寄存器右移一位,并且使结果的符号位与原符号位相同。 答:(1) MOV CL,3 SHR DI,CL

(2) SHL AL,1(3) SAR DX,1

17. 假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件

转移指令实现以下判断。

(1) 若DX>DI,转到ABOVE执行(2) 若AX>SI,转到GREATER执行。

(3) 若CX=0,转到ZERO执行(4) 若AX-SI产生溢出,转到OVERFLOW执行。 (5) 若SI≤AX,转到LESS_EQ执行。(6) 若DI≤DX,转到BELOW_EQ执行。 答:(1) CMP DX,DI JA ABOVE

(2) CMP AX,SI JG GREATER (3) CMP CX,0 JE ZERO (4)CMP AX,SI

JO OVERFLOW (5) CMP AX,SI

JGE LESS_EQ (6) CMP DX,DI

JAE BELOW_EQ

18. 有一个首地址为ARRAY的20个字数组,说明下列程序段的功能。 MOV CX,20 MOV AX,0 MOV SI,AX

SUM_LOOP: ADD AX,ARRAY[SI] ADD SI,2

LOOP SUM_LOOP MOV TOTAL,AX

答:将首地址为ARRAY的20个字数组元素求和,将结果存放到TOTAL单元

22. 已知内存中起始地址为BLOCK的数据块(字节数为COUNT)的字节数据有正有负。

试编写一个程序,将其中的正、负分开,分别送至同一段中的两个缓冲区,设正、负缓冲区的首地址分别为PLUS和MINUS。 答: DATA SEGMENT

BLOCK DB 16 DUP(?) PLUS DB 16 DUP(?) MINUS DB 16 DUP(?) DATA ENDS CODE SEGMENT

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

MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS MOV BX,OFFSET MINUS MOV CX,COUNT NEXT:MOV AL,[SI] TEST AL,80H JNZ MD

MOV [DI],AL INC DI JMP AGAIN MD: MOV [BX],AL INC BX AGAIN: INC SI LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START

19. 按照下列要求,编写相应的程序段。

(1) 已知字符串STRING包含有32KB内容,将其中的“$”符号替换成空格。

(2) 有一个100个字节元素的数组,其首地址为ARRAY,将每个元素减1(不考虑溢

出)存于原处。

(3) 统计以“$”结尾的字符串STRING的字符个数

(4) 假设从B800H:0开始存放有16个16位无符号数,编程求它们的和,并把32位的

和保存在DX、AX中。

答:(1)

MOV SI,0

MOV CX,8000H

AGAIN:CMP STRING[SI],’$’ JNZ NEXT

MOV STRING[SI],20H NEXT:INC SI LOOP AGAIN

(2)

MOV SI,0 MOV CX,100

AGAIN:DEC ARRAY[SI] INC SI LOOP AGAIN

(3)

XOR SI,SI

COMP:CMP STRING[SI],’$’ JE OVER INC SI JMP COMP OVER:RET (4)

MOV AX,0B800H MOV DS,AX XOR SI,SI XOR DX,DX MOV CX,0FH MOV AX,[SI] AGAIN:INC SI INC SI

ADD AX,[SI] JNC NEXT INC DX NEXT:LOOP AGAIN RET

20. 编写程序,把ARRAY1和ARRAY2中20个字节数分别相加,结果放到TABLE中。 (1) 假定数据为无符号数,如果结果大于255则结果为255。 (2) 假定结果为带符号数,如果有溢出则保存结果为0。 答:(1)

DATA SEGMENT

ARRAY1 DB 20 DUP(?) ARRAY2 DB 20 DUP(?) TABLE DB 20 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,20 MOV SI,0

AGAIN:MOV AL,ARRAY1[SI] ADD AL,ARRAY2[SI] JC LABEL1

MOV TABLE[SI],AL JMP LABEL2

LABEL1:MOV TABLE[SI],255 LABEL2:INC SI LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS

END START

(2)

DATA SEGMENT

ARRAY1 DB 20 DUP(?) ARRAY2 DB 20 DUP(?) TABLE DB 20 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,20 MOV SI,0

AGAIN:MOV AL,ARRAY1[SI] ADD AL,ARRAY2[SI] JO LABEL1

MOV TABLE[SI],AL JMP LABEL2

LABEL1:MOV TABLE[SI],0 LABEL2:INC SI LOOP AGAIN MOV AH,4CH INT 21H

CODE ENDS

END START

21. 字符串ATR1保存着100个字节的ASCII码,试编写一个程序统计该字符串中空格

(20H)的个数。

答: DATA SEGMENT

ATR1 DB 100 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,100 XOR DI,DI XOR SI,SI

COMP:CMP ATR1[SI],20H INC SI JNE NEXT INC DI NEXT:LOOP COMP MOV AH,4CH INT 21H CODE ENDS END START

第4章 顺序、分支与循环程序设计

1.试编写一个程序实现将从键盘输入的小写字母用大写字母形式显示出来。 答: DATA SEGMENT

STRMESSAGE DB “请输入小写字符”,0DH,0AH,’$’ DATA ENDS CODE SEGMENT

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

MOV DX,OFFSET STRMESSAGE MOV AH,9H INT 21H MOV AH,1 INT 21H MOV DL,AL SUB DL,20H MOV AH,2 INT 21H EXIT:MOV AH,4CH

INT 21H CODE ENDS END START

2.在内存BUFFER单元中定义有10个16位数,试寻找其中的最大值及最小值,并放在指定的存储单元MAX和MIN中。 答: DATA SEGMENT

BUFFER DW 10 DUP(?) MIN DW ? MAX DW ? DATA ENDS CODE SEGMENT

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

MOV BX,OFFSET BUFFER MOV AX,[BX] MOV DX,[BX] MOV SI,0 MOV CX,10

MM:MOV DI,[BX+SI] CMP AX,DI JB T1 JMP T2 T1:CMP DX,DI JB T11 JMP T21 T11:MOV DX,DI T21:JMP ENT T2: MOV AX,DI ENT:ADD SI,2 LOOP MM MOV MAX,DX MOV MIN,AX MOV AH,4CH INT 21H CODE ENDS

END START

3.统计字型变量DATBUF中有多少位0,多少位1,并分别记入COUNT0和COUNT1中。 答: DATA SEGMENT

DATBUF DW 1234H COUNT0 DB ? COUNT1 DB ? DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV BX,DATBUF AGAIN:CMP BX,0 JE EXIT SHL BX,1 JNC ZERO INC COUNT1 JMP AGAIN ZERO:INC COUNT0 JMP AGAIN EXIT:MOV AH,4CH INT 21H CODE ENDS END START

4.在BUFFER开始的单元中存放着一个字符串,请判断该字符串中是否存在数字,如有则将X单元置1,否则置0。 答: DATA SEGMENT

BUFFER DB ‘JAVA2COMPUTER’ N=$-BUFFER X DB ? DATA ENDS CODE SEGMENT

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

MOV CX,N XOR SI,SI

AGAIN:CMP BUFFER[SI],39H JA NEXT CMP AL,30H JB NEXT MOV X,1 JMP EXIT NEXT:INC SI LOOP AGAIN MOV X,0 EXIT:MOV AH,4CH INT 21H CODE ENDS END START

5.设在变量单元A1、A2、A3、A4中存放4个数,试编程实现将最大数保留,其余3个数

清零的功能。

答: DATA SEGMENT A1 DB 3 A2 DB 7 A3 DB 9 A4 DB 8 DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV SI,0 MOV CX,3

MOV AL,A1[SI] MOV DI,0 NEXT:INC SI

CMP AL,A1[SI] JNB NEXT1 MOV AL,A1[SI] MOV A1[DI],0 MOV DI,SI JMP NEXT2 NEXT1:MOV A1[SI],0 NEXT2:LOOP NEXT MOV AH,4CH INT 21H CODE ENDS END START

6.已定义了两个整数变量A和B,试编写程序完成下列功能。

(1) 若两个数中有一个是奇数,则将奇数存入A中,偶数存入B中 (2) 若两个数均为奇数,则将两数均加1后存回原变量。 (3) 若两个数均为偶数,则两个变量均不改变。 答: DATA SEGMENT A DB 13H B DB 24H DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,A MOV BL,B XOR AL,BL TEST AL,01H

JZ SAME TEST BL,01H JZ DONE XCHG BL,A MOV B,BL JMP DONE SAME:TEST BL,01H JZ DONE INC A INC B

DONE:MOV AH,4CH INT 21H CODE ENDS END START

7.试编制一个程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存入AX中。

答: MYDATA SEGMENT

DATA DW 100 DUP(?) NUM DB 100 MYDATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:MYDATA START:MOV AX,DATA MOV DS,AX MOV CX,NUM MOV SI,0

MOV AX,32766 AGAIN:TEST DATA[SI],1 JNZ NEXT

COMPARE:CMP AX,DATA[SI] JLE NEXT

MOV AX,DATA[SI] NEXT:ADD SI,2 LOOP AGAIN EXIT:MOV AH,4CH INT 21H CODE ENDS END START

8.已知从符号地址M开始的内存单元中存放有15个16位带符号数,试编制一个程序,将正数依次存放在以符号地址P开始的内存单元中,再将负数依次存放到以符号地址N开始的内存单元中,并将整数和负数的个数显示出来。 答: DATA SEGMENT

M DW 15 DUP(?) P DW 15 DUP(?)

N DW 15 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,15 MOV SI,0 MOV BX,0 MOV DI,0 AGAIN:MOV AX,M[SI] CMP AX,0 JL STEP1 MOV P[BX],AX INC BX JMP NEXT STEP1:MOV N[DI],AX INC DI NEXT:INC SI LOOP AGAIN

;输出正负数据个数子程序 MOV AH,4CH INT 21H CODE ENDS END START

9.已知数组A1中包含有15个互不相等的整数,数组A2中含有20个互不相等的整数,试编制一个程序,把既在A1又在A2中出现的整数存放在以符号地址为E开始的内存单元中。

答: DATA SEGMENT

A1 DW 15 DUP(?) A2 DW 20 DUP(?) E DW 15 DUP(?) DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV CX,15 MOV SI,0 MOV DI,0 MOV BX,0 AGAIN:MOV DX,CX MOV AX,A1[SI] MOV DI,0

MOV CX,20 COMPARE:CMP AX,A2[DI] JE MATCH ADD DI,2 LOOP COMPARE JMP COMMON MATCH:MOV E[BX],AX ADD BX,2 COMMON:ADD SI,2 MOV CX,DX LOOP AGAIN MOV AH,4CH INT 21H CODE ENDS END START

10.已知有N个整数a1,a2,…,an已存放在从A开始的内存单元中,试编制一个程序将其中的负数删去,而把留下的正数依次重新存放在从A开始的内存单元中。

分析:如果当前位置元素小于0,则将当前位置后面第一个大于0的元素放到当前位置,同时将这一位置值置为-1;当该位置后面再没有大于0的元素时,依次将后面各位置元素清0即可(假设初始时所有元素都不等于0) 答: DATA SEGMENT

A DW a1,a2,?,an N DB ($-A)/2 DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV SI,0 MOV DI,2 MOV CX,N AGAIN:MOV DX,CX MOV AX,A[SI] CMP AX,0 JL LOOP1 JMP COMMON LOOP1:DEC CX

NEXT:MOV AX,A[DI] COM AX,0 JG NEXT2 ADD DI,2 LOOP NEXT

JMP EXIT ;后面已经没有正数,重新排序完毕 NEXT2:MOV A[SI],AX

MOV A[DI],-1 COMMON:ADD SI,2 MOV DI,SI ADD DI,2 MOV CX,DX LOOP AGAIN EXIT:MOV CX,N SHR SI SUB CX,SI SHL SI

NEXT3:MOV A[SI],0 ADD SI,2 LOOP NEXT3 MOV AH,4CH INT 21H CODE ENDS END START

第5章 子程序及宏指令设计

1.调用子程序指令的功能是什么?其操作过程包含哪几个步骤? 答:功能:保存返回地址和调用子程序

步骤:(1) 返回地址入栈(2) 用子程序名所代表的子程序入口地址修改IP指令指针寄存器,如果子程序属性是FAR型的,属于跨段调用,还要修改CS寄存器的值(3) 根据IP(和CS)值转到子程序执行

2.试编制一个多精度数求补的子程序,为提高程序的通用性,要求调用子程序时把多精度数的首地址放在SI中(低字节放低位、高字节放高位),多精度数字节数放在CL中。 答: MULNEG PROC NEAR

MOV DI,SI ;保留首地址

MOV CH,00H ;字节数放CL中,将CH清零 PUSH CX

L1:NOT [SI] ;多精度数各字节取反 INC SI LOOP L1 POP CX MOV SI,DI

STC ;将CF置为1,结合ADC语句,实现加1操作 L2:ADC BYTE PTR[SI],0 INC SI LOOP L2 RET MULNEG ENDP

3.试编制两个长度不同的多精度整数求和子程序,为提高程序的通用性,要求调用子程序时把两个多精度数的首地址分别放在SI、DI中(低字节放低位、高字节放高位),多精

度数字节数分别放在CL、CH中。

答:求得的和放在较长的多精度整数的存储区

ADDITION PROC NEAR

CLC ;ZF清零 CMP CL,CH

JGE CA ;第一个多精度数较长 CR: MOV AL,[SI] ADC [DI],AL INC DI INC SI DEC CL JNZ CR JMP EXIT CA: MOV AL,[DI] ADC [SI],AL INC DI INC SI DEC CH JNZ CA EXIT: RET

ADDITION ENDP

4.试编写一个子程序用以统计字数组中零元素的个数,参数采用堆栈传递,入口参数为:数组存储区首地址,数组长度N。出口参数为零元素的个数,并写出CALL指令执行前后,以及RET指令执行前后,堆栈情况。 答: SSTACK SEGMENT DW 16 DUP(?) TOS LABEL WORD SSTACK ENDS

DATA SEGMENT

ARRAY DW 2,63,5,0,-4,-16,0,9 N DW ($-ARRAY)/2 COUNT DW 0 DATA ENDS CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:SSTACK START:MOV AX,DATA MOV DS,AX MOV AX,SSTACK MOV SS,AX

MOV SP,OFFSET TOS LEA BX,ARRAY

PUSH BX ;压入数组首地址 LEA BX,N

PUSH BX ;压入元素个数地址

答:⑴逐条嵌入格式:嵌入的各汇编指令代码前面都要加上“asm”关键字, 每行以分号或换行符结束。⑵成组嵌入格式:嵌入的各汇编指令代码放在同一个asm代码块中,代码块从“{”开始,到“}”结束,由“asm”关键字标识。 4.说明在嵌入式汇编程序中访问C程序变量的一般方法。 答:直接使用该变量名即可。

5.在Visual C环境下利用嵌入式汇编指令,完成对两个C变量的求和,结果由C程序显示。

答: main() {

int sum; int var1=5; int var2=6; __asm{

mov eax,var1 add eax,var2 mov sum,eax }

printf(“%d”,sum); }

6.在Visual C程序中输入两个整数,然后调用汇编子程序对两个数求差,结果在主程序中显示。

答: main() {

int result,var1,var2;

scanf(“%d,%d\\n”,&var1,&var2); __asm{

mov eax,var1 sub eax,var2 mov result,eax }

printf(“%d”,result); }

7.在Visual C程序中编写一个嵌入式汇编排序函数,C语言主程序提供待排序的数据并显示排序后的结果。

答:用起泡方法从大到小排序

main() {

int a[5]={2,-8,9,3,6}; int n = 5; __asm{

lea ebx,a mov ecx,n dec ecx loop1:mov edx,ecx

mov esi,0

loop2:mov eax,[ebx+esi] cmp eax,[ebx+esi+2] jge next

xchg eax,[ebx+esi+2] mov [ebx+esi],eax next:add si,2 loop loop2 mov ecx,edx loop loop1 }

for(int i=0;i++;i<5)

printf(“%d\\n”,a[i]); }

8.用嵌入汇编指令编写一个字符转换函数,实现将C语言主程序中的一个字符串内容的所有小写字母转换位大写字母。转换前后的字符串内容由C语言主程序打印显示。 答:

main() {

char str[5]={ 'h','e','l','e','o'}; int n = 5; int i=0;

__asm lea ebx,str __asm mov esi,0 for(i=0;i

printf(\ __asm{

mov eax,[ebx+esi] cmp eax,61h jb next cmp eax,7ah ja next sub eax,20h

mov [ebx+esi],eax next:inc esi } }

printf(\ for(int i=0;i++;i<5)

printf(\ }

9.在嵌入式汇编指令中调用一个C函数。 答:TURBO C++3.0下的程序如下:

void fun()

{

printf(\ retrun;

} main() {

void (*p)(); p=fun; asm call p

}

10.进行32位混合编程时,如何编写Visual C主程序和汇编语言过程?

答:(1) Visual C主程序要采用3种调用规范之一进行汇编子程序的调用;汇编程序中可用.model伪指令说明汇编语言的调用规范。(2) 汇编子程序中的过程名及变量名应该用public进行说明。Visual c主程序中应将用到的汇编子程序的过程名和变量名说明为外部符号,并且不能在名字前加下划线。(3) 32位汇编时要用EAX、EBX等32位寄存器(4) Visual C主程序调用汇编子程序时,通过堆栈传递参数,顺序从右到左。汇编子程序的返回值小于4字节时放到EAX寄存器中;返回值在4~8字节之间,放在EDX:EAX寄存器中;返回值大于8字节,返回值得地址指针放在EAX中。

11.说明C程序调用外部汇编模块的具体方法,并总结参数传递和汇编模块返回值的接口约定。分析C程序调用汇编模块前后的堆栈变化情况。

答:(1) C程序调用外部汇编模块的具体方法:调用程序和被调用的汇编过程必须使用相同的存储模型;汇编子程序的过程名和变量名都应说明为public且过程名和变量名前加下划线;在C中应将在本程序中用到的汇编子程序的过程名和变量名说明为外部过程和变量,并且不能在名字前加下划线。(2) 参数传递和汇编模块返回值的接口约定:通过堆栈传递参数(从右到左);传值时直接写出实际参数,传址时在extern说明语句中将参数类型说明成指针类型,并在调用时给出参数地址。返回值通过寄存器传递,16位返回值用AX,32位返回值用DX:AX,返回值大于32位则放到静态变量存储区(near调用时该数据的首地址存放在AX中,far调用时该数据的首地址存放在DX:AX中)。(3) 调用时将参数从右向左依次压入堆栈,再将返回地址压入堆栈;返回后将内容依次弹出即可。

12.编写两个数求和的汇编模块,两个操作数通过堆栈传递,在C程序中输入两个整数,调用汇编模块求和,结果在主程序中打印显示。画图说明调用汇编模块前后堆栈变化情况。

答:C语言源程序:

extern \ main() {

int x,y,z;

scanf(\ asm mov ax,x asm mov bx,y asm push bx asm push ax

z=adds();

printf(\ } 汇编语言源程序:

.MODEL SMALL PUBLIC _ADDS .CODE

_ADDS PROC PUSH BP MOV BP,SP MOV AX,[BP+4] MOV BX,[BP+6] ADD AX,BX POP BP RET 4 _ADDS ENDP END

调用前堆栈情况如题图9.1。调用后堆栈情况如题图9.2。

SS→SS→┇SP→┇BP偏移地址XYSP→调用后堆栈

题图9.1 题图9.2

13.若一个C主程序MAIN要调用汇编子程答:(1) EXTERN指令(2) SUB1子程序要序SUB1,试问:(1) MAIN模块中的什么声明为PUBLIC类型且加下划线,表明可指令告诉汇编程序SUB1是在外部定义的?被外部程序调用 (2) SUB1怎么知道MAIN模块要调用它?

14.编制计算一个数组中能被3整除的数据之和的子程序,并利用此子程序编制求A、B、C 三个数组中能被3整除的数据之和的主程序,要求主程序和子程序分别进行编制。 答:C语言主程序:

extern \ main() {

int s=0;

int a[5]={3,5,7,9,14}; int b[5]={4,6,15,24,8}; int c[5]={36,72,1,83,6};

s=sum(a,5)+sum(b,5)+sum(c,5); printf(\ } 汇编语言子程序:

调用前堆栈

.MODEL SMALL PUBLIC _SUM .CODE _SUM PROC PUSH BP MOV BP,SP MOV BX,[BP+4] MOV CX,[BP+6] MOV SI,0 MOV DI,0

NEXT:MOV AX,[BX+SI] MOV DL,3 DIV DL

TEST AH,0FFH JNE REPEAT ADD DI,[BX+SI] REPEAT:ADD SI,2 LOOP NEXT MOV AX,DI POP BP RET

_ADDS ENDP END

LEA BX,COUNT

PUSH BX ;压入零元素数目地址 CALL COMPUTE MOV AH,4CH INT 21H

COMPUTE PROC FAR PUSH BP MOV BP,SP PUSH CX PUSH SI PUSH DI

MOV SI,[BP+10];得到数组首址 MOV DI,[BP+8];元素个数地址 MOV CX,[DI] ;得到元素个数 MOV DI,[BP+6] ;零元素数目地址 NEXT:CMP WORD PTR[SI],0 JNE COMMON

INC WORD PTR[DI] COMMON:ADD SI,2 LOOP NEXT POP DI POP SI POP CX POP BP RET 6 COMPUTE ENDP CODE ENDS END START

CALL指令执行前堆栈情况如题图5.1;CALL指令执行后及RET指令执行前堆栈情况如题图5.2;RET指令执行后堆栈情况如题图5.3。

SS→SP→SS→┇┇SP→IP值CS值COUNT首址N的地址ARRAY首址0PSP段地址SS→SP→COUNT地址N的地址ARRAY首址0PSP段地址┇COUNT地址N的地址ARRAY首址0PSP段地址CALL指令执行前堆栈CALL指令执行后及RET执行前堆栈RET执行后状态

题图5.1 题图5.2 题图5.3

5.试编程计算两个数X和Y最小公倍数的子程序。 答:设AL中存储X,BL中存储Y

LCM PROC NEAR

PUSH DX

CMP AL,BL JA NEXT

XCHG AL,BL ;保证AL中存放较大数 NEXT:MOV DL,AL ;保留AL值 MOV DH,BL ;保留BL值 LOOP1:AND AH,00H

DIV BL ;求AL MOD BL,值(余数)放AH CMP AH,0 JE OVER MOV AL,BL MOV BL,AH JMP LOOP1 OVER:MOV AL,DL

MUL DH ;X×Y→AX

DIV BL ;AL为求得的最小公倍数,BL中为最大约数 POP DX RET LCM ENDP

6.试编制一个计算两个正整数X和Y最大公约数的子程序。 答:程序参见题5

7.设一维数组LIST1、LIST2、LIST3中分别存放了若干个单字长的带符号数,试编制程序使3个表中的数据都按降序排列。表中元素的个数分别在NUM1、NUM2、NUM3三个单元中。

答: DATA SEGMENT

LIST1 DW 1,2,3,4,5,6,7,8,9,10 NUM1 DW ($-LIST1)/2

LIST2 DW 10,20,30,40,50,60,7,80,90,100 NUM2 DW ($-LIST2)/2

LIST3 DW 100,200,300,400,500,600,700,800,900,1000 NUM3 DW ($-LIST3)/2 TABLE DW 2 DUP(?) DATA ENDS CODE SEGMENT

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

MOV TABLE,OFFSET LIST1 MOV TABLE+2,OFFSET NUM1 LEA BX,TABLE CALL SORT

MOV TABLE,OFFSET LIST2 MOV TABLE+2,OFFSET NUM2 LEA BX,TABLE CALL SORT

MOV TABLE,OFFSET LIST3 MOV TABLE+2,OFFSET NUM3 LEA BX,TABLE CALL SORT MOV AH,4CH INT 21H SORT PROC NEAR PUSH AX PUSH CX PUSH SI PUSH DI

MOV DI,[BX+2] ;取元素个数地址 MOV CX,[DI] ;取元素个数 LOOP1:MOV DX,CX MOV SI,[BX] LOOP2:MOV AX,[SI] CMP AX,[SI+2] JGE NEXT

XCHG AX,[SI+2] MOV [SI],AX NEXT:ADD SI,2 LOOP LOOP2 MOV CX,DX LOOP LOOP1 POP DI POP SI POP CX POP AX RET SORT ENDP CODE ENDS END START

8.试编制一个通用多字节数求和的宏指令。 答: SUM MACRO BX,N,RESULT PUSH AX PUSH CX MOV AL,0 MOV CX,N NEXT:ADD AL,[BX] INC BX LOOP NEXT

MOV RESULT,AL POP CX POP AX

ENDM

注意:BX为多字节数首地址,N为字节数数目,RESULT存储求得的和 9.已知宏定义如下:

DIF MACRO X,Y MOV AX,X SUB AX,Y ENDM

ABSDIF MACRO X1,X2,X3 LOCAL CONT PUSH AX DIF X1,X2 CMP AX,0 JGE CONT NEG AX CONT:MOV X3,AX POP AX ENDM

试展开以下调用,并判定调用是否有效。

(1) ABSDIF P1,P2,DISTANCE (2) ABSDIF [BX][SI],X[DI],CX

(3) ABSDIF [BX][SI],X[BX][SI],240H (4) ABSDIF AX,BX,CX (5) ABSDIF AX,AX,A 答:(1)

+ PUSH AX + MOV AX,P1 + SUB AX,P2 + CMP AX,0 + JGE ??0000 + NEG AX

+ ??0000:MOV DISTANCE,AX + POP AX 该调用有效 (2)

+ PUSH AX

+ MOV AX,[BX][SI] + SUB AX,X[DI] + CMP AX,0 + JGE ??0000 + NEG AX + ??0000:MOV CX,AX + POP AX 该调用有效 (3)

+ PUSH AX

+ MOV AX,[BX][SI] + SUB AX,X[BX][SI] + CMP AX,0 + JGE ??0000 + NEG AX

+ ??0000:MOV 240H,AX + POP AX 该调用无效 (4)

+ PUSH AX + MOV AX,AX + SUB AX,BX + CMP AX,0 + JGE ??0000 + NEG AX + ??0000:MOV CX,AX + POP AX 该调用有效 (5)

+ PUSH AX + MOV AX,AX + SUB AX,AX + CMP AX,0 + JGE ??0000 + NEG AX + ??0000:MOV AX,AX + POP AX 该调用有效

10.试编写一条含有重复汇编的宏指令,定义一个0~9数字的平方表。 答: IRPC X,0123456789 DB X*X ENDM

11.用宏定义及重复伪操作把TAB、TAB+1、TAB+2、…、TAB+20的内容存入堆栈。 答: PUSH_TAB MACRO NUM PUSH TAB+NUM ENDM 宏调用:

N=0 REPT 21 PUSH_TAB %N N=N+1 ENDM 宏展开:

+ PUSH TAB+0 + PUSH TAB+1 + PUSH TAB+2 ┇

+ PUSH TAB+20

12.用重复伪操作建立100个字的数组,要求数组中每个字的内容是其下一个字的地址,最后一个字的内容是第一个字的地址。 答: ARRAY LABEL WORD REPT 99 DW $+2 ENDM

DW ARRAY 汇编后得: DW $+2 DW $+2 ┇ DW $+2 DW ARRAY

第6章 32位指令系统及程序设计

1.什么是实模式?什么是保护模式? 答:⑴实模式方式:32位微处理器只使用其中的低20位地址线A19-A0来寻址内存,因此最大寻址的物理空间空间为1MB。段地址和段偏移量都使用16位数来表示,每段存储器的最大容量为64KB。⑵保护模式方式:主要用于多任务环境下。所谓保护就是对被切换任务所使用的存储器内容进行保护。在保护模式下存储器的地址采用虚拟地址、线性地址、物理地址三种方式来描述,需要通过一种称为描述符表的数据结构来实现对内存单元的访问。

2.什么是16位段和32位段?

答:⑴16位段:程序的逻辑段地址必须使用16位的段寄存器存储,每段最大空间为64KB的物理段。16位段在实模式下使用。⑵32位段:程序的逻辑段地址必须使用32位的段寄存器存储,每段最大空间为最大4GB的物理段。32位段在保护模式下使用。 3.判断下列指令是否正确?对不正确的指令说明错误原因。

答: ⑴ ADD AX,ECX 错:两个操作数长度不一致。

⑵ MOV AX,[ECX+EBX] 对

⑶ INC [DX] 错:没有说明操作数长度属性 ⑷ PUSH ECX 对 ⑸ ADD ECX,EDX 对

4.如何使微处理器识别386及以上级别CPU的指令? 答:首先使用处理器选择伪指令对处理器型号进行说明。

5.执行下列指令后,EAX、EBX、ECX、EDX内容是什么? 答: ⑴ MOV EAX,12345678H (EAX)=12345678H

⑵ MOV EBX,0123H (EBX)=00001234H ⑶ MOV ECX,00999H (ECX)=00000999H

⑷ MOV EDX,112233H (EDX)=00112233H

6.选用合适的指令完成以下操作 答: ⑴ 将EDX的内容减1

DEC EDX

⑵ 将EAX、EBX、ECX三个寄存器的内容相加,将结果存入EDX寄存器。 ADD EAX,EBX ADD EAX,ECX MOV EDX,EAX

⑶ 设AL内容为一个有符号数,将其扩展到EAX CBW CWDE

⑷ 将CPU的型号标识码取出存放在EDX中。 CPUID

8.什么是环绕加法运算?使用环绕加法指令计算7F00H + 1900H,给出结果。

答:环绕运算的含义是指:将基本的操作单位(字节、字、双字)看成互相独立的元素,这些独立的元素操作后形成相对独立的结果,不产生进位。 7F00H + 1900H = 9800H

9.什么是饱和加法运算?使用无符号饱和加法指令计算7F00H + 1900H,给出结果

答:饱和运算的含义是指:当操作结果的数值超过此类型数据(字节、字、双字)的最大界限时,其结果就用此类型数据的最大值(加法运算)或最小值(减法运算)代替。 对于无符号数,当最高位产生进位(借位)表示超出最大界限。对于有符号数,发生溢出表示超出最大界限。 7F00H + 1900H = 9800H 10.说明以下MMX指令的功能

答: ⑴ MOVD MM0,MM1 将MM1中的低32位数据传送到MM0

⑵ MOVQ MM3,MM4 将MM4中的低64位数据传送到MM3 ⑶ PSRLQ MM0,7 将MM0中数据进行逻辑右移7位 ⑷ PANDN MM7,MM6 将MM7内容取反后与MM6内容相与

第7章 综合程序设计

1.什么是文件的首簇号?怎样获取文件的首簇号?

答:文件首簇号是文件在磁盘上所占用的最初两个扇区的逻辑位置。

每个文件的首簇号被存放在该文件文件控制块(FCB)的系统保留字段24~31字节中。当通过系统功能调用的OFH子功能打开一个文件时,从打开文件的FCB中相应得偏移字节就可以获取文件的首簇号。 2.利用首簇号加密的原理是什么?

答:加密原理是基于同一文件复制到两个硬盘上其首簇号不同。在软件安装时,首先获取该文件安装后的首簇号,将该首簇号以名文或密文形式写入规定的地方。每次运行该软件时,将再次读取该商品软件的首簇号,并与存放的首簇号进行对比。如果运行的是原始安装的文件,这两个首簇号应该相同;如果运行的是非法复制的文件,二者将会不同。 3.利用堆栈实现反跟踪的原理是什么?

答:当程序发生中断或子程序调用时首先将Flags和CS、IP值自动压入。如果在某些堆栈区存入关键信息(如密钥或加密程序首地址),并设法使SP指针指向这里,形成一个临时堆栈,那么一旦跟踪程序运行时肯定要使用中断或子程序,这样就会破坏存放在那里的关键数据,从而达到了反跟踪的目的。 4.怎么设置临时堆栈区?答:设置SS和SP

第8章 输入输出与中断控制

1.简述I/O端口的概念,I/O端口的地址空间是如何划分的?

答:计算机外部设备通过I/O接口与系统总线连接。每个接口包含一组寄存器,这些寄存器或寄存器组被称为I/O端口。 每一个I/O端口对应一个唯一的I/O端口地址,有的计算机内存和I/O端口统一编址,有的计算机内存和I/O端口是分开编址。 2.简述不同的I/O数据传送控制方式的特点及主要应用场合。 答:(1) 程序控制方式。特点是以CPU为中心,通过预先编制好的输入输出程序实现数据的传送。适用于预先知道何时进行信息传送的情况。(2) 中断方式.特点是CPU和外设几乎可以同时工作,大大提高了CPU的工作效率。适用于要求CPU和外设并行工作的场合。(3) DMA方式。特点是在存储器和外设之间、存储器和存储器之间直接进行的数据传送,传送过程无需CPU介入,但需要专用的DMA控制器。适用于需要高速数据传输的场合。(4) 通道和I/O处理机方式。特点是外围有独立于CPU的,专门管理I/O的处理机,它控制设备与内存直接进行数据交换。

3.简述中断处理程序的结构模式,说明中断和子程序调用之间的主要区别是什么? 答:(1) 中断处理程序的结构模式

① 保护现场,将CPU内部相关寄存器的内容依次压入堆栈② 开放中断,允许级别较高的中断进入③ 中断处理程序的具体内容④ 恢复现场,将所保存在堆栈中的寄存器内容弹出堆栈⑤ 中断返回

(2) 计算机的中断过程类似子程序的调用。但是,子程序的执行是程序员事先安排好的,而中断服务程序的执行则是由随机的中断事件引起的。另外,子程序的执行往往与主程序有关,而中断服务程序可能与被中断的程序毫无关系。同时有可能出现多个中断事件同时请求的情况。

4.简述中断向量表的结构,说明中断系统是如何根据中断类型号获得中断处理程序入口地址的?

答:(1) 中断向量表保存在内存最低地址的1KB空间内,其地址范围为00~3FFH。各中断处理程序的入口地址按其类型号依次存放,每个入口地址占用4个字节,两个低字节存入口地址的IP部分,两个高字节存放CS部分。(2) 中断类型号N乘以4,即可计算出相应的中断向量地址,从该地址的内存单元中取出偏移地址和段地址分别放入IP和CS,CPU就可以转入相应得中断处理程序。

5.编写程序段,轮流测试两个设备的状态寄存器,只要一个状态寄存器的第0位为1,则与其相应的设备就输入一个字符;如果其中任一状态寄存器的第3位为1,则整个输入过程结束。两个状态寄存器的端口地址分别是24H和26H,与其相应的数据输入寄存器的端口号则为28H和30H,输入字符分别存入首地址为BUF1和BUF2开始的存储区中。

答: LEA SI,BUFF1

LEA DI,BUFF2

STAT1:MOV DX,24H

IN AL,DX

TEST AL,1 JZ STAT2 IN AL,24H TEST AL,01H JZ STAT2 IN AL,28H MOV [SI],AL INC SI MOV DX,24H IN AL,24 TEST AL,8 JNZ EXIT

STAT2: IN AL,26H

TEST AL,1 JZ STAT1

IN AL,30H

MOV [DI],AL INC DI IN AL,26H TEST AL,8 JZ STAT1 EXIT:RET

6.设中断类型9的中断处理程序的首地址为INT9PRO,给出为中断类型9设置中断向量的程序段。 答:

MOV AX,0 MOV ES,AX MOV BX,36

MOV AX,OFFSET INT9PRO MOV ES:WORD PTR[BX],AX MOV AX,SEG INT9PRO

MOV ES:WORD PTR [BX+2],AX

7.简述系统功能调用和BIOS中断的作用和一般调用方法。 答:(1) 系统功能调用

作用:设备管理;文件管理和目录操作;其它管理(如内存、时间、日期等管理) 一般调用方法:①功能号→AH ②入口参数→制定寄存器 ③INT 21H (2) BIOS中断调用

作用:驱动系统中所配置的常用外设(即驱动程序),如显示器、键盘、打印机、磁盘

驱动器、通信接口等;开机自检,引导装入;提供时间、内存容量及设备配置情况等参数。

一般调用方法:①功能号→AH ②入口参数→制定寄存器 ③INT N

8.编写一个子程序,用来读入一个按键,并在屏幕上按十六进制的形式显示按键的ASCII

码。

答:

SUB1 PROC NEAR MOV AH,1 INT 21H MOV CH,2 MOV CL,4 MOV BL,AL ROL AL,CL

START: AND AL,0FH

ADD AL,30H CMP AL,3AH JL PRINT ADD AL,7H PRINT: MOV DL,AL MOV AH,2 INT 21H MOV AL,BL DEC CH JNZ START RET SUB1 ENDP

9.编写一个程序,在屏幕的右下角闪烁显示编程者的姓名,显示颜色自定。 答: ESEG SEGMENT

STR DB 'JOE' ;编程者姓名字符串 DATA ENDS CODE SEGMENT

ASSUME CS:CODE,ES:ESEG START:MOV AX,ESEG MOV ES,AX

MOV AL,3 ;选择80*25的彩色文本显示模式 MOV AH,0 ;改变显示模式 INT 10H

MOV BP,OFFSET STR

MOV CX,3 ;要显示字符串的长度 MOV DX,1840H ;字符串的显示位置 MOV BL,8AH ;字符串浅绿色闪烁 MOV AL,0

MOV AH,13H ;显示字符串 INT 10H MOV AH,4CH INT 21H CODE ENDS END START

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

Top