gpt4 book ai didi

assembly - CLI 和 STI 不起作用

转载 作者:行者123 更新时间:2023-12-04 04:54:02 32 4
gpt4 key购买 nike

我是 x86 汇编的初学者。我已经编译了一个小型操作系统(用 nasm 编译到软盘上),但我遇到了一些麻烦。这个操作系统的目的是打开大写、滚动和数字锁定,然后等待半秒钟,然后关闭它们,然后等待半秒钟。然后它重复。

问题出在 cli 行和 sti .应该启用此功能以确保原子性,因此 Wait_Clk_Ticks 的时间是正确的.当这些行被放入程序时,灯会亮起,但仅此而已。当它们不在程序中时,指示灯会按应有的方式闪烁。这段代码有什么问题?

jmp Wait_Clk_Ticks 中的函数导致中断的代码?我被告知 clisti用于禁用硬件中断。是否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 键盘运行此代码。

谢谢你的帮助:)

最佳答案

难道你不认为cli也禁用了时钟中断,计时器停止了吗?

关于assembly - CLI 和 STI 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17037142/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com