You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编实现鼠标光标移动时遇‘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;
}

关键说明

  1. 函数指针处理:在C代码中完成LoadLibrary和GetProcAddress的调用,比在汇编里处理简单得多,也规避了汇编语法限制。
  2. 调用约定匹配:SetCursorPos是stdcall约定,参数必须从右到左压栈,函数自身会清理栈空间,无需手动执行add esp, 8。
  3. 拼写修正:原代码里的SetCoursorPos是拼写错误,正确函数名是SetCursorPos,否则会无法找到函数地址。

内容的提问来源于stack exchange,提问作者RezaRastgoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:15:54