阅读:1703回复:8
关于调用门的一个问题(汇编高手请进来)
之前阅读了一段 向WIN2000添加 callgate的代码 ,
以下是在应用层的调用代码: 请问_asm call fword ptr [farcall]这句话是什么意思? void main() { WORD farcall[3]; farcall[0] = 0x0; farcall[1] = 0x0; farcall[2] = 0x4b; //在我机器上,添加 CALLGATE 的选择子为 4BH _asm call fword ptr [farcall] } |
|
沙发#
发布于:2003-12-16 21:12
谢谢指点,小弟感激不尽
|
|
板凳#
发布于:2003-12-16 20:30
intel IA32 software developer manual vol 3
|
|
|
地板#
发布于:2003-12-16 12:41
教程有很多啊。《80x86保护模式系列教程》--李彦昌
就不错。 |
|
地下室#
发布于:2003-12-15 20:58
多谢各位高手的指点,每一位的回答都让我受益匪浅,我只好分开给分了!^_^ 还请继续帮助 :
什么是非一致性代码?清举个例子 CPL , DPL是怎样定义的,有什么书介绍这些 FS,ES ,GS,都在做段选择器吗?如果不是,那他们是做什么的? |
|
5楼#
发布于:2003-12-12 19:30
我们一般用的都是是非一致性代码,所以可以从RING3-RING0,
在一致代码段中对象代码段DPL必须为0,,其用处主要可以被RING3,RING0所共享,并且在调用的时候在各自的特权级运行。 |
|
|
6楼#
发布于:2003-12-12 12:45
这样调用非一致性代码段也可以吗? CPL=3 DPL=0 啊。
|
|
7楼#
发布于:2003-12-11 12:58
很简单,调用的时候,先GDT上找到CALLGATE描述符,然后用该描述符中的SEL:OFFSET放入CS:EIP中,如果有参数的话,再将RING3参数拷贝到RING0堆栈,切换代码至RING0执行。。。。。。
|
|
|
8楼#
发布于:2003-12-10 23:26
这是CPU规定的,说白了就是不同特权级之间的转换只能使用FAR CALL,而不能使用CALL。
================= 安装调用门之后就要调用它了。一个基本的调用不适用与这种定位于Ring0而实际在Ring3的callgate程序。我们需要进行\"far call\" (inter-privilege level call), 因此为了调用callgate,必须这样做: short farcall[3]; // // 根据\"IA-32 Intel Architecture Software Developer's Manual // (Volume 2) (see [5])\"规范,farcall[0->1]忽略。 // farcall[0] = 0; farcall[1] = 0; farcall[2] = 调用门选择子。 _asm CALL FWORD PTR [farcall] // 进行长转移到Ring0 // 在Ring0程序里边通过指令RETF返回。 ------------ |
|