错误 C2403 使用内联 x86 C++ 程序集将寄存器内容移动到变量

Posted

技术标签:

【中文标题】错误 C2403 使用内联 x86 C++ 程序集将寄存器内容移动到变量【英文标题】:Error C2403 using inline x86 C++ assembly moving register contents to variable 【发布时间】:2016-06-09 22:43:27 【问题描述】:

我以前使用过内联汇编程序,但我遇到了一个我以前从未见过的错误,而且似乎无法在互联网上找到。我得到的最接近的是this 或this,但都没有帮助。错误是在将 EAX 寄存器的内容移动到变量 dx 时。在我看来它应该只是下面,实际上反汇编生成的代码与我写的相同,但我得到两个错误:

    int main(int argc, char * argv[])
         auto x1 = 10, x2 = 2, dx = 0;
         __asm
              MOV EAX, DWORD PTR [x1]
              SUB EAX, DWORD PTR [x2]
              MOV DWORD PTR [dx], EAX
              ;error C2403: 'dx': register must be base/index in 'first operand'
              ;error C2415: improper operand type

              ;Disassembly generated the following
              mov eax,dword ptr[x1]
              sub eax,dword ptr[x2]
              mov dword ptr[dx],eax
        
    

我认为我不需要使用不同的寄存器,并且我认为 MOV 可以将寄存器的内容移动到这样的变量中。奇怪的是,以下行完全相同,但使用了 y1、y2 和 dy,并且没有产生错误。我试过只使用 [dx] 来获得相同的结果,现在我只能想到 MMX 指令之类的东西,这似乎没有必要。提前感谢您的帮助!

旁注:在使用 x86(或任何)汇编语言编写时,是否更倾向于全大写而不是小写?

[Edit] 现在我很好奇,如果我的使用混淆了编译器,它如何使用 dword ptr [dx] 生成汇编代码?

【问题讨论】:

【参考方案1】:

DX 本身就是一个 16 位 x86 通用寄存器,汇编器被您的语法弄糊涂了(因此“寄存器必须是第一个操作数中的基数/索引”——例如,dword ptr [ax]意思是?)。为您的变量选择一个不同的名称。

【讨论】:

哦,你说得对,我忘了。谢谢你把我从另一个小时的抓挠中解救出来!

以上是关于错误 C2403 使用内联 x86 C++ 程序集将寄存器内容移动到变量的主要内容,如果未能解决你的问题,请参考以下文章

x86 内联汇编器标志

Visual Studio 2010 像 Visual Studio 6 一样在 C++ 中编译内联程序集?

帮助理解 x86 内联汇编中的 DIV 指令

x86 程序集分段错误

具有非内联汇编的 Qt C++ 项目

Visual C++ 2012 (x86) 中可能的编译器错误?