汇编实现鼠标光标移动时遇‘mov内存引用过多’编译报错求助
解决Windows内嵌汇编移动鼠标的编译错误
错误根源分析
你遇到的"too many memory reference for mov"错误,核心是汇编指令语法和Windows API调用逻辑出错:
mov eax, [GetProcAddress(LoadLibrary("user32.dll"),"SetCoursorPos")]完全不符合x86汇编语法:GetProcAddress是C函数,不能直接作为内存操作数嵌套在mov指令的方括号里,x86的mov指令不允许这种需要函数调用的表达式作为内存引用。- 字符串引号嵌套错误:代码里的
"user32.dll"和"SetCoursorPos"与外层汇编字符串引号冲突,会导致编译时字符串解析混乱。 SetCursorPos(注意你拼写错误,是Cursor不是Coursor)的调用约定是stdcall,要求参数从右往左压入栈中,而非存在ebx/ecx寄存器里。
修正后的代码实现
正确的做法是先在C代码中获取SetCursorPos的函数指针,再通过内嵌汇编调用,避免在汇编里直接处理API加载逻辑:
#include <windows.h> int main() { // 定义函数指针类型,匹配SetCursorPos的stdcall调用约定 typedef BOOL(WINAPI* SetCursorPosFunc)(int x, int y); // 加载user32.dll并获取函数地址 SetCursorPosFunc pSetCursorPos = (SetCursorPosFunc)GetProcAddress( LoadLibraryA("user32.dll"), "SetCursorPos" ); if (pSetCursorPos) { int xPos = 100; // 目标X坐标 int yPos = 200; // 目标Y坐标 // 内嵌汇编调用函数,遵循stdcall参数传递规则 __asm { push yPos // 先压入第二个参数(y坐标) push xPos // 再压入第一个参数(x坐标) call pSetCursorPos // 调用函数指针 } } return 0; }
关键说明
- 函数指针处理:在C代码中完成
LoadLibrary和GetProcAddress的调用,比在汇编里处理简单得多,也规避了汇编语法限制。 - 调用约定匹配:
SetCursorPos是stdcall约定,参数必须从右到左压栈,函数自身会清理栈空间,无需手动执行add esp, 8。 - 拼写修正:原代码里的
SetCoursorPos是拼写错误,正确函数名是SetCursorPos,否则会无法找到函数地址。
内容的提问来源于stack exchange,提问作者RezaRastgoo
相关产品推荐
相关产品推荐

