首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么BIOS中断8(计时器)在qemu-system-x86_64上不工作

为什么BIOS中断8(计时器)在qemu-system-x86_64上不工作
EN

Stack Overflow用户
提问于 2021-01-06 16:59:00
回答 1查看 117关注 0票数 2

我认为BIOS中断8(计时器)应该每秒出现18.2次,但在qemu上却不是这样。请参见以下示例:

代码语言:javascript
运行
复制
$ cat c.asm

init:
    .segments:
        mov ax, 0x07C0
        mov ds, ax
        mov ax, 0
        mov fs, ax
    .interrupt:
        mov [fs:0x08*4], word timer
        mov [fs:0x08*4+2], ds

main:
    hlt
    jmp main

timer:
    mov ah, 0x0e
    mov al, 0x41
    int 0x10
    iret

times 510-($-$$) db 0
dw 0xaa55
代码语言:javascript
运行
复制
$ nasm -f bin c.asm -o c.bin && qemu-system-x86_64 c.bin

出现Qemu窗口,只显示一个'A‘,而不是连续显示。

如果我希望一次又一次地中断8的到来,我的代码出了什么问题。

我使用的是nasm 1.14.02、qemu 4.2.1和ubuntu 20.04。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-06 22:19:06

使其重复显示'A‘的关键更改是向端口20h上的PIC发送中断结束信号。如果你使用中断1Ch或链到另一个中断08h处理程序,这在你的代码中是不需要的。但是,如果您完全替换了中断08h处理程序,那么它就是。PIC不会发送另一个IRQ #0,直到前一个得到EOI。正因为如此,我才能重现你的问题。

我所做的其他更改是确保在进入main循环之前设置中断标志(使用sti指令),并保留中断08h处理程序中的所有寄存器(如果您的代码是机器上唯一运行的,则这是可选的)。

代码语言:javascript
运行
复制
init:
    .segments:
        mov ax, 0x07C0
        mov ds, ax
        mov ax, 0
        mov fs, ax
    .interrupt:
        mov [fs:0x08*4], word timer
        mov [fs:0x08*4+2], ds

        sti
main:
    hlt
    jmp main

timer:
        push ax
        push bx
        push bp
    mov ah, 0x0e
    mov al, 0x41
    int 0x10
        mov al, 20h
        out 20h, al
        pop bp
        pop bx
        pop ax
    iret

times 510-($-$$) db 0
dw 0xaa55

像这样运行:

代码语言:javascript
运行
复制
$ nasm test.asm
$ timeout 10 qemu-system-x86_64 test -curses
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65592858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档