Мой вопрос не в том, что 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, а не просто восстанавливать предыдущий регистр FLAGS с помощью POPF?
pushf
иpopf
используются для копирования и вставки, как код резака для печенья, который оказался в коде, работающем через расширители DOS, этот код в конечном итоге не работал должным образом, и многие обходные пути (взломы) не всегда успешны. Что касается расширителей DOS, именно по этой причине я упомянул DPMI в ответе. - person Michael Petch   schedule 26.02.2019