使用ml/ml64汇编MASM代码后与GCC编译链接架构不匹配问题求助
最优解决方法:使用Visual Studio原生命令行工具链
你已安装完整VS环境,无需额外下载任何依赖,完全复用现有32位MASM代码,操作步骤如下:
- 打开x86 Native Tools Command Prompt for VS 2019(可从开始菜单Visual Studio 2019的工具目录找到,也可手动执行VS安装路径下的
VC\Auxiliary\Build\vcvars32.bat初始化32位编译环境) - 汇编MASM代码:执行
ml /c /coff fib.asm,其中/c表示仅汇编不执行链接,/coff生成标准COFF格式目标文件 - 编译链接C++项目:执行
cl main.cpp fib.obj /Fe:main.exe,直接生成可用的32位可执行文件,效果和VS IDE设置Win32目标编译完全一致。
若坚持使用GCC编译32位目标
你之前-m32参数报错是因为当前使用的MinGW GCC仅安装了64位运行库,有两种解决方式:
- 方式1:在MinGW的安装管理器中勾选安装
i686架构的32位运行时组件,安装完成后即可正常使用gcc -m32 main.cpp fib.obj -o main.exe完成编译 - 方式2:直接安装独立的32位MinGW工具链,使用32位版本gcc直接编译,无需额外加
-m32参数即可和你生成的32位fib.obj适配。
注意:Visual Studio自带的32位库仅兼容MSVC编译器,无法直接给GCC使用,所以你需要单独安装MinGW的32位运行库组件。
若接受适配x64汇编
x64 MASM语法和32位有差异,取消了.386、.model flat等伪指令,调用约定也改为微软x64约定,第一个int参数通过rcx寄存器传递,改写后的代码如下:
; int fib(int); .code fib proc mov eax, 0 ; 当前斐波那契数 mov edx, 1 ; 下一个斐波那契数 test ecx, ecx ; 参数i存储在rcx寄存器 jle while_1_end while_1: mov r8d, edx add edx, eax mov eax, r8d dec ecx jnz while_1 while_1_end: ret fib endp end
汇编命令:ml64 /c fib.asm
编译链接命令:gcc main.cpp fib.obj -o main.exe,直接生成64位可执行文件,无架构冲突。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

