【c++ debug】xx_x86_64.S: Assembler messages: Error: unknown mnemonic ‘pushq‘ -- ‘pushq %rdi‘

文章目录

      • 1. 报错
      • 2. 原因与解决方法
      • 3. 拓展
        • 拓展1:aarch64和arm64的区别
        • 拓展2:大写.S和小写.s的区别

1. 报错

  • swap_x86_64.S:20: Error: unknown mnemonic ‘pushq’ – ‘pushq %rdi’ … make swap_x86_64.S.o error

    【c++ debug】xx_x86_64.S: Assembler messages: Error: unknown mnemonic ‘pushq‘ -- ‘pushq %rdi‘_第1张图片

2. 原因与解决方法

  • 问题原因:在ARM平台去编译x86的.o目标文件,使用了x86的.S文件,不识别pushq/popq等汇编指令,指令集报错,编译失败
  • 解决办法:使用对应的arm文件进行编译,如swap_aarch64.S

3. 拓展

拓展1:aarch64和arm64的区别
  • 同一个东西。aarch64是ARMv8-A 架构中引入的64位指令集,历史上linux社区将arm64作为内核的端口调用,而不是aarch64,导致遗留了一些arm64的用法。LLVM社区后端称为aarch64,Apple后端也称aarch64为arm64,后来两者合并,后端现在统一称为aarch64
拓展2:大写.S和小写.s的区别
  • 编译过程:预处理->编译->汇编->链接
  • 汇编程序的后缀是区分大小写的.S和.s
  • 相同:两者都是汇编代码文件
  • 不同:.s不支持预处理,.S支持预处理
  • 支持预处理的意思:预处理指添加头文件和宏替换等操作,.S支持预处理指如果想要在汇编代码中使用宏或者头文件,那么保存的汇编文件应该以.S为后缀

 


【参考文章】
aarch64指令集和arm64指令集区别
.S和.s导致的编译报错
64位操作系统去编译生成32位的目标文件报错
.S和.s的区别

created by shuaixio, 2023.10.28

你可能感兴趣的:(C/C++,c++,汇编程序,架构,编译过程,汇编文件)