我的问题不在于BX被用作返回值而不是将其放置在全局内存位置或堆栈上。我观察到这段代码最近在评论中发布。该代码用于使用 BIOS 的实模式鼠标处理程序。保存/恢复FLAGS寄存器状态的两个小函数如下:
EFLAGS_IF equ 0x200 ; Bit mask for IF flag in FLAGS register
; Function: save_if_flag
; save the current state of the Interrupt Flag (IF)
;
; Inputs: None
; Returns: BX = 0x200 if interrupt flag is set, 0 otherwise
save_if_flag:
pushf
pop bx ; Get FLAGS into BX
and bx, EFLAGS_IF ; BX=0 if IF is clear, BX=0x200 if set
ret
; Function: restore_if_flag
; restore Interrupt Flag (IF) state
;
; Inputs: BX = save Interrupt Flag state
; Clobbers: None
; Returns: EFLAGS IF flag restored
restore_if_flag:
test bx, bx ; Is saved Interrupt Flag zero?
jz .if_off ; If zero, then disable interrupts & finish
sti ; Otherwise enable interrupts
ret ; We're finished
.if_off:
cli ; Disable interrupts
ret
我想了解为什么该restore_if_flag
函数会这样做:
restore_if_flag:
test bx, bx ; Is saved Interrupt Flag zero?
jz .if_off ; If zero, then disable interrupts & finish
sti ; Otherwise enable interrupts
ret ; We're finished
.if_off:
cli ; Disable interrupts
ret
而不是POPF
像这样简单地使用:
restore_if_flag:
push bx
popf
ret
为什么要使用STI/CLI显式保存/恢复中断标志,而不是简单地使用POPF恢复以前的 FLAGS 寄存器?