C++ &引用;错误:错误的寄存器名“%rax'&引用;在64位Windows 7上使用MinGW编译时
在我上一个主题中:我询问了如何阅读这些寄存器。现在,我编写了一个代码来读取(就目前而言)RAX和RBX 我使用代码块pm 64位Windows 7和MinGW作为编译器,我使用的是x86-64 CPU。当我试图编译以下代码时,我遇到了这些错误:C++ &引用;错误:错误的寄存器名“%rax'&引用;在64位Windows 7上使用MinGW编译时,c++,mingw,x86-64,cpu-registers,C++,Mingw,X86 64,Cpu Registers,在我上一个主题中:我询问了如何阅读这些寄存器。现在,我编写了一个代码来读取(就目前而言)RAX和RBX 我使用代码块pm 64位Windows 7和MinGW作为编译器,我使用的是x86-64 CPU。当我试图编译以下代码时,我遇到了这些错误: Error: bad register name `%rax' Error: bad register name `%rbx' 以及守则: #include <iostream> #include <cstdlib> #incl
Error: bad register name `%rax'
Error: bad register name `%rbx'
以及守则:
#include <iostream>
#include <cstdlib>
#include <stdint.h>
void read(void)
{
uint64_t rax = 0, rbx = 0;
__asm__ __volatile__ (
/* read value from rbx into rbx */
"movq %%rbx, %0;\n"
/* read value from rax into rax*/
"movq %%rax, %1;\n"
/* output args */
: "=r" (rbx), "=r" (rax)
: /* no input */
/* clear both rdx and rax */
: "%rbx", "%rax"
);
/* print out registers content */
std::cout << "RAX = " << rax << "\n";
std::cout << "RBX = " << rbx << "\n";
}
int main(int argc, char **argv)
{
read();
return 0;
}
#包括
#包括
#包括
无效读取(无效)
{
uint64_t rax=0,rbx=0;
__asm\uuuuuu挥发性(
/*将值从rbx读入rbx*/
movq%%rbx,%0;\n
/*将值从rax读入rax*/
movq%%rax,%1;\n
/*输出参数*/
:“=r”(rbx),“=r”(rax)
:/*无输入*/
/*清除rdx和rax*/
:%rbx',%rax
);
/*打印输出寄存器内容*/
std::cout我怀疑您的错误来自“clobber”行:
应改为:
: "rbx", "rax"
(哦,别问我为什么!)
编辑:您还需要使用-m64或类似的代码进行64位编译,假设您拥有的MingW编译器首先能够进行64位编译。我怀疑您的错误来自“clobber”行:
应改为:
: "rbx", "rax"
(哦,别问我为什么!)
编辑:您还需要使用-m64或类似的代码为64位进行编译,假设您拥有的MingW编译器一开始就支持64位。是一个32位编译器。它不支持x86-64目标,所以您不能使用像RAX这样的64位寄存器。至少在本次任务之前发生过这种情况ion.我现在不确定mingw的情况,但很长一段时间它不支持生成64位二进制文件。此外,它在很多方面都被破坏了,因为它使用了古老的MSVCRT运行库,它不支持标准的C99printf
格式说明符或80位长双精度
。开发人员也在luctant更新或响应(拉)请求,因此被分叉,为Windows提供了一个更完整的解决方案。它解决了所有printf
问题,对POSIX和Win32 API有更完整的支持,以及更多您可以稍后阅读的内容
如果mingw的当前版本确实支持x86-64,那么您仍然需要传递-m64
选项以使其输出64位可执行文件,因为正如我所看到的,mingw仍然是一个32位编译器,在默认情况下,在RAX不存在的情况下,它将编译为32位代码。另请参阅
但更好的方法是使用更好的编译器,例如,或Clang,它们本机支持64位来宾和主机
2005年,OneVision软件根据洁净室设计原则创建了MinGW-w64,因为最初的MinGW项目没有及时更新其代码库,包括包含几个关键的新API和急需的64位支持。2008年,OneVision将代码捐赠给其主要开发人员之一Kai Tietz声明说它仍然是开源的。它最初提交给最初的MinGW项目,但因涉嫌使用非公开或专有信息而被拒绝。出于多种原因,MinGW-w64项目的首席开发人员兼联合创始人Kai Tietz决定不再尝试与MinGW进一步合作
MinGW-w64提供了更完整的Win32 API实现,包括:
- 更好的C99支持
- 更好的POSIX线程(pthreads)支持(包括在GCC的libstdc++中启用C++11线程相关功能的可能性)
- GCC multilib,允许用户并行安装32位和64位库
- Unicode入口点(wmain/wWinMain)
- DDK(来自ReactOS)
- DirectX(来自Wine)
- 大文件支持
- Win64支持
- 一些有用的工具,如gendef(MinGW的pexports实用程序的改进版本)和widl(IDL编译器,MIDL的免费替代品)
是一个32位编译器。它不支持x86-64目标,所以你不能像RAX那样使用64位寄存器。至少在这个问题出现之前是这样。我现在不确定mingw的情况,但很长一段时间它不支持生成64位二进制文件。此外,它在很多方面都被破坏了因为它使用了古老的MSVCRT运行库,不支持标准C99printf
格式说明符或80位长双精度
。开发人员也不愿意更新或响应(pull)因此,请求被分叉,为Windows提供了一个更完整的解决方案。它解决了所有的printf
问题,对POSIX和Win32 API有更完整的支持,以及更多您可以稍后阅读的内容
如果mingw的当前版本确实支持x86-64,那么您仍然需要传递-m64
选项以使其输出64位可执行文件,因为正如我所看到的,mingw仍然是一个32位编译器,在默认情况下,在RAX不存在的情况下,它将编译为32位代码。另请参阅
但更好的方法是使用更好的编译器,例如,或Clang,它们本机支持64位来宾和主机
2005年,OneVision软件根据洁净室设计原则创建了MinGW-w64,因为最初的MinGW项目没有及时更新其代码库,包括包含几个关键的新API和急需的64位支持。2008年,OneVision将代码捐赠给其主要开发人员之一Kai Tietz声明说它仍然是开源的。它最初提交给了最初的MinGW项目,但因涉嫌使用非公开或专有信息而被拒绝。出于多种原因,MinGW-w64项目的首席开发人员兼联合创始人Kai Tietz决定不再尝试与