我的问题是,为什么在下面的装配顺序中需要禁止中断?中断是不是只保存所有寄存器并在完成后将它们带回来,所以不会丢失数据?
cli
inb (%dx), %al
orb $0x01, %al
outb %al, (%dx)
sti
答案 0 :(得分:3)
中断不会只保存所有 注册并在它之后将它们带回来 完成了,所以没有数据丢失?
是的,它会的。但是,某些I / O端口是时间敏感的,如果读/写序列中断,则可能无法正常工作。或者中断以某种方式影响端口(例如,您正在读取UART寄存器并且字符到达,触发串行中断并更改UART状态)。或者您可能正在写入与中断处理有关的端口(例如中断控制器)。如果没有更多细节,很难说它是否真的有必要,但总的来说,安全比抱歉更好。
答案 1 :(得分:0)
在这种特殊情况下,您正在从端口读取值,更改一位,然后再将其写出。要作为读 - 修改 - 写周期,代码必须不间断。
否则,如果在此序列期间发生另一个中断,并更改另一个位,则在继续时将覆盖该更改。不好!</ p>