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

MinGW 64位Windows环境下Intel语法内联汇编文档求助

MinGW x86-64 Intel语法内联汇编修正方案

先给你修正后的可编译代码,再讲关键语法规则:

void __declspec(naked) SwapTrampoline(){
    asm(
        "pushfq\n"
        "call openGlSwapBufferHook\n"
        "popfq\n"
        "jmp 0x6506CD2B\n"
    );
}

// 另一段修正后的示例代码
void __declspec(naked) AnotherTrampoline(){
    asm(
        "jmp 0x7FF94E1C0B8\n"
        "mov [rsp+0x10], rsi\n"
    );
}

核心语法修正点

  • 十六进制立即数:MinGW的Intel语法不支持h后缀(这是MASM专属写法),必须用0x前缀,比如0x7FF94E1C0B8而不是7FF94E1C0B8h。
  • 内存偏移写法:x86-64中栈操作的偏移以字节为单位,[rsp+10]要写成[rsp+0x10](十六进制)或[rsp+16](十进制),不能省略前缀直接写数字。
  • 指令格式:asm块里的每条指令需要用\n分隔,或者单独用双引号包裹,确保汇编器能识别独立指令。
  • naked函数约束:__declspec(naked)会让编译器不生成函数的 prolog/epilog 代码,你写的汇编必须完全符合x86-64 Windows调用约定(比如栈对齐、寄存器保存规则),否则会触发程序崩溃。

MinGW Intel语法关键规则

MinGW用的是GNU汇编器(GAS)的Intel语法变体,和传统MASM有差异,核心规则包括:

  • 立即数必须加0x前缀,禁止用h后缀;
  • 内存操作数的基址+偏移写法为[reg+offset],偏移需带0x前缀(十六进制)或直接写十进制数;
  • 寄存器名直接写rsp、rsi即可,不需要加MASM里的@前缀;
  • 指令大小写不敏感,建议统一风格提升可读性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:21:11