我正在编写一个从C调用的汇编函数,它将调用sidt
机器指令,并将内存地址传递给C函数。根据我对MSVC10生成的代码的分析,我构造了以下代码(YASM语法):
SECTION .data
SECTION .text
GLOBAL _sidtLoad
_sidtLoad:
push ebp
mov ebp,esp
sub esp,0C0h
push ebx
push esi
push edi
lea edi,[ebp-0C0h]
mov ecx,30h
mov eax,0CCCCCCCCh
sidt [ebp+8]
pop edi
pop esi
pop ebx
add esp,0C0h
cmp ebp,esp
mov esp,ebp
pop ebp
ret
这是C函数签名:
void sidtLoad (void* mem);
据我所知,一切都应该有效,我甚至检查了传递给函数的内存地址,并看到它与[ebp + 8]中存储的地址相匹配(字节相反,我认为是字节结果,应该由机器处理)。我已经为sidt
指令尝试了其他参数,例如[ebp + 12],[ebp + 4],[ebp-8]等,但没有运气。
P.S我在外部汇编模块中编写此代码,以便在使用MSVC10定位x64时避免内联汇编。但是,这个特殊的汇编函数/程序正在以x86运行,这样我才能掌握整个过程。
P.P.S我没有使用__sidt
内在因为Windows驱动程序工具包(WDK)似乎不支持它。或者至少我无法使用它!
答案 0 :(得分:2)
您的代码会将IDT写入内存地址ebp+8
,这不是您想要的。相反,你需要像:
mov eax, [ebp+8]
sidt [eax]
答案 1 :(得分:1)
编译:
int sidLoad_fake(void * mem) {
return (int)mem;
}
到程序集,然后查看它从哪里拉出值以放入返回寄存器。
我认为x86_64的前几个参数是在寄存器中传递的。