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

时间:2016-06-09 22:43:28

标签: c++ c++11 assembly visual-studio-2015 inline-assembly

之前我曾使用内联汇编程序,但我收到的错误是我以前见过的,似乎无法找到互联网。我最接近的是thisthis,但都没有帮助。将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(或任何)汇编语言编写时,是否优先选择全大写和小写?

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

1 个答案:

答案 0 :(得分:4)

DX本身就是一个16位x86通用寄存器,汇编器会因你的语法而感到困惑(因此'寄存器必须是第一个操作数中的base / index' - 例如,{{1} }} 意思?)。为变量选择其他名称。