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

标签 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] 生成汇编代码?

最佳答案

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

关于c++ - 使用内联 x86 C++ 程序集将寄存器内容移动到变量时出现错误 C2403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37737369/

相关文章:

c++ - 这个只有头文件的库如何防止链接器问题?

c++ - 为什么在成功将 bool 字符串值转换为 bool 值时,istringstream eof 标志没有变为真?

c++ - 关于多态性应该了解的 C++ 知识有哪些

assembly - 有符号溢出 - 为什么 MSB 的进位和进位应该匹配?

c - 这个美元符号在 __asm 中是什么意思?

c++ - NS-3 自载网络 : How to implement simple intersection scenario?

c++ - 宏中的静态变量

c++ - 有什么方法可以避免在 C++ 中使用非法指针吗?

c++ - 编译时检查 trait specialization 是否有唯一的 id

c - x86 程序集中 '_emit 0Fh, _emit 31h' 是什么意思?