gpt4 book ai didi

c - 进行中断链接分配

转载 作者:太空宇宙 更新时间:2023-11-04 02:17:41 24 4
gpt4 key购买 nike

正如标题所说,我正在尝试进行中断链接。我正在寻找的是,当调用定时器中断(IRQ 0)并且中断处理程序(ISR)完成时,它会执行我的代码。我正在尝试在 Assembly、C 或任何允许我这样做的语言上这样做。我在这个 page 上找到了一个例子但它不适用于 TASM。你能帮我解决这个问题吗,或者我在哪里可以找到这方面的信息?谢谢。 :D

最佳答案

我不再使用它了,只是想再次使用可能是我在组装的第一步中使用的组装器:

.186
.MODEL TINY, C

.code
ORG 100h

Entry:
; Install handler
push ds
xor cx, cx
mov ds, cx
mov ax, ds:[8*4]
mov dx, ds:[8*4+2]
cli
mov ds:[8*4], OFFSET InterruptHandler
mov ds:[8*4+2], cs
pop ds
mov word ptr [OldIntVect], ax
mov word ptr [OldIntVect+2], dx
sti

; Wait for the user to press a key. In the meantime you should see lots of wildcards!
xor ax, ax
int 16h

; Restore original handler
mov ax, word ptr [OldIntVect]
mov dx, word ptr [OldIntVect+2]
push ds
xor cx, cx
mov ds, cx
cli
mov ds:[8*4], ax
mov ds:[8*4+2], dx
sti
pop ds

; Exit to DOS
int 20h

PROC MyHandler

mov ah, 0Eh
mov al, '*'
int 10h
ret
ENDP


InterruptHandler:
pushf
call cs:[OldIntVect]
cmp [busy], 0
jne ExitHandler ; If jumps then the timer was faster than the time it takes for MyHandler to complete

mov cs:[busy], 1
pusha
call MyHandler ; Other options are using a pointer to function or just inlining the code here.
popa
mov cs:[busy], 0

ExitHandler:
iret

OldIntVect dd ?
busy db ?

END Entry

在 WinXP(32 位)下测试:

>tasm timer.asm
Turbo Assembler Version 1.01 Copyright (c) 1988, 1989 Borland International

Assembling file: TIMER.ASM
Error messages: None
Warning messages: None
Remaining memory: 481k


>tlink /t timer.obj
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International

>timer
***************************

但这当然只适用于 DOS 环境(DOSBox、Windows 32 位版本等),最多对引导加载程序进行一些调整。

无论如何,感谢你给我的美好时光让我重振这一切:P

关于c - 进行中断链接分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5111947/

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