steven_kane
驱动牛犊
驱动牛犊
  • 注册日期2002-12-22
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1703回复:8

关于调用门的一个问题(汇编高手请进来)

楼主#
更多 发布于:2003-12-10 21:51
之前阅读了一段 向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]


}
steven_kane
驱动牛犊
驱动牛犊
  • 注册日期2002-12-22
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-16 21:12
谢谢指点,小弟感激不尽
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2003-12-16 20:30
intel IA32 software developer manual vol 3
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-12-16 12:41
教程有很多啊。《80x86保护模式系列教程》--李彦昌
就不错。
steven_kane
驱动牛犊
驱动牛犊
  • 注册日期2002-12-22
  • 最后登录2009-10-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-15 20:58
多谢各位高手的指点,每一位的回答都让我受益匪浅,我只好分开给分了!^_^ 还请继续帮助 :
   什么是非一致性代码?清举个例子
   CPL , DPL是怎样定义的,有什么书介绍这些
   FS,ES ,GS,都在做段选择器吗?如果不是,那他们是做什么的?

  


    
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2003-12-12 19:30
 我们一般用的都是是非一致性代码,所以可以从RING3-RING0,
在一致代码段中对象代码段DPL必须为0,,其用处主要可以被RING3,RING0所共享,并且在调用的时候在各自的特权级运行。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
RED_spring
驱动中牛
驱动中牛
  • 注册日期2002-07-28
  • 最后登录2016-11-06
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望19点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-12-12 12:45
这样调用非一致性代码段也可以吗? CPL=3 DPL=0 啊。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
7楼#
发布于:2003-12-11 12:58
很简单,调用的时候,先GDT上找到CALLGATE描述符,然后用该描述符中的SEL:OFFSET放入CS:EIP中,如果有参数的话,再将RING3参数拷贝到RING0堆栈,切换代码至RING0执行。。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
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返回。

------------

游客

返回顶部