访问ASM函数中堆栈上传递的参数

时间:2010-08-26 00:26:11

标签: c assembly 64-bit

我正在编写一个从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)似乎不支持它。或者至少我无法使用它!

2 个答案:

答案 0 :(得分:2)

您的代码会将IDT写入内存地址ebp+8,这不是您想要的。相反,你需要像:

mov eax, [ebp+8]
sidt [eax]

答案 1 :(得分:1)

编译:

int sidLoad_fake(void * mem) {
    return (int)mem;
}

到程序集,然后查看它从哪里拉出值以放入返回寄存器。

我认为x86_64的前几个参数是在寄存器中传递的。