有这样一道360笔试题:
下述哪种情况会提出中断请求?
A.在键盘输入过程中,每按一次键
B.两数相加结果为零
C.计算结果溢出
D.一条系统汇编指令执行完成
【答 案】A
【知识点】中断方式
【解 析】本题考查中断请求事件的类型。从大的方面来说,有两种情况会“中断”正在CPU上执行的程序。一种是正在执行的指令发生了某种特定的“异常”事件,例如,对指令译码时发生“非法操作码”、取数时发生“缺页”或“访问越权”等,这些事件的发生会导致CPU无法继续执行当前程序,因而CPU会“中断”当前程序而转到特定的异常处理程序执行;另一种情况是CPU外部的I/O子系统发生了某些特殊的事件,如打印机缺纸、DMA传送结束等。这些事件的发生需要CPU进行相应的处理,因而I/O子系统会向CPU发出“中断请求信号”。通常,前一种情况称为“内部异常”,后一种情况称为“外部中断”。
根据题干的描述,笔者认为考题考查的是哪些选项属于“外部中断”事件。显然,选项 A是正确的。对于目前主流的非编码键盘,从键盘输入到主机的键盘接口中的信息是按键的扫描码(即位置码),键盘接口每接受到一个扫描码,就会向CPU发送一个键盘中断请求信号,CPU响应该请求信号后,会调出键盘中断服务程序执行,在该中断服务程序中,将从键盘接口中取出扫描码并转换为按键的ASCII,存入键盘缓冲区。
选项B是错误的,因为两数相加结果为零,不会导致CPU无法继续执行程序,它既不是内部异常事件,更不是外部中断事件。
选项C是错误的,因为计算结果溢出是由CPU执行指令得到的一个结果,而不是由CPU外部的I/O子系统发出的中断请求事件。结果溢出是否作为内部异常,在不同的处理器架构中有不同的处理方式。例如,MIPS架构中,区分无符号整数加/减运算指令和带符号整数加/减运算指令,前者不可能产生溢出异常,而后者在发生溢出时会产生溢出异常。Intel x86架构中,并不区分无符号整数加/减运算指令和带符号整数加/减运算指令,加/减运算指令执行后,所产生的标志信息(如进位/借位标志CF、符号标志SF、零标志ZF、溢出标志OF)都会记录在标志寄存器EFLAGS中,是否产生溢出异常,需要由INTO指令来触发,当执行到INTO指令时,会根据相应标志位OF的取值情况决定是否产生溢出异常。
选项D是错误的。首先,“一条系统汇编指令执行完成”这句话本身有问题,虽然汇编指令与机器指令(通常简称为指令)一一对应,但CPU不能直接执行汇编指令,而且“系统汇编指令”这个概念也是不存在的。其次,若把选项D的意思理解成“一条指令执行完成”,那么结论也是错误的,因为CPU总是一条指令接着一条指令执行,并不会因为一条指令的正常执行完成,而引起“内部异常”或“外部中断”。
本文已收录于《横扫Offer--程序员招聘真题详解700题》一书,开点工作室著,清华大学出版社。更多程序员笔试面试真题的精彩详解请参见该书。
为保证书稿质量,作者及出版社在编写完成后经过反复多次的审核、校对和修改,力求为读者奉献一本内容详实、严谨、准确、精美的实用宝典,因此上市时间有所延后,望各位读者谅解。该书目前已进入印刷环节,预计8月下旬各大网上书店开始发售。我们将会在第一时间通知该书的上市购买信息,并将举行评论送书活动,以感谢各位读者的支持。详细情况请持续关注微信公众账号“开点工作室”。