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

标签 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 Driver Kit (WDK) 似乎不支持它。或者至少我无法使用它!

最佳答案

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

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

关于c - 在 ASM 函数中访问在堆栈上传递的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3571244/

相关文章:

assembly - 减去两个字符

c++ - 在指针中编码其他信息

assembly - Little Man Computer 还适用吗?

c - 如何将 16 位值返回为 64 位值?

go - go中结构的内存分配

c - 当我打印新值时,我得到了以前的浮点值

c - 使用 "if"时重新启动 C 程序

c - 创建邻接矩阵时出现问题

c++ - 在 C 中开始图形界面编程的最佳方法是什么?

c - 为什么编译器会生成一个 push/pop 指令对?