我是 x86 汇编的初学者。我已经编译了一个小型操作系统(用 nasm 编译到软盘上),但我遇到了一些麻烦。该操作系统旨在打开 Caps、Scroll 和 Num Lock,然后等待半秒,然后关闭它们,然后等待半秒。然后它重复。
问题出在线路cli
和sti
. 这应该启用以确保原子性,因此时间对于Wait_Clk_Ticks
. 当这些线被放入程序时,灯会亮起,但仅此而已。当他们不在程序中时,灯会按应有的方式闪烁。这段代码有什么问题?
jmp
代码中的函数是否会Wait_Clk_Ticks
导致中断?我被告知cli
并sti
用于禁用硬件中断。是否jmp
会导致硬件中断?
代码:
; blinklights.asm
[BITS 16]
[ORG 0x7C00]
jmp Code_Start
Switch_Kbd_Leds:
push dx ; Store current values.
push ax
mov dx, 60h ; '60h' is the 'kbd' port value.
mov al, 0EDh ; '0EDh' is 'set/reset leds' function.
out dx, al ; Then output to the port.
pop ax ; Get the setting from the stack.
out dx, al ; Output this data to the port.
pop dx ; Restore 'dx'.
ret ; Return.
Wait_Clk_Ticks:
cli
mov ax, 0
mov ds, ax
mov bx, [46Ch]
WaitForAnotherChange:
NoChange:
mov ax, [46Ch]
cmp ax, bx
je NoChange
mov bx, ax
loop WaitForAnotherChange
sti
ret ; Return.
Code_Start:
mov al, 00000111b
call Switch_Kbd_Leds
mov cx, 9
call Wait_Clk_Ticks
mov al, 00000000b
call Switch_Kbd_Leds
mov cx, 9
call Wait_Clk_Ticks
jmp Code_Start
End:
jmp $ ; Run this line over and over again- stops excecution.
times 510-($-$$) db 0 ; Fill the rest of the 512 byte sector with zeros
dw 0xAA55 ; Boot magic number
我在 IBM 8307 上使用 USB 键盘运行此代码。
谢谢你的帮助 :)