第二章
1,存储器与寄存器有什么不同?
答:寄存器在 CPU的内部,它的访问速度快,但容量小 ( 8086微处理器只有 14个 16位寄存器 ),成本高,它用名字来标识 ( 如 AX,BX等 ),
没有地址;存储器在 CPU的外部,它的访问速度比寄存器慢,容量大 ( 20
根地址线寻址 1M内存空间 ),成本低,存储单元用地址来标识,地址可用各种方式形成 。
2,标志寄存器中的状态标志和控制标志有什么区别?
答:状态标志用来记录程序运行结果的状态信息,许多指令执行完毕后都相应地设置状态标志,它又称为条件码标志,包括进位标志,溢出标志,符号标志,零标志,奇偶标志等;控制标志用来控制处理器执行指令的方式,一般在程序中根据需要由指令设置,如方向标志,中断标志,陷阱标志等 。
3,溢出标志 OF和进位标志 CF有什么不同?
答:当运算结果的最高有效位有向高位的进位 ( 加法 ) 或借位 ( 减法 ) 时,进位标志 CF置 1;当运算结果超出了机器所能表示的数的范围时
,产生溢出,溢出标志 OF置 1。
4,一个字在存储器中是如何存放的?
答:一个字在存储器中占用相邻的两个存储单元,低 8位存入低地址,高 8位存入高地址,字单元的地址用它的低地址来表示 。
5,为什么要将存储器分段管理?
答:对于 16位字长的 8086CPU而言,只能表示 16位存储器地址 (
编号从 0000H~FFFFH) ;但 8086CPU的地址线是 20根,最大可寻址 1MB的存储空间,其物理地址范围从 00000H~FFFFFH。 为了用 16位地址在 1MB空间寻址,将 1MB存储器空间分成许多逻辑段,这样每个存储单元就可以用 "段地址:偏移地址 "来表示其准确的物理位置 。
段地址是逻辑段在主存中的起始位置,8086规定段地址必须是
xxxx0H形式,省略低 4位 0,段地址就可用 16位二进制数表示,通常保存在段寄存器中;偏移地址是存储单元距离段起始位置的偏移值,每个段最大 64KB,所以偏移地址也可用 16位二进制数表示 。 这样,物理地址就可通过段地址乘以 16加上偏移地址得到
6,程序中的指令与数据在存储器中是怎样存放的?
答:程序中的指令序列存放在代码段中,程序中使用的堆栈存放在堆栈段中,程序中的数据默认存放在数据段中,有时也放在附加段中 。
第三章
1,什么是寻址方式?
答:在指令中,有时要寻找操作数的地址,有时要寻找转移地址 ( 如转移指令,CALL指令等 ),这些寻找地址的方式就称为寻址方式 。 8086微处理器寻找操作数地址有七种方式:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,相对基址变址寻址等;寻找转移地址的方式有段内寻址和段间寻址,它们又分为段内直接,段内间接,段间直接,段间间接寻址等 。
2,MOV指令有什么特殊规定?
答,MOV指令是双操作数指令,两个操作数不能同为存储器寻址方式且不能同时为段寄存器,目的操作数不允许用立即寻址方式且不能是代码段段寄存器 CS,立即数不能直接送段寄存器等 。
3,PUSH指令和 POP指令有什么特点?
答:这是两个重要的对堆栈操作的指令,它们只能做字操作,它们所带的操作数不能是立即数,POP指令不允许使用
CS寄存器 。
4,算术移位指令和逻辑移位指令有什么不同?
答:算术移位指令一般用于带符号数的乘 2或除 2运算,
正确的运算结果应保证符号位不变;逻辑移位指令用于无符号数的乘 2或除 2运算,参与移位的操作数的最高有效位并不代表符号位 。
5,ADD,SUB,NEG等指令执行完毕后,CF和 OF的值意味着什么?
答,CF=1意味着把参与运算的数看作无符号数时,运算出现了错误,
同时它确实代表最高有效位有向高位的进位 ( 加法 ) 或借位 ( 减法 ) ;
OF=1意味着把参与运算的数看作带符号数时,运算出现了错误 。 也就是说,CF位可用来表示无符号数的溢出,OF位可用来表示带符号数的溢出 。
6,乘法指令和除法指令有什么特殊规定?
答:在乘法指令中,隐含使用累加器 AL或 AX参与运算,两个 8位数相乘得到 16位乘积,存放在 AX中;两个 16位数相乘得到 32位乘积,存放在
DX,AX中 。 在除法指令中,隐含使用 DX,AX或 AX做被除数,16位数除以 8位数,8位商在 AL中,8位余数在 AH中; 32位数除以 16位数,16位商在 AX中
,16位余数在 DX中 。
7,逻辑运算指令的主要作用是什么?
答:逻辑运算指令对处理操作数的某些位很有用,例如可屏蔽某些位 ( 将这些位置 0),将某些位置 1,将某些位变反,测试某些位等 。
8,串处理指令有什么特殊规定?
答:在串处理指令中,源串默认在数据段中,但允许使用段跨越前缀来修改,源操作数用 SI寻址;目的串只能在附加段中,目的操作数用 DI寻址 。 SI与 DI有自动增,减量的功能,可完成正向或反向,字节操作或字操作的串处理 。
9,条件转移指令和无条件转移指令有什么不同?
答:条件转移指令的位移量只允许 8位,即目标地址应在本条转移指令的下一条指令地址的 -128 ~ +127个字节的范围之内,因此它只能实现段内转移;无条件转移指令则没有此限制,它能够实现段内和段间两种转移,段内转移可使用 8位或 16位位移量 。
第四章
1,指令和伪指令有什么区别?
答:指令是在程序运行期间由计算机来执行的,而伪指令 ( 伪操作
) 是在汇编程序对源程序进行汇编时处理的操作,完成诸如数据定义,
存储器分配,指示程序开始结束等功能 。
2,汇编语言源程序中的变量和标号有哪些属性?
答:源程序中的变量和标号都有三种属性:段,偏移及类型 。 变量在除代码段以外的其他段中定义,段地址存放在段寄存器中,偏移地址存放在基址或变址寄存器中,变量的类型可以是 BYTE( 字节 ),WORD(
字 ),DWORD( 双字 ) 等;标号指示指令的地址,它的段地址总在 CS中
,偏移地址在 IP中,标号的类型可以是 NEAR( 近 ) 或 FAR( 远 ) 。
3,指令 AND AL,OPR1 AND 0FFH中的两个 AND有什么区别?
答:第一个 AND是操作码,表明这是一条逻辑运算指令,完成逻辑与运算;第二个 AND是一个按位操作的逻辑操作符,它只能用于数字表达式 。
第五章
1,在把二进制数以十六进制数的形式在屏幕上显示出来的程序中,关于显示字符的 ASCII码是如何调整的?
答:在使用 DOS功能调用 ( INT 21H) 显示单个字符时,必须得到要显示字符的 ASCII码 。 字符 '0'到 '9'的 ASCII码为 30H到 39H,因此只要把 0
到 9加上 30H就可以了;但字符 'A'到 'F'的 ASCII码为 41H到 46H,0AH到 0FH
除了加上 30H之外,还要再加上 7。
2,为什么说循环结构是分支结构的特例?
答:循环结构在满足循环条件时实行循环,这实际上是多次走同一个分支,当不满足循环条件时,就走另一个分支,因此循环结构是一种特殊的分支结构 。
3,多重循环程序如何编写?
答:可以利用 LOOP指令和转移指令 。
第六章
1,子程序调用和返回指令完成哪些操作?
答:子程序调用指令首先把子程序的返回地址 ( 即调用程序中 CALL指令的下一条指令的地址 ) 存入堆栈,然后转移到子程序的入口地址去执行
,它又分为段内调用和段间调用;返回指令的操作是返回地址出栈送 IP寄存器 ( 段内或段间 ) 和 CS寄存器 ( 段间 ) 。
2,将过程定义为 FAR属性,可以段内调用吗?
答:不能 。 如果所定义的过程是 FAR属性,那么对它的调用和返回一定都是 FAR属性;如果所定义的过程是 FAR属性,那么对它的调用和返回一定都是 FAR属性 。 因此只需在定义时考虑它的属性,而 CALL和 RET的属性由汇编程序来确定 。
3.在用堆栈传参的子程序设计中,为什么常用带常数的返回指令?
答:在用堆栈传参时,主程序中要把参数的地址压入堆栈,子程序中通过 BP寄存器访问堆栈单元取出参数的地址,而不是用出栈的方法。因此为使返回到主程序后堆栈能恢复原始状态不变,要用带常数的返回指令调整 SP的值。
4,在用堆栈传参的子程序设计中,为什么要 PUSH BP?
答:这是因为子程序中要用到 BP寄存器 。 在子程序中,
为了取得从堆栈传递过来的参数,必须访问堆栈,这就要用到 BP寄存器,而 BX,SI,DI等寄存器都不能用来访问堆栈 。
5,堆栈段定义时,其变量名所指的是堆栈中的哪个位置
?
答:栈底 。 ( P206)
6,过程是否只有调用它的时候才被汇编?
答:不是 。 过程和其他指令一样,在汇编时就被汇编,
只是调用时才被使用 。
7,宏,伪指令的汇编过程如何?
答:伪指令不是在程序运行期间由计算机执行的,而是在汇编程序汇编期间同汇编程序处理的操作,它们可以完成如处理器的选择,定义程序模式,定义数据,分配存储区,指不程序结束等功能 。 当源程序被汇编时,汇编程序将对每个宏调用作宏展开 。 宏展开就是用宏定义体取代源程序中的宏指令名,而且用实参取代宏定义中的形参 。
8,有必要将主程序定义为过程吗? ( 如 P339)
答:一般来说,将主程序定义为一个过程并定义为 FAR属性,
就可以把主程序看作 DOS调用的一个子过程 。
9,P241的,stack segment at 500h”的,at 500h”什么意义
?
答:,at 500h”用来指定堆栈段的段地址 ( P120) 。
第七章
1,编程时应如何选择使用子程序结构还是宏汇编结构?
答:使用子程序结构可提高编程效率,节省存储空间 。 但每次调用子程序,返回,保存及恢复寄存器以及参数的传送等都要增加程序的额外开销 。 因此,子程序结构适合于子程序代码较长,传参较多,有紧缩存储空间要求的情况下使用 。 使用宏汇编的程序执行效率较高,但汇编后的目标代码占用存储空间较大 。 因此,宏汇编一般用于子功能代码较短,传参较少的程序中使用 。 其实,使用子程序结构还是使用宏汇编结构,并没有固定的标准,大多数情况下,取决于程序员的编程风格 。
2,什么是宏?
答:宏是源程序中一段有独立功能的程序代码 。 它只需要在源程序中定义一次,就可以多次调用它,调用时只需要用一个宏指令语句就可以了 。
3,宏指令是如何定义的?
答:定义宏指令称为宏定义,宏定义是用一组伪操作来实现的,
其格式为:
宏指令名 MACRO [虚参 1,虚参 2,… ]
(宏定义体:一组有独立功能的程序代码 )
ENDM
4,什么是宏调用? 什么是宏展开?
答:在源程序中对宏指令的调用称为宏调用,但对宏指令必须先定义后调用 。 宏展开是用宏定义体取代源程序中的宏指令名,并且用实元取代宏定义中的哑元的汇编过程 。
5,在宏展开时,实参和虚参的个数不等,怎么办?
答:汇编程序不要求实参和虚参的个数必须相等,当实参个数大于虚参个数时,多余的实参不予考虑;当实参个数小于虚参个数时,则多余的虚参作,空,处理 。
6,宏调用中的实参 ( 实元 ) 可以是表达式吗?
答:可以是表达式,还可以是常数,字符串,寄存器,存储单元名以及用寻址方式能找到的地址等,也可以是指令的操作码或操作码的一部分 。 应注意的是,宏展开后,即用实参取代虚参 ( 又称哑元 ) 后,所得到的汇编语句应该是有效的,否则汇编程序将会指示出错 。 在 MASM6
中,还可以用,REQ指定某个参数是必须有的 。
7,& 操作符及 %操作符应如何使用?
答,& 操作符可以把前后两个符号合并形成操作码,操作数或是一个字符串 。 % 操作符把跟在它之后的表达式的值转换成当前基数下的数
,在宏展开期间,用这个数来取代哑元 。
8.,XALL,.LALL和,SALL有什么区别?
答:这 3个伪操作是列表伪操作,用来控制汇编清单中宏展开的列出方式 。 一般在 LST清单中,使用隐含的,XALL
伪操作,它使不产生目标代码的语句在清单中不列出来 。,LALL列出包括注释在内的所有宏展开;,SALL则不列出任何展开信息 。
9,LOCAL伪操作的作用是什么?
答:当宏定义体内的功能代码使用了标号,而在程序中要多次调用该宏定义,此时宏展开后会出现标号的多重定义,这是不能允许的 。 为了解决这个问题,系统提供了
LOCAL伪操作,其格式是,LOCAL 局部标号 1,局部标号 2,
… 汇编程序对 LOCAL伪操作之后的每一个局部标号,在展开时用0000取代局部标号 1,用0001取代局部标号 2,以此类推,这样在展开后的程序中的标号就是唯一的了 。
10,IRP与 IRPC的区别是什么?
答,IRP与 IRPC是不定重复伪操作,它们的不同之处在于自变量的取代方式 。 IRP的自变量表用尖括号括起来,每次重复用自变量表中的一项来取代重复块中的哑元 。 重复次数由自变量表中的自变量个数来确定 。 IRPC的自变量表必须是字符串,重复次数由字符串中的字符个数确定,每次重复用字符串中的一个字符取代重复块中的哑元 。
11,使用条件伪操作的目的是什么?
答:汇编程序根据条件伪操作能把一个程序段包括在源程序中,或排除在源程序之外,也可以根据不同条件选择不同的程序段进入源程序,这为汇编语言编程提供了很大的便利 。
12.什么是宏库?宏库的扩展名是什么?
答:包含若干常用宏定义的文件称为宏库,宏库通常用,MAC或,INC作为扩展名。
13,下面的语句是什么含义?
if1
include macro.mac
endif
答,INCLUDE语句说明该应用程序中要用到宏库
MACRO.MAC中的宏定义,汇编程序将把 MACRO.MAC中的所有宏定义都包含在应用程序中 。 而条件伪操作 IF1语句可使 INCLUDE只在汇编的第一遍扫视期间出现,这样宏库的拷贝将不在汇编清单中出现第八章
1,什么是 I/O端口? CPU使用什么指令与外设进行数据交换?
答,CPU与 I/O设备通过硬件接口或控制器相连接,
这些接口或控制器都有数量不等的端口,这些端口有统一的地址编码,CPU通过这些端口使用输入输出指令 IN、
OUT与外设进行数据交换 。
2,CPU为什么不能用 MOV指令进行 I/O数据传输?
答:在 80x86微机系统中,I/O端口编址在一个独立的地址空间中,它和存储器是完全分离的 。 因此,对于存储器的存取操作使用 MOV指令,而与端口进行信息交换的操作使用专门的 I/O指令,二者不能混淆 。
3,使用查询方式进行输入输出的优缺点是什么?
答:使用查询方式编程可直接在端口级上输入输出信息,数据的传送速度和吞吐量比较高,另外在控制多个设备的 I/O时,可在程序中安排它们的优先级,最先查询的设备,其工作的优先级也最高 。 修改程序中的查询次序,实际上也就修改了设备的优先级,这样以最简便的方法实现了对设备优先级的控制 。 查询方式的缺点主要是在查询过程中,要反复的查询等待,浪费了 CPU原本可执行大量指令的时间,而且由询问转向相应的处理程序的时间较长,尤其在设备比较多的情况下 。
4,什么是中断?
答:计算机在执行程序过程中,遇到需要处理的事件时,暂停当前正在运行的程序,转去执行有关的服务程序,处理完后自动返回原程序,这个过程称为中断 ( interrupt) 。 中断在现代计算机系统中是一种非常重要的技术,输入输出设备和主机交换数据,分时操作,实时系统,多处理机系统,计算机网络和分布式计算机系统都要用到这种技术 。
5,中断分为几类?
答:中断可分为内中断和外中断 。 内中断是由计算机内部原因引起的中断,内中断又称为软中断,它 通 常 由 三 种 情 况 引 起,
(1) 由中断指令 INT引起;
(2)由于 CPU的某些错误而引起,如溢出中断,除法错中断等;
(3) 为调试程序 ( DEBUG) 设置的中断,如单步中断,断点中断;外中断指由外部事件引起的中断,又称为硬中断 。
硬件中断主要有两种来源:
(1) 非屏蔽中断 ( NMI),如电源故障中断,实时钟中断等 。
(2)可屏蔽中断,一般是由于各种外部设备请求 CPU提供服务所引起的中断 。
6,什么是中断类型?
答,80x86中断系统能处理 256种中断,每种中断都安排一个编号,
称之为中断类型 。 256种中断类型号排列为 00~0FFH。
7,中断向量表的作用是什么?
答:为了提高响应中断的速度,通常把所有中断处理程序的入口地址 ( 或称为中断向量 ) 汇集在中断向量表中,当 CPU响应中断时,根据中断源的中断类型号,直接从中断向量表中得到相应的入口地址,并从该地址开始执行中断处理程序 。
8,中断向量表一般安排在存储器的什么位置?
答:存储器最低的 1K字节,地址从 00000 ~ 03FFH存放中断向量 。
中断向量表中的 256项中断向量对应 256种中断类型,每项占用四个字节
,其中两个字节存放中断处理程序的段地址 ( 16位 ),另两个字节存放偏移地址 ( 16位 ) 。
9,某外设能否得到 CPU的中断服务取决于什么控制条件?
答:从外设发出中断请求到 CPU响应中断,有两个控制条件是起决定性作用的:
(1) 该外设的中断请求是否被屏蔽,这个条件由 8259A的中断屏蔽寄存器 ( 端口地址为 21H) 控制;
(2) CPU是否允许响应中断,这由标志寄存器 ( FLAG) 中的中断允许位 IF控制 。 但 CPU不能禁止非屏蔽中断,对于非屏蔽中断 CPU总会响应
。
10,什么是开中断和关中断? 如何控制开中断和关中断?
答:允许 CPU响应外设的中断请求叫做开中断,此时 IF=1;不允许
CPU响应外设的中断请求叫做关中断,此时 IF=0。 有两条指令能控制开,
关中断,STI 开中断 ( IF=1) CLI 关中断 ( IF=0)
11,CPU响应中断的过程是怎样的?
答,( 1) 取中断类型号 N
( 2) 寄存器 ( FLAG) 内容入栈
( 3) 当前代码段寄存器 ( CS) 内容入栈
( 4) 当前指令计数器 ( IP) 内容入栈
( 5) 禁止硬件中断和单步中断 (IF=0,TF=0)
( 6) 从中断向量表中取 4?N的字节内容送 IP,取 4?N+2中的字节内容送 CS
( 7) 转中断处理程序
12,为什么产生中断后,要清除 IF和 TF位?
答:在中断发生时,CPU自动清除了 IF位和 TF位,这样设计的目的是使 CPU转入中断处理程序后,不允许再产生新的中断,包括单步执行 。
如果在执行中断处理程序的过程中,还允许外部的中断,可通过 STI指令再把 IF置为 1。
13,当多个中断源同时向 CPU请求中断时,CPU应如何处理?
答:各种中断源事先安排有中断优先级,当多个中断源同时申请中断时,CPU先比较他们的优先级,,然后从优先级高到优先级低的次序来依次处理各个中断源的中断请求 。
14,中断程序的编写方法是什么?
答:在主程序中要为中断做如下准备工作:
( 1) 设置中断向量 ( 使用 INT 21H的 25H功能 )
( 2) 设置中断设备的屏蔽位 ( I/O端口 21H)
( 3) 开中断 ( STI)
中断处理程序的编写步骤:
( 1) 保存工作寄存器的内容
( 2) 如允许中断嵌套,则开中断 ( STI)
( 3) 中断处理功能
( 4) 关中断 (CLI)
( 5) 送中断结束命令 ( EOI) 给中断命令寄存器 ( I/O端口 20H)
( 6) 恢复工作寄存器内容
( 7) 返回被中断的程序 ( RET)
15,什么是中断嵌套? 处理中断嵌套时应注意什么?
答:中断嵌套是指正在运行的中断处理程序,又被其它中断源中断的情况 。 一个正在执行的中断处理程序,在开中断 ( IF=1) 的情况下,
能被优先级高于它的中断源中断,但如果要被同级或低级的中断源中断,
则必须发出 EOI命令,清除正在执行的中断请求,才能响应同级或低级的中断 。 80X86没有规定中断嵌套的深度 ( 中断程序又被中断的层次 ),但在实际使用时,多重的中断嵌套要受到堆栈容量的限制,所以在编写中断程序时,一定要考虑有足够的堆栈单元来保存多次中断的断点及各寄存器的内容 。
16,什么情况下中断处理子程序需要结束中断 (EOI)? 结束中断指令起什么作用?
答:在外中断处理程序之中或在结束之前,发出中断结束命令 EOI能清除当前正在处理的中断请求,以便能够在该处理程序的过程中或结束之后,再响应同级或低级的中断 。
17,系统提供的 INT 1CH的中断处理程序是怎样的? 为什么?
答:系统提供的 INT 1CH的中断处理程序中只有一条指令,IRET。 实际上这是系统为用户设置的一个中断类型号,用户可以用自己设计的中断处理代码来代替原 1CH程序 。 如果用户有某种定时周期性的工作需要完成,就可以利用系统定时器的中断间隔 ( 约每秒中断 18.2次 ),嵌套调用 1CH的中断处理程序,并用计数的方法控制时间周期 。 如,需要 10秒钟的周期,则将计数值设置为 182。 定时器中断程序每调用一次 INT 1CH,
计数值减 1,当计数值为 0时,说明已到 10秒 。
第九章
1,BIOS中断调用的基本用途是什么? 使用 BIOS调用的好处是什么?
答,BIOS是系统提供的基本输入输出例行程序,它包括系统加电自检,引导装入,主要 I/O设备的处理程序以及接口控制等功能模块 。 BIOS
有两个基本用途:一是给不同系列的微处理器提供兼容的 I/O服务,使程序员在编程时不必考虑不同型号机器的具体差别 。 二是给程序员提供文件化的,直接对硬件进行操作的子功能,程序员可不必了解硬件操作的具体细节 。 所以利用 BIOS功能编写程序简单方便,可读性好,
2,DOS功能调用的用途是什么? 与 BIOS中断调用在使用上有什么差别?
答,DOS是 PC机上最重要的操作系统,它和 BIOS一样包括有近百个设备管理,目录管理和文件管理程序,是一个功能齐全,使用方便的中断例行程序的集合 。 使用 DOS操作比使用相应功能的 BIOS操作更简易,而且对硬件的依赖性更少些 。
3,BIOS和 DOS中断调用的方法是什么?
答,BIOS功能与 DOS功能都是通过软件中断调用的 。 在中断调用前需要把功能号装入 AH寄存器,把子功能号装入 AL寄存器,除此而外,通常还需在 CPU寄存器中提供专门的调用参数 。 一般地说,调用 DOS或 BIOS功能时
,有以下几个基本步骤:
( 1) 把调用参数装入指定的寄存器中;
( 2) 如需功能号,把它装入 AH;
( 3) 如需子功能号,把它装入 AL;
( 4) 按中断号调用 DOS或 BIOS中断;
( 5) 检查返回参数是否正确 。
4,键盘上什么键能产生 ASCII码? 不能产生 ASCII码的键如何识别?
答:键盘上的所有按键的识别采用行列扫描法,即根据对行线和列线的扫描结果来确定闭合键的位置,并通过键盘数据线将闭合键所对应的扫描码 ( 8位 ) 送往主机 。 其中字符数字键给计算机传送一个
ASCII码字符,而扩展功能键产生一个动作,如按下 Home键能把光标移到屏幕的左上角,End键使光标移到屏幕上文本的未尾 。 按动组合控制键能改变其它键所产生的字符码 。
5,什么是通码和断码? 它们的标志是什么?
答:按下键时,产生的扫描码称为通码,放开键时产生的扫描码称为断码 。 其代码的最高位为 0,表示是通码,最高位为 1,表示是断码 。
6,如何判断按动了组合控制键?
答:组合控制键的状态反映在键盘状态字节中,INT 16H的 AH=2
的功能可以把表示组合控制键的状态回送到 AL寄存器 。 按动某键所对应的位为 1,反之为 0。
7,DOS键盘 06功能是读写控制台,控制台是指什么?
答:控制台是指主机及其配置的基本输入输出设备,一般是显示器和键盘 。 INT 21H的 06功能,当 (DL)=0FFH时,输入键盘字符;当
(DL)=0~0FEH时,请求输出设备工作 。
8,DOS功能 AH=1和 AH=7,8都是从键盘输入一个字符,它们有什么不同?
答,INT 21H 功能 07和 08的输入操作与功能 01H相似,不同的是输入字符不回显 。 使用功能 7,输入字符不回显,也不进行 Ctrl_C 或
Ctrl_Break的检查处理 。 08功能不回显字符,但与 01H一样,支持 Ctrl_C
或 Ctrl_Break的中断处理 。
9,程序如何获得功能键和数字组合键的字符码?
答:要接收功能键或数字组合键,程序必须进行两次 DOS调用,第一次调用回送 00,第二次调用回送所按键的扫描码 。 程序如下:
MOV AH,7 ; 第一次 DOS键盘调用 INT 21H
CMP AL,0
JE ISEC ; (AL)=0,则是功能键或数字组合键
···
ISEC,MOV AH,7 ; 第二次 DOS键盘调用
INT 21H ; (AL) = 扫描码
···
10,使用 21H 中断的功能 A输入字符串时应注意些什么?
答:使用 21H 中断的功能 A输入字符串时,特别要注意缓冲区的定义方法 。 缓冲区的第一个字节保存最大字符数,这个最大字符数由用户给出 。 第二个字节是实际输入字符的个数,这个数据由功能 A填入 。 在这两个字节之后,字符串就按字节存入缓冲区,最后一个字节是结束字符串的回车符 0DH,因此整个缓冲区的字节空间应定义为最大字符数
( 包括 Return在内 ) 加 2。 INT 21H的功能 A把实际字符数 ( 不包括
Return) 填入缓区的第二个字节,并保持 DS,DX 指向缓冲区的第一个字节 。 所以,取输入的字符串应从指针 DX+2开始 。
11,在文本方式下,显示屏上的字符是如何表示的?
答:对应显示屏幕上的每个字符,在存储器中由连续的两个字节表示,一个字节保存 ASCII码,另一个字节保存字符的属性 。
12,什么是字符的属性?
答:说明字符显示特性的字节称为字符属性 。 对单色显示,字符属性定义了字符是否闪烁,是否加强亮度,是否反相显示等 。 对彩色显示
,属性字节定义了显示字符 ( 前景 ) 和背景的颜色以及闪烁和亮度等特性 。
13,屏幕上的字符位置和显存地址的关系如何?
答:屏幕上某一字符位置和显存中的偏移地址的关系可由下列公式表示,字符偏移地址 =页偏址 +(( 行号 × 每行字符数 ) +列号 ) × 2
14,使用 INT 21H显示字符串功能要注意些什么?
答:使用 INT 21H显示字符串,一定要在显示串之后加上定界符 $,
因为此功能是用 $作为标记来计算串的长度的 。 另外控制码不能出现在字符串中 。 显示字符串时,如果希望光标能自动换行,那么可在字符串结束之前加上回车和换行的 ASCII码 。
15,用显示字符串功能显示下面定义的字符串有什么问题?
(1) MESS DB ‘DISPLAY THE STRING.’,CR,LF,‘$’
(2) MESS DB ‘DISPLAY THE STRING.$’,0DH,0AH
答,( 1) )字符串中的回车符 (CR)和换行符 (LF)不能识别,必须在字符串中直接写出它们的 ASCII码 ( 用十六进制或十进制表示均可 ),
MESS DB ‘DISPLAY THE STRING.’,13,10,‘$’
另一种方法是用 EQU定义出 CR和 LF的 ASCII值,这时可在字符串中直接使用 CR和 LF。
( 2) 字符串显示后,光标不能移动到下一行开始,因为回车换行符在定界符 $之后,而字符串显示功能把 ’ $’作为显示字符串的结束标记
。
16,用打印机打印出一个字符串应使用什么功能调用?
答:打印机的 I/O中断调用没有提供打印字符串的功能,要打印一个字符串可多次调用 DOS或 BIOS打印单字符的功能,字符串的长度作为循环打印字符的计数控制值 。
17,串行通信有哪两种方式?
答:串行通信有并行和串行两种方式 。 在并行数据传输方式中,8位或 16位的数据同时进行发送或接收 。 在串行通信方式中,通信接口每次由 CPU得到 8位或 16位的数据,然后一位位地串行传送 。
18,在串行通信方式中是如何识别连续不断的数字信号呢?
答:计算机通信规定了数据的格式,对每个要传送的字符都要按规定的格式进行组帧,例如,一个组帧后的字符有 1位起始位,8位字符码和 2位终止位 。 传输由起始位开始,接着的字符从低位到高位顺序送出,
最后 2位终止位表示字符结束 。 在没有传输信号时,1( 高电平 ) 称为标记 ( Mark),0( 低电平 ) 称为间隔 ( space),
19,计算机通信的数据格式是固定的吗?
答:不是,程序员可以通过 DOS命令和 BIOS功能对 COM端口以及数据参数进行初始化 。 使用 DOS的 MODE命令进行初始化的格式为:
MODE COM端口号 ( 1~4),波特率,校验位,数据字长,终止位位数例,MODE COM1,24,O,8,1 为 COM1设置参数为,2400波特率,奇校验,8位字长及 1位终止位 使用 BIOS INT 14H的 0功能可设置串信通信口的初始化参数,
例如:
MOV AL,10100011B ; 2400波特,字长为 8位,1位终止位,无奇偶校验
MOV DX,0 COM1
MOV AH,0 ; 初始化通信口功能 INT 14H ; BIOS调用
。
1,存储器与寄存器有什么不同?
答:寄存器在 CPU的内部,它的访问速度快,但容量小 ( 8086微处理器只有 14个 16位寄存器 ),成本高,它用名字来标识 ( 如 AX,BX等 ),
没有地址;存储器在 CPU的外部,它的访问速度比寄存器慢,容量大 ( 20
根地址线寻址 1M内存空间 ),成本低,存储单元用地址来标识,地址可用各种方式形成 。
2,标志寄存器中的状态标志和控制标志有什么区别?
答:状态标志用来记录程序运行结果的状态信息,许多指令执行完毕后都相应地设置状态标志,它又称为条件码标志,包括进位标志,溢出标志,符号标志,零标志,奇偶标志等;控制标志用来控制处理器执行指令的方式,一般在程序中根据需要由指令设置,如方向标志,中断标志,陷阱标志等 。
3,溢出标志 OF和进位标志 CF有什么不同?
答:当运算结果的最高有效位有向高位的进位 ( 加法 ) 或借位 ( 减法 ) 时,进位标志 CF置 1;当运算结果超出了机器所能表示的数的范围时
,产生溢出,溢出标志 OF置 1。
4,一个字在存储器中是如何存放的?
答:一个字在存储器中占用相邻的两个存储单元,低 8位存入低地址,高 8位存入高地址,字单元的地址用它的低地址来表示 。
5,为什么要将存储器分段管理?
答:对于 16位字长的 8086CPU而言,只能表示 16位存储器地址 (
编号从 0000H~FFFFH) ;但 8086CPU的地址线是 20根,最大可寻址 1MB的存储空间,其物理地址范围从 00000H~FFFFFH。 为了用 16位地址在 1MB空间寻址,将 1MB存储器空间分成许多逻辑段,这样每个存储单元就可以用 "段地址:偏移地址 "来表示其准确的物理位置 。
段地址是逻辑段在主存中的起始位置,8086规定段地址必须是
xxxx0H形式,省略低 4位 0,段地址就可用 16位二进制数表示,通常保存在段寄存器中;偏移地址是存储单元距离段起始位置的偏移值,每个段最大 64KB,所以偏移地址也可用 16位二进制数表示 。 这样,物理地址就可通过段地址乘以 16加上偏移地址得到
6,程序中的指令与数据在存储器中是怎样存放的?
答:程序中的指令序列存放在代码段中,程序中使用的堆栈存放在堆栈段中,程序中的数据默认存放在数据段中,有时也放在附加段中 。
第三章
1,什么是寻址方式?
答:在指令中,有时要寻找操作数的地址,有时要寻找转移地址 ( 如转移指令,CALL指令等 ),这些寻找地址的方式就称为寻址方式 。 8086微处理器寻找操作数地址有七种方式:立即寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址,相对基址变址寻址等;寻找转移地址的方式有段内寻址和段间寻址,它们又分为段内直接,段内间接,段间直接,段间间接寻址等 。
2,MOV指令有什么特殊规定?
答,MOV指令是双操作数指令,两个操作数不能同为存储器寻址方式且不能同时为段寄存器,目的操作数不允许用立即寻址方式且不能是代码段段寄存器 CS,立即数不能直接送段寄存器等 。
3,PUSH指令和 POP指令有什么特点?
答:这是两个重要的对堆栈操作的指令,它们只能做字操作,它们所带的操作数不能是立即数,POP指令不允许使用
CS寄存器 。
4,算术移位指令和逻辑移位指令有什么不同?
答:算术移位指令一般用于带符号数的乘 2或除 2运算,
正确的运算结果应保证符号位不变;逻辑移位指令用于无符号数的乘 2或除 2运算,参与移位的操作数的最高有效位并不代表符号位 。
5,ADD,SUB,NEG等指令执行完毕后,CF和 OF的值意味着什么?
答,CF=1意味着把参与运算的数看作无符号数时,运算出现了错误,
同时它确实代表最高有效位有向高位的进位 ( 加法 ) 或借位 ( 减法 ) ;
OF=1意味着把参与运算的数看作带符号数时,运算出现了错误 。 也就是说,CF位可用来表示无符号数的溢出,OF位可用来表示带符号数的溢出 。
6,乘法指令和除法指令有什么特殊规定?
答:在乘法指令中,隐含使用累加器 AL或 AX参与运算,两个 8位数相乘得到 16位乘积,存放在 AX中;两个 16位数相乘得到 32位乘积,存放在
DX,AX中 。 在除法指令中,隐含使用 DX,AX或 AX做被除数,16位数除以 8位数,8位商在 AL中,8位余数在 AH中; 32位数除以 16位数,16位商在 AX中
,16位余数在 DX中 。
7,逻辑运算指令的主要作用是什么?
答:逻辑运算指令对处理操作数的某些位很有用,例如可屏蔽某些位 ( 将这些位置 0),将某些位置 1,将某些位变反,测试某些位等 。
8,串处理指令有什么特殊规定?
答:在串处理指令中,源串默认在数据段中,但允许使用段跨越前缀来修改,源操作数用 SI寻址;目的串只能在附加段中,目的操作数用 DI寻址 。 SI与 DI有自动增,减量的功能,可完成正向或反向,字节操作或字操作的串处理 。
9,条件转移指令和无条件转移指令有什么不同?
答:条件转移指令的位移量只允许 8位,即目标地址应在本条转移指令的下一条指令地址的 -128 ~ +127个字节的范围之内,因此它只能实现段内转移;无条件转移指令则没有此限制,它能够实现段内和段间两种转移,段内转移可使用 8位或 16位位移量 。
第四章
1,指令和伪指令有什么区别?
答:指令是在程序运行期间由计算机来执行的,而伪指令 ( 伪操作
) 是在汇编程序对源程序进行汇编时处理的操作,完成诸如数据定义,
存储器分配,指示程序开始结束等功能 。
2,汇编语言源程序中的变量和标号有哪些属性?
答:源程序中的变量和标号都有三种属性:段,偏移及类型 。 变量在除代码段以外的其他段中定义,段地址存放在段寄存器中,偏移地址存放在基址或变址寄存器中,变量的类型可以是 BYTE( 字节 ),WORD(
字 ),DWORD( 双字 ) 等;标号指示指令的地址,它的段地址总在 CS中
,偏移地址在 IP中,标号的类型可以是 NEAR( 近 ) 或 FAR( 远 ) 。
3,指令 AND AL,OPR1 AND 0FFH中的两个 AND有什么区别?
答:第一个 AND是操作码,表明这是一条逻辑运算指令,完成逻辑与运算;第二个 AND是一个按位操作的逻辑操作符,它只能用于数字表达式 。
第五章
1,在把二进制数以十六进制数的形式在屏幕上显示出来的程序中,关于显示字符的 ASCII码是如何调整的?
答:在使用 DOS功能调用 ( INT 21H) 显示单个字符时,必须得到要显示字符的 ASCII码 。 字符 '0'到 '9'的 ASCII码为 30H到 39H,因此只要把 0
到 9加上 30H就可以了;但字符 'A'到 'F'的 ASCII码为 41H到 46H,0AH到 0FH
除了加上 30H之外,还要再加上 7。
2,为什么说循环结构是分支结构的特例?
答:循环结构在满足循环条件时实行循环,这实际上是多次走同一个分支,当不满足循环条件时,就走另一个分支,因此循环结构是一种特殊的分支结构 。
3,多重循环程序如何编写?
答:可以利用 LOOP指令和转移指令 。
第六章
1,子程序调用和返回指令完成哪些操作?
答:子程序调用指令首先把子程序的返回地址 ( 即调用程序中 CALL指令的下一条指令的地址 ) 存入堆栈,然后转移到子程序的入口地址去执行
,它又分为段内调用和段间调用;返回指令的操作是返回地址出栈送 IP寄存器 ( 段内或段间 ) 和 CS寄存器 ( 段间 ) 。
2,将过程定义为 FAR属性,可以段内调用吗?
答:不能 。 如果所定义的过程是 FAR属性,那么对它的调用和返回一定都是 FAR属性;如果所定义的过程是 FAR属性,那么对它的调用和返回一定都是 FAR属性 。 因此只需在定义时考虑它的属性,而 CALL和 RET的属性由汇编程序来确定 。
3.在用堆栈传参的子程序设计中,为什么常用带常数的返回指令?
答:在用堆栈传参时,主程序中要把参数的地址压入堆栈,子程序中通过 BP寄存器访问堆栈单元取出参数的地址,而不是用出栈的方法。因此为使返回到主程序后堆栈能恢复原始状态不变,要用带常数的返回指令调整 SP的值。
4,在用堆栈传参的子程序设计中,为什么要 PUSH BP?
答:这是因为子程序中要用到 BP寄存器 。 在子程序中,
为了取得从堆栈传递过来的参数,必须访问堆栈,这就要用到 BP寄存器,而 BX,SI,DI等寄存器都不能用来访问堆栈 。
5,堆栈段定义时,其变量名所指的是堆栈中的哪个位置
?
答:栈底 。 ( P206)
6,过程是否只有调用它的时候才被汇编?
答:不是 。 过程和其他指令一样,在汇编时就被汇编,
只是调用时才被使用 。
7,宏,伪指令的汇编过程如何?
答:伪指令不是在程序运行期间由计算机执行的,而是在汇编程序汇编期间同汇编程序处理的操作,它们可以完成如处理器的选择,定义程序模式,定义数据,分配存储区,指不程序结束等功能 。 当源程序被汇编时,汇编程序将对每个宏调用作宏展开 。 宏展开就是用宏定义体取代源程序中的宏指令名,而且用实参取代宏定义中的形参 。
8,有必要将主程序定义为过程吗? ( 如 P339)
答:一般来说,将主程序定义为一个过程并定义为 FAR属性,
就可以把主程序看作 DOS调用的一个子过程 。
9,P241的,stack segment at 500h”的,at 500h”什么意义
?
答:,at 500h”用来指定堆栈段的段地址 ( P120) 。
第七章
1,编程时应如何选择使用子程序结构还是宏汇编结构?
答:使用子程序结构可提高编程效率,节省存储空间 。 但每次调用子程序,返回,保存及恢复寄存器以及参数的传送等都要增加程序的额外开销 。 因此,子程序结构适合于子程序代码较长,传参较多,有紧缩存储空间要求的情况下使用 。 使用宏汇编的程序执行效率较高,但汇编后的目标代码占用存储空间较大 。 因此,宏汇编一般用于子功能代码较短,传参较少的程序中使用 。 其实,使用子程序结构还是使用宏汇编结构,并没有固定的标准,大多数情况下,取决于程序员的编程风格 。
2,什么是宏?
答:宏是源程序中一段有独立功能的程序代码 。 它只需要在源程序中定义一次,就可以多次调用它,调用时只需要用一个宏指令语句就可以了 。
3,宏指令是如何定义的?
答:定义宏指令称为宏定义,宏定义是用一组伪操作来实现的,
其格式为:
宏指令名 MACRO [虚参 1,虚参 2,… ]
(宏定义体:一组有独立功能的程序代码 )
ENDM
4,什么是宏调用? 什么是宏展开?
答:在源程序中对宏指令的调用称为宏调用,但对宏指令必须先定义后调用 。 宏展开是用宏定义体取代源程序中的宏指令名,并且用实元取代宏定义中的哑元的汇编过程 。
5,在宏展开时,实参和虚参的个数不等,怎么办?
答:汇编程序不要求实参和虚参的个数必须相等,当实参个数大于虚参个数时,多余的实参不予考虑;当实参个数小于虚参个数时,则多余的虚参作,空,处理 。
6,宏调用中的实参 ( 实元 ) 可以是表达式吗?
答:可以是表达式,还可以是常数,字符串,寄存器,存储单元名以及用寻址方式能找到的地址等,也可以是指令的操作码或操作码的一部分 。 应注意的是,宏展开后,即用实参取代虚参 ( 又称哑元 ) 后,所得到的汇编语句应该是有效的,否则汇编程序将会指示出错 。 在 MASM6
中,还可以用,REQ指定某个参数是必须有的 。
7,& 操作符及 %操作符应如何使用?
答,& 操作符可以把前后两个符号合并形成操作码,操作数或是一个字符串 。 % 操作符把跟在它之后的表达式的值转换成当前基数下的数
,在宏展开期间,用这个数来取代哑元 。
8.,XALL,.LALL和,SALL有什么区别?
答:这 3个伪操作是列表伪操作,用来控制汇编清单中宏展开的列出方式 。 一般在 LST清单中,使用隐含的,XALL
伪操作,它使不产生目标代码的语句在清单中不列出来 。,LALL列出包括注释在内的所有宏展开;,SALL则不列出任何展开信息 。
9,LOCAL伪操作的作用是什么?
答:当宏定义体内的功能代码使用了标号,而在程序中要多次调用该宏定义,此时宏展开后会出现标号的多重定义,这是不能允许的 。 为了解决这个问题,系统提供了
LOCAL伪操作,其格式是,LOCAL 局部标号 1,局部标号 2,
… 汇编程序对 LOCAL伪操作之后的每一个局部标号,在展开时用0000取代局部标号 1,用0001取代局部标号 2,以此类推,这样在展开后的程序中的标号就是唯一的了 。
10,IRP与 IRPC的区别是什么?
答,IRP与 IRPC是不定重复伪操作,它们的不同之处在于自变量的取代方式 。 IRP的自变量表用尖括号括起来,每次重复用自变量表中的一项来取代重复块中的哑元 。 重复次数由自变量表中的自变量个数来确定 。 IRPC的自变量表必须是字符串,重复次数由字符串中的字符个数确定,每次重复用字符串中的一个字符取代重复块中的哑元 。
11,使用条件伪操作的目的是什么?
答:汇编程序根据条件伪操作能把一个程序段包括在源程序中,或排除在源程序之外,也可以根据不同条件选择不同的程序段进入源程序,这为汇编语言编程提供了很大的便利 。
12.什么是宏库?宏库的扩展名是什么?
答:包含若干常用宏定义的文件称为宏库,宏库通常用,MAC或,INC作为扩展名。
13,下面的语句是什么含义?
if1
include macro.mac
endif
答,INCLUDE语句说明该应用程序中要用到宏库
MACRO.MAC中的宏定义,汇编程序将把 MACRO.MAC中的所有宏定义都包含在应用程序中 。 而条件伪操作 IF1语句可使 INCLUDE只在汇编的第一遍扫视期间出现,这样宏库的拷贝将不在汇编清单中出现第八章
1,什么是 I/O端口? CPU使用什么指令与外设进行数据交换?
答,CPU与 I/O设备通过硬件接口或控制器相连接,
这些接口或控制器都有数量不等的端口,这些端口有统一的地址编码,CPU通过这些端口使用输入输出指令 IN、
OUT与外设进行数据交换 。
2,CPU为什么不能用 MOV指令进行 I/O数据传输?
答:在 80x86微机系统中,I/O端口编址在一个独立的地址空间中,它和存储器是完全分离的 。 因此,对于存储器的存取操作使用 MOV指令,而与端口进行信息交换的操作使用专门的 I/O指令,二者不能混淆 。
3,使用查询方式进行输入输出的优缺点是什么?
答:使用查询方式编程可直接在端口级上输入输出信息,数据的传送速度和吞吐量比较高,另外在控制多个设备的 I/O时,可在程序中安排它们的优先级,最先查询的设备,其工作的优先级也最高 。 修改程序中的查询次序,实际上也就修改了设备的优先级,这样以最简便的方法实现了对设备优先级的控制 。 查询方式的缺点主要是在查询过程中,要反复的查询等待,浪费了 CPU原本可执行大量指令的时间,而且由询问转向相应的处理程序的时间较长,尤其在设备比较多的情况下 。
4,什么是中断?
答:计算机在执行程序过程中,遇到需要处理的事件时,暂停当前正在运行的程序,转去执行有关的服务程序,处理完后自动返回原程序,这个过程称为中断 ( interrupt) 。 中断在现代计算机系统中是一种非常重要的技术,输入输出设备和主机交换数据,分时操作,实时系统,多处理机系统,计算机网络和分布式计算机系统都要用到这种技术 。
5,中断分为几类?
答:中断可分为内中断和外中断 。 内中断是由计算机内部原因引起的中断,内中断又称为软中断,它 通 常 由 三 种 情 况 引 起,
(1) 由中断指令 INT引起;
(2)由于 CPU的某些错误而引起,如溢出中断,除法错中断等;
(3) 为调试程序 ( DEBUG) 设置的中断,如单步中断,断点中断;外中断指由外部事件引起的中断,又称为硬中断 。
硬件中断主要有两种来源:
(1) 非屏蔽中断 ( NMI),如电源故障中断,实时钟中断等 。
(2)可屏蔽中断,一般是由于各种外部设备请求 CPU提供服务所引起的中断 。
6,什么是中断类型?
答,80x86中断系统能处理 256种中断,每种中断都安排一个编号,
称之为中断类型 。 256种中断类型号排列为 00~0FFH。
7,中断向量表的作用是什么?
答:为了提高响应中断的速度,通常把所有中断处理程序的入口地址 ( 或称为中断向量 ) 汇集在中断向量表中,当 CPU响应中断时,根据中断源的中断类型号,直接从中断向量表中得到相应的入口地址,并从该地址开始执行中断处理程序 。
8,中断向量表一般安排在存储器的什么位置?
答:存储器最低的 1K字节,地址从 00000 ~ 03FFH存放中断向量 。
中断向量表中的 256项中断向量对应 256种中断类型,每项占用四个字节
,其中两个字节存放中断处理程序的段地址 ( 16位 ),另两个字节存放偏移地址 ( 16位 ) 。
9,某外设能否得到 CPU的中断服务取决于什么控制条件?
答:从外设发出中断请求到 CPU响应中断,有两个控制条件是起决定性作用的:
(1) 该外设的中断请求是否被屏蔽,这个条件由 8259A的中断屏蔽寄存器 ( 端口地址为 21H) 控制;
(2) CPU是否允许响应中断,这由标志寄存器 ( FLAG) 中的中断允许位 IF控制 。 但 CPU不能禁止非屏蔽中断,对于非屏蔽中断 CPU总会响应
。
10,什么是开中断和关中断? 如何控制开中断和关中断?
答:允许 CPU响应外设的中断请求叫做开中断,此时 IF=1;不允许
CPU响应外设的中断请求叫做关中断,此时 IF=0。 有两条指令能控制开,
关中断,STI 开中断 ( IF=1) CLI 关中断 ( IF=0)
11,CPU响应中断的过程是怎样的?
答,( 1) 取中断类型号 N
( 2) 寄存器 ( FLAG) 内容入栈
( 3) 当前代码段寄存器 ( CS) 内容入栈
( 4) 当前指令计数器 ( IP) 内容入栈
( 5) 禁止硬件中断和单步中断 (IF=0,TF=0)
( 6) 从中断向量表中取 4?N的字节内容送 IP,取 4?N+2中的字节内容送 CS
( 7) 转中断处理程序
12,为什么产生中断后,要清除 IF和 TF位?
答:在中断发生时,CPU自动清除了 IF位和 TF位,这样设计的目的是使 CPU转入中断处理程序后,不允许再产生新的中断,包括单步执行 。
如果在执行中断处理程序的过程中,还允许外部的中断,可通过 STI指令再把 IF置为 1。
13,当多个中断源同时向 CPU请求中断时,CPU应如何处理?
答:各种中断源事先安排有中断优先级,当多个中断源同时申请中断时,CPU先比较他们的优先级,,然后从优先级高到优先级低的次序来依次处理各个中断源的中断请求 。
14,中断程序的编写方法是什么?
答:在主程序中要为中断做如下准备工作:
( 1) 设置中断向量 ( 使用 INT 21H的 25H功能 )
( 2) 设置中断设备的屏蔽位 ( I/O端口 21H)
( 3) 开中断 ( STI)
中断处理程序的编写步骤:
( 1) 保存工作寄存器的内容
( 2) 如允许中断嵌套,则开中断 ( STI)
( 3) 中断处理功能
( 4) 关中断 (CLI)
( 5) 送中断结束命令 ( EOI) 给中断命令寄存器 ( I/O端口 20H)
( 6) 恢复工作寄存器内容
( 7) 返回被中断的程序 ( RET)
15,什么是中断嵌套? 处理中断嵌套时应注意什么?
答:中断嵌套是指正在运行的中断处理程序,又被其它中断源中断的情况 。 一个正在执行的中断处理程序,在开中断 ( IF=1) 的情况下,
能被优先级高于它的中断源中断,但如果要被同级或低级的中断源中断,
则必须发出 EOI命令,清除正在执行的中断请求,才能响应同级或低级的中断 。 80X86没有规定中断嵌套的深度 ( 中断程序又被中断的层次 ),但在实际使用时,多重的中断嵌套要受到堆栈容量的限制,所以在编写中断程序时,一定要考虑有足够的堆栈单元来保存多次中断的断点及各寄存器的内容 。
16,什么情况下中断处理子程序需要结束中断 (EOI)? 结束中断指令起什么作用?
答:在外中断处理程序之中或在结束之前,发出中断结束命令 EOI能清除当前正在处理的中断请求,以便能够在该处理程序的过程中或结束之后,再响应同级或低级的中断 。
17,系统提供的 INT 1CH的中断处理程序是怎样的? 为什么?
答:系统提供的 INT 1CH的中断处理程序中只有一条指令,IRET。 实际上这是系统为用户设置的一个中断类型号,用户可以用自己设计的中断处理代码来代替原 1CH程序 。 如果用户有某种定时周期性的工作需要完成,就可以利用系统定时器的中断间隔 ( 约每秒中断 18.2次 ),嵌套调用 1CH的中断处理程序,并用计数的方法控制时间周期 。 如,需要 10秒钟的周期,则将计数值设置为 182。 定时器中断程序每调用一次 INT 1CH,
计数值减 1,当计数值为 0时,说明已到 10秒 。
第九章
1,BIOS中断调用的基本用途是什么? 使用 BIOS调用的好处是什么?
答,BIOS是系统提供的基本输入输出例行程序,它包括系统加电自检,引导装入,主要 I/O设备的处理程序以及接口控制等功能模块 。 BIOS
有两个基本用途:一是给不同系列的微处理器提供兼容的 I/O服务,使程序员在编程时不必考虑不同型号机器的具体差别 。 二是给程序员提供文件化的,直接对硬件进行操作的子功能,程序员可不必了解硬件操作的具体细节 。 所以利用 BIOS功能编写程序简单方便,可读性好,
2,DOS功能调用的用途是什么? 与 BIOS中断调用在使用上有什么差别?
答,DOS是 PC机上最重要的操作系统,它和 BIOS一样包括有近百个设备管理,目录管理和文件管理程序,是一个功能齐全,使用方便的中断例行程序的集合 。 使用 DOS操作比使用相应功能的 BIOS操作更简易,而且对硬件的依赖性更少些 。
3,BIOS和 DOS中断调用的方法是什么?
答,BIOS功能与 DOS功能都是通过软件中断调用的 。 在中断调用前需要把功能号装入 AH寄存器,把子功能号装入 AL寄存器,除此而外,通常还需在 CPU寄存器中提供专门的调用参数 。 一般地说,调用 DOS或 BIOS功能时
,有以下几个基本步骤:
( 1) 把调用参数装入指定的寄存器中;
( 2) 如需功能号,把它装入 AH;
( 3) 如需子功能号,把它装入 AL;
( 4) 按中断号调用 DOS或 BIOS中断;
( 5) 检查返回参数是否正确 。
4,键盘上什么键能产生 ASCII码? 不能产生 ASCII码的键如何识别?
答:键盘上的所有按键的识别采用行列扫描法,即根据对行线和列线的扫描结果来确定闭合键的位置,并通过键盘数据线将闭合键所对应的扫描码 ( 8位 ) 送往主机 。 其中字符数字键给计算机传送一个
ASCII码字符,而扩展功能键产生一个动作,如按下 Home键能把光标移到屏幕的左上角,End键使光标移到屏幕上文本的未尾 。 按动组合控制键能改变其它键所产生的字符码 。
5,什么是通码和断码? 它们的标志是什么?
答:按下键时,产生的扫描码称为通码,放开键时产生的扫描码称为断码 。 其代码的最高位为 0,表示是通码,最高位为 1,表示是断码 。
6,如何判断按动了组合控制键?
答:组合控制键的状态反映在键盘状态字节中,INT 16H的 AH=2
的功能可以把表示组合控制键的状态回送到 AL寄存器 。 按动某键所对应的位为 1,反之为 0。
7,DOS键盘 06功能是读写控制台,控制台是指什么?
答:控制台是指主机及其配置的基本输入输出设备,一般是显示器和键盘 。 INT 21H的 06功能,当 (DL)=0FFH时,输入键盘字符;当
(DL)=0~0FEH时,请求输出设备工作 。
8,DOS功能 AH=1和 AH=7,8都是从键盘输入一个字符,它们有什么不同?
答,INT 21H 功能 07和 08的输入操作与功能 01H相似,不同的是输入字符不回显 。 使用功能 7,输入字符不回显,也不进行 Ctrl_C 或
Ctrl_Break的检查处理 。 08功能不回显字符,但与 01H一样,支持 Ctrl_C
或 Ctrl_Break的中断处理 。
9,程序如何获得功能键和数字组合键的字符码?
答:要接收功能键或数字组合键,程序必须进行两次 DOS调用,第一次调用回送 00,第二次调用回送所按键的扫描码 。 程序如下:
MOV AH,7 ; 第一次 DOS键盘调用 INT 21H
CMP AL,0
JE ISEC ; (AL)=0,则是功能键或数字组合键
···
ISEC,MOV AH,7 ; 第二次 DOS键盘调用
INT 21H ; (AL) = 扫描码
···
10,使用 21H 中断的功能 A输入字符串时应注意些什么?
答:使用 21H 中断的功能 A输入字符串时,特别要注意缓冲区的定义方法 。 缓冲区的第一个字节保存最大字符数,这个最大字符数由用户给出 。 第二个字节是实际输入字符的个数,这个数据由功能 A填入 。 在这两个字节之后,字符串就按字节存入缓冲区,最后一个字节是结束字符串的回车符 0DH,因此整个缓冲区的字节空间应定义为最大字符数
( 包括 Return在内 ) 加 2。 INT 21H的功能 A把实际字符数 ( 不包括
Return) 填入缓区的第二个字节,并保持 DS,DX 指向缓冲区的第一个字节 。 所以,取输入的字符串应从指针 DX+2开始 。
11,在文本方式下,显示屏上的字符是如何表示的?
答:对应显示屏幕上的每个字符,在存储器中由连续的两个字节表示,一个字节保存 ASCII码,另一个字节保存字符的属性 。
12,什么是字符的属性?
答:说明字符显示特性的字节称为字符属性 。 对单色显示,字符属性定义了字符是否闪烁,是否加强亮度,是否反相显示等 。 对彩色显示
,属性字节定义了显示字符 ( 前景 ) 和背景的颜色以及闪烁和亮度等特性 。
13,屏幕上的字符位置和显存地址的关系如何?
答:屏幕上某一字符位置和显存中的偏移地址的关系可由下列公式表示,字符偏移地址 =页偏址 +(( 行号 × 每行字符数 ) +列号 ) × 2
14,使用 INT 21H显示字符串功能要注意些什么?
答:使用 INT 21H显示字符串,一定要在显示串之后加上定界符 $,
因为此功能是用 $作为标记来计算串的长度的 。 另外控制码不能出现在字符串中 。 显示字符串时,如果希望光标能自动换行,那么可在字符串结束之前加上回车和换行的 ASCII码 。
15,用显示字符串功能显示下面定义的字符串有什么问题?
(1) MESS DB ‘DISPLAY THE STRING.’,CR,LF,‘$’
(2) MESS DB ‘DISPLAY THE STRING.$’,0DH,0AH
答,( 1) )字符串中的回车符 (CR)和换行符 (LF)不能识别,必须在字符串中直接写出它们的 ASCII码 ( 用十六进制或十进制表示均可 ),
MESS DB ‘DISPLAY THE STRING.’,13,10,‘$’
另一种方法是用 EQU定义出 CR和 LF的 ASCII值,这时可在字符串中直接使用 CR和 LF。
( 2) 字符串显示后,光标不能移动到下一行开始,因为回车换行符在定界符 $之后,而字符串显示功能把 ’ $’作为显示字符串的结束标记
。
16,用打印机打印出一个字符串应使用什么功能调用?
答:打印机的 I/O中断调用没有提供打印字符串的功能,要打印一个字符串可多次调用 DOS或 BIOS打印单字符的功能,字符串的长度作为循环打印字符的计数控制值 。
17,串行通信有哪两种方式?
答:串行通信有并行和串行两种方式 。 在并行数据传输方式中,8位或 16位的数据同时进行发送或接收 。 在串行通信方式中,通信接口每次由 CPU得到 8位或 16位的数据,然后一位位地串行传送 。
18,在串行通信方式中是如何识别连续不断的数字信号呢?
答:计算机通信规定了数据的格式,对每个要传送的字符都要按规定的格式进行组帧,例如,一个组帧后的字符有 1位起始位,8位字符码和 2位终止位 。 传输由起始位开始,接着的字符从低位到高位顺序送出,
最后 2位终止位表示字符结束 。 在没有传输信号时,1( 高电平 ) 称为标记 ( Mark),0( 低电平 ) 称为间隔 ( space),
19,计算机通信的数据格式是固定的吗?
答:不是,程序员可以通过 DOS命令和 BIOS功能对 COM端口以及数据参数进行初始化 。 使用 DOS的 MODE命令进行初始化的格式为:
MODE COM端口号 ( 1~4),波特率,校验位,数据字长,终止位位数例,MODE COM1,24,O,8,1 为 COM1设置参数为,2400波特率,奇校验,8位字长及 1位终止位 使用 BIOS INT 14H的 0功能可设置串信通信口的初始化参数,
例如:
MOV AL,10100011B ; 2400波特,字长为 8位,1位终止位,无奇偶校验
MOV DX,0 COM1
MOV AH,0 ; 初始化通信口功能 INT 14H ; BIOS调用
。