阅读:2246回复:10
bcb6下call fword ptr [farcall]编译不通,请指教
我看了有关调用门的资料,但我在BCB6下用CALL指令调用它老是出错.
首先:CALL FWORD PTR [farcall]编译出错,说是无效的FWORD 然后:我该用CALL FAR WORD PTR [farcall],编译是过了.但好象不起作用.因为用CALL指令调用调用门要传递48位全指针,但好象CPU只取32位,如此一来调用门的选择子不就取不到了吗? |
|
沙发#
发布于:2004-11-22 18:14
下面代码在BCB5下面编译,BCB6也应该可以吧!?
//--------------------------------------------------------------------------- // // 一般性测试 // void __fastcall TForm1::Ring0BtnClick(TObject *Sender) { DWORD dwCGSelector; WORD FarCall[3]; CreateCallGate(EnterRing0_1,&dwCGSelector); if(dwCGSelector == (DWORD)-1) { Memo1->Lines->Add("Can not found a null GDT Entry."); return; } Memo1->Lines->Add("Selector = " + IntToStr(dwCGSelector)); __try { FarCall[2] = dwCGSelector; _asm CALL FWORD PTR [FarCall] Memo1->Lines->Add("CR0 = " + IntToHex((__int64)CR0Value,8)); Memo1->Lines->Add("CR2 = " + IntToHex((__int64)CR2Value,8)); Memo1->Lines->Add("CR3 = " + IntToHex((__int64)CR3Value,8)); Memo1->Lines->Add("PortVal = " + IntToStr(PortValue)); ReleaseCallGate(); } __except(EXCEPTION_EXECUTE_HANDLER) { ReleaseCallGate(); Memo1->Lines->Add("Exceptoin occur"); } } //--------------------------------------------------------------------------- // 更改IOPL测试 void __fastcall TForm1::IOPLBtnClick(TObject *Sender) { DWORD dwCGSelector; WORD FarCall[3]; CreateCallGate(EnterRing0_2,&dwCGSelector); if(dwCGSelector == (DWORD)-1) { Memo1->Lines->Add("Can not found a null GDT Entry."); return; } Memo1->Lines->Add("Selector = " + IntToStr(dwCGSelector)); __try { FarCall[2] = dwCGSelector; _asm CALL FWORD PTR [FarCall] Memo1->Lines->Add("已经更改IOPL为3,可以在Win32程序中直接使用In/Out指令了。"); ReleaseCallGate(); } __except(EXCEPTION_EXECUTE_HANDLER) { ReleaseCallGate(); Memo1->Lines->Add("Exceptoin occur"); } } |
|
板凳#
发布于:2004-11-22 19:35
我试了还是不行
代码: WORD ccadd[3]; //ccadd[0] = 0; //ccadd[1] = 0; ccadd[2] = (((ULONG)cg-(ULONG)BaseAddress)/sizeof(CALLGATE_DESCRIPTOR)); _asm CALL FWORD PTR [ccadd]; 错误: E2329 Invalid combination of opcode and operands 另外,调用门的选择子是否就是它在GDT或LDT中的索引号 |
|
地板#
发布于:2004-11-22 20:26
估计是BCB6的毛病:(
添加下面这行到CPP中,再编译看看 #pragma inline |
|
地下室#
发布于:2004-11-22 22:30
过拉,给分拉 :D
|
|
5楼#
发布于:2004-11-23 10:08
还有一个问题,我加了#pragma inline后
__asm sgdt gdt 有出现编译不过的情况 typedef struct gdtr { unsigned short Limit; unsigned short BaseLow; unsigned short BaseHigh; } Gdtr_t, *PGdtr_t; Gdtr_t gdt; __asm sgdt gdt 错误为:[Tasm Error] :Argument to operation or instruction has illegal size |
|
6楼#
发布于:2004-11-23 12:03
下面代码在BCB5下面编译,BCB6也应该可以吧!? 能不能把代码给我试一试 |
|
7楼#
发布于:2004-11-23 16:02
调用门的选择子是否就是它在GDT或LDT中的索引号
不错,不过从3位开始 0,1代表RPL,2位为0 从GDT中取,为1从LDT中取,另外在AMD64下所有的门都扩展为16个字节,但SELECTOR还是16位,所以计算起来有所不同,而且在AMD64下的CALLGATE中的堆栈参数拷贝将不被支持,因为本来就是多余的,你本来就完全可以在RING0访问RING3堆栈的. |
|
|
8楼#
发布于:2004-11-23 16:06
另外如果你想实现IO的话,修改IO许可位图比修改IOPL更好,这也是INTEL和AMD在CPU指令手册中的建议.
|
|
|
9楼#
发布于:2004-11-24 17:38
多谢回复,我想我应该找一些相关资料去看看了,有什么好资料请介绍两本?
|
|
10楼#
发布于:2004-11-25 13:33
多谢回复,我想我应该找一些相关资料去看看了,有什么好资料请介绍两本? INTEL和AMD在CPU指令手册 |
|
|