计组习题的那些事(3)

今天起床,感觉十分通透啊,是个不错的日子!!!

我不知道明天是否会更好,但是我期望明天会更好, 并且为了明天会更好而令现在的每一分每一秒更好,如此便是我对明天会更好这个争论的回答了。

注意这一章一般也不会考察程序的书写,重点反而是整个流程要清楚。

问题:

一旦输入数据寄存器被读取,接口电路中的输入状态位就会被清空。为什么要这么做?


答案:

为了确保给定的数据只被读取一次。


解释:

接口电路中的输入状态位通常用于指示数据是否已准备好进行读取。当数据被成功读取后,清空输入状态位的目的是防止重复读取相同的数据。这样可以确保每次读取时,程序或设备获取的是最新的数据,并避免因状态位未清空而导致的错误或多次读取相同数据的情况。

问题:

子程序与中断服务程序的区别是什么?


答案:

子程序是由程序指令调用的,用来执行调用程序所需的功能。中断服务程序则是由外部事件(如输入操作或硬件错误)触发的,它所执行的功能可能与当前正在执行的程序无关。因此,中断服务程序的执行不能影响正在执行的程序的任何数据或状态信息。


解释:

  1. 子程序:
    • 调用方式: 子程序是通过程序中的调用指令被调用的,通常是程序为了完成某个特定功能或计算时临时跳转到子程序。
    • 执行时机: 子程序在程序的控制流中被调用执行,调用之后完成任务并返回到原来的位置继续执行。
    • 作用: 子程序的执行内容通常与当前程序密切相关,是程序的一部分,返回后不会影响程序的运行状态。
  2. 中断服务程序:
    • 触发方式: 中断服务程序是由硬件或外部事件(如输入操作或硬件错误)自动触发的。
    • 执行时机: 当发生中断事件时,处理器会暂停当前程序的执行,转而执行中断服务程序,处理完中断事件后再返回原程序继续执行。
    • 作用: 中断服务程序的执行内容通常与当前程序无关,因此需要在执行过程中保存当前程序的状态(如寄存器内容)以保证程序恢复时不受影响。

总结:

  • 子程序是由程序主动调用的,用于执行特定功能。
  • 中断服务程序则是由硬件或外部事件触发的,用于处理外部事件,在处理时必须保存当前程序的状态。

问题:

在图 3-4 中的第一条 And 指令中,在检查 KIN 标识时使用了立即值 2,但在图 3-5 中的 TestBit 指令中,检查b KIN 标识时却使用了立即值 1。请解释两者的区别。


答案:

在 And 指令中,立即值 2 代表一个二进制值,而在 TestBit 指令中,立即值 1 指定了 32 个比特中的一个位置(即 b1)。


解释:

  1. And 指令中的立即值 2:
    • 立即值 2 在二进制中表示为 10。在 And 操作中,立即值 2 用作掩码,表示检查 KIN 标识的特定位。例如,2 在二进制中是 10,这意味着仅检查第二位(从右到左,b1)。这种方式通常用于操作二进制值中的特定位。
  2. TestBit 指令中的立即值 1:
    • 在 TestBit 指令中,立即值 1 指定要检查的位的位置。1 代表检查 b1 位(即第二位)。TestBit 指令通常用于检查给定二进制值的特定位是否为 1。这里的立即值 1 表示我们关心的是第二个比特位(b1)。

区别总结:

  • And 指令 中,立即值 2 表示一个二进制值,作为位掩码使用,帮助确定要检查或操作的二进制位(如 b1)。
  • TestBit 指令 中,立即值 1 代表具体的比特位置(b1),用于测试该位置的位是否为 1。

问题 3.6:

在图 3-9 中,主程序的 START 段最后才设置 PS 中的中断允许位,这是为什么?该顺序对 START 中之前的操作是否有影响?为什么?

image-20241207131017532

答案:

设置中断允许位(interrupt-enable bit)在 START 段的最后是为了确保在处理器初始化期间不会受到中断干扰。此顺序不会影响 START 中之前的操作,因为在设置中断允许位之前,程序已经完成了中断初始化。


解释:

在程序初始化过程中,特别是当处理中断相关设置时,程序需要确保所有的中断系统设置完毕,防止在初始化过程中被中断打断。如果在初始化过程中已经允许中断,可能会导致程序执行过程中途被中断,从而影响初始化的顺序或结果。通过将设置中断允许位放在最后,可以确保在完成初始化之后才允许中断,避免初始化过程中被中断的风险。因此,这个顺序保证了程序初始化的完整性。


问题 3.7:

即使有多个中断请求等待处理,图 3-9 中每次进入 I/O 操作时仍只能处理一个请求。以上说法是正确还是错误?说明理由。


答案:

错误。所有在 IPENDING 寄存器中指示的中断请求都会被服务。


解释:

在图 3-9 中,处理器的中断控制机制是可以处理多个中断请求的。虽然 I/O 操作可能一次只处理一个请求,但系统会根据 IPENDING 寄存器中的标志,识别并处理所有待处理的中断请求。IPENDING 寄存器指示了哪些中断请求是等待处理的,当处理器完成当前的中断处理后,会继续处理其他的中断请求,因此不能说每次只能处理一个请求。


问题 3.8:

一个用户程序可以在每次除法操作前立刻检查除数是否为 0,然后采取适当的动作,而不去调用操作系统。给出理由说明为什么在用户程序中除数为 0 的实际情况下,允许产生一个异常中断是不是最好的。


答案:

虽然用户程序可以检查除数是否为 0 并采取相应措施,但让系统通过异常中断处理除数为 0 的情况更为高效,因为这可以避免程序中重复的检查逻辑,并且让操作系统集中管理错误。


解释:

在用户程序中,每次进行除法操作时,都检查除数是否为 0,可能会增加代码复杂度和运行时间。如果每个程序都必须进行这种检查,编程和维护都变得更困难。而通过在硬件层面或操作系统层面捕获除数为 0 的异常并处理,可以将这项任务集中化,由操作系统高效地进行异常处理,这样不仅简化了用户程序,还能确保异常处理的一致性和正确性。因此,将除数为 0 的处理交给操作系统通过异常中断来完成,是一种更好的做法。