中断嵌套问题. 高分!! 来者有分!!

aprilsnow 2003-07-24 04:42:35
我想在保护模式下模拟多任务, 想了这样的办法, 不知道是不是很蠢:

开启时钟中断, 每当产生一个中断就检查一个全局的标志位, 如果是 0 就跳到任务 A, 如果是 1 就跳到任务 B.

切换之前我做了这些处理:
改变标志位
sti
mov al, 20h
out 20h, al

但是当我这样做我发现只是其中一个任务不停地执行, 并没有跳到另外的任务, 进一步我发现, 时钟中断居然只发生了一次, 请问这是为什么呢??
...全文
131 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
aprilsnow 2003-07-29
  • 打赏
  • 举报
回复
代码太多了, 贴出来太长啊, 易水你说要我提供什么, 我立马贴出来.
aprilsnow 2003-07-28
  • 打赏
  • 举报
回复
Areslee(易水) 帮忙啊, 我不行了!
atm2001 2003-07-28
  • 打赏
  • 举报
回复
GZ,等活动好大脑再说吧...
Areslee 2003-07-28
  • 打赏
  • 举报
回复
你给的信息太少,偶也想不出来啊
aprilsnow 2003-07-25
  • 打赏
  • 举报
回复
可是现在又遇到了一个问题:

我在 IDT 中建立了一个任务门:

LABEL_IGATE_INT_020H: Gate SelectorTSSClkHdlr, 0, 0, DA_TaskGate + DA_DPL0

其中 SelectorTSSClkHdlr 指向一个 TSS, 可是时钟中断时居然什么也没有发生, 我把这一行复制到 GDT 中, 在代码中调用 jmp SelectorTSSClkHdlr:0 发觉可以执行(其中SelectorTSSClkHdlr 是任务门的选择子), 这说明任务门本身是没问题的.

我又把 IDT 中的任务门换成了一个中断门指向一段全局的代码, 发觉也是可以到达的, 这说明时钟中断已经开启了, 也是没问题的.

我于是感到非常奇怪, 什么都没有问题, 为什么中断时什么都不发生呢? 我还有什么地方做错了???

郁闷啊!!!...
aprilsnow 2003-07-25
  • 打赏
  • 举报
回复
我决定换一个方法了.

我决定用任务门做中断处理. 然后通过改变堆栈中返回值然后iretd的方法跳到不同的任务.

大家觉得怎么样?
Areslee 2003-07-25
  • 打赏
  • 举报
回复
是不是有其他代码修改了iFlagMultiTask?
aprilsnow 2003-07-25
  • 打赏
  • 举报
回复
To Areslee(易水)

杨季文的例子? 是那本黑皮清华版的书吗? 哪个例子呀?

我的TSS应该是对的, 因为其中一个任务不停的执行, 只是切换不到另一个任务而已.



To junhli(蝙蝠侠)

清零时钟计数器是什么意思啊? 怎么做啊?
zuolihua 2003-07-24
  • 打赏
  • 举报
回复
up
junhli 2003-07-24
  • 打赏
  • 举报
回复
你有没有清零时钟计数器?如果没有清零,那就不会有第二次的中断产生
Areslee 2003-07-24
  • 打赏
  • 举报
回复
TSS设对了没?看看杨季文的例子吧
aprilsnow 2003-07-24
  • 打赏
  • 举报
回复

我的时钟中断处理程序如下:


push eax ; 保护现场
push ds
push es
push ecx

; 下面演示多任务 ----------------------
add dword [iCouterMultiTask], 2
mov ax, SelectorVideo
mov es, ax
mov ah, 0Ch ; '0Ch': 0000: 黑底 1100: 红字
mov al, 'I'
mov edi, (80 * 2 + 0) * 2 ; 第 2 行, 第 0 列
add edi, dword [iCouterMultiTask]
stosw

mov ax, SelectorData
mov ds, ax
cmp byte [iFlagMultiTask], 0
jnz .MultiTask_p2
.MultiTask_p1:
mov byte [iFlagMultiTask], 1
pop ecx ; 恢复现场
pop es ; 恢复现场
pop ds ; 恢复现场
sti
mov al, 20h ; 通知中断控制器中断处理结束
out 20h, al
pop eax
jmp SelectorTSSP1:0 ; [iFlagMultiTask] == 0
.MultiTask_p2:
mov byte [iFlagMultiTask], 0
pop ecx ; 恢复现场
pop es ; 恢复现场
pop ds ; 恢复现场
sti
mov al, 20h ; 通知中断控制器中断处理结束
out 20h, al
pop eax
jmp SelectorTSSP2:0 ; [iFlagMultiTask] != 0

; 多任务演示完毕 ^^^^^^^^^^^^^^^^^^^^^^


21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧