Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ &引用;错误:错误的寄存器名“%rax'&引用;在64位Windows 7上使用MinGW编译时_C++_Mingw_X86 64_Cpu Registers - Fatal编程技术网

C++ &引用;错误:错误的寄存器名“%rax'&引用;在64位Windows 7上使用MinGW编译时

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

在我上一个主题中:我询问了如何阅读这些寄存器。现在,我编写了一个代码来读取(就目前而言)RAX和RBX

我使用代码块pm 64位Windows 7和MinGW作为编译器,我使用的是x86-64 CPU。当我试图编译以下代码时,我遇到了这些错误:

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运行库,它不支持标准的C99
printf
格式说明符或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运行库,不支持标准C99
printf
格式说明符或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决定不再尝试与