2011-05-09 27 views
2

我的问题是,为什么在下面的装配顺序中需要禁止中断?中断不会保存所有的寄存器并在完成后将它们恢复,所以不会丢失数据?中断窗口

cli 
inb (%dx), %al 
orb $0x01, %al 
outb %al, (%dx) 
sti 

回答

3

不会中断只是保存所有 寄存器将其带回它 完成后,因此没有数据丢失?

是的,它会。但是,某些I/O端口对时间敏感,如果读/写序列中断,则可能无法正常工作。或者中断以某种方式影响端口(例如,您正在读取UART寄存器并且字符到达,触发串行中断并更改UART状态)。或者你可以写入一个本身与中断处理有关的端口(例如中断控制器)。没有更多的细节,很难说是否真的有必要,但总的来说,最好是安全而不是抱歉。

+0

这很有道理,谢谢一堆。 – jn1kk 2011-05-09 15:11:34

0

在这种特殊情况下,您正在读取端口的值,更改一位,然后再次写出。要作为读 - 修改 - 写周期工作,代码必须是不间断的。否则,如果在此序列中发生另一个中断,并更改另一位,则在继续时将覆盖该更改。不好!