我正在编写一个从 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 Driver Kit (WDK) 似乎不支持它。或者至少我无法使用它!
最佳答案
您的代码会将 IDT 写入内存地址 ebp+8
,这不是您想要的。相反,你需要这样的东西:
mov eax, [ebp+8]
sidt [eax]
关于c - 在 ASM 函数中访问在堆栈上传递的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3571244/