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
相关产品推荐
相关产品推荐

