【菜鸟写OS】同是ring0的段,函数调用出错,问原因

wfh_178 2011-02-21 11:09:58
我有4个ring0的段A,B,C,D,有一个ring3的段E.

D段中定义有一个函数供远调用(far call),在A中直接调用此函数没问题,A段结束转入B段然后C段。在B和C中调用都OK。

但是如果从A段进入ring3的E段,再从E段回到ring0的B段,或C段,再调用B段的那个函数,就会出错,引发一个中断。

请问是什么原因啊?或者可能是什么原因啊?
...全文
85 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
shaotine_wu 2011-02-21
  • 打赏
  • 举报
回复
看看每次段之间的函数调用是否都保存好段地址!
wfh_178 2011-02-21
  • 打赏
  • 举报
回复
具体出错的地方在函数中一个访问常量的地方,函数printline在一个专门的函数段中,供其他段far call的


tmp_ dd 0
printline:
push ebp
mov ebp, esp
;push ebx
push esi
push edi

mov ecx, [ebp+16+4];len
mov dword [tmp_],0 ;***Error
.1:
mov eax, [ebp+12+4];row=2
mov edx, 80
mul edx ;
add eax, [ebp+8+4];column
shl eax, 1
mov edi, eax
mov edx, [ebp+20+4]
mov ebx,[tmp_]
mov al, byte [edx+ebx];*** access byte [edx+ebx] error
mov ah, 0ch
mov [fs:edi], ax
inc dword [tmp_]
inc dword [ebp+8+4]
LOOP .1
mov dword [tmp_],0

pop edi
pop esi
;pop ebx
pop ebp
retf


运行到mov dword [tmp_],0就引发中断了,什么原因呢?
renxu350 2011-02-21
  • 打赏
  • 举报
回复
检查段寄存器、GDTR寄存器、LDTR寄存器、段选择子、段描述符表等

21,459

社区成员

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

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