【问题标题】:Visual studio C++ Assembly | Meaning of the brackets?Visual Studio C++ 汇编 |括号的含义?
【发布时间】:2019-07-15 07:09:39
【问题描述】:

我正在尝试比较两段代码的程序集,它们如下所示。我的问题是[esp+4] [esp+8] [esp+0Ch] 中的添加是在运行时执行的,还是在此之前以某种方式解决的。

版本 1

00FE104D  mov         eax,dword ptr [esp+4]  
00FE1051  imul        eax,dword ptr [esp+8]  
00FE1056  mov         esi,dword ptr [esp+0Ch]  

第 2 版

00FE104D  mov         eax,dword ptr [x]  
00FE1051  imul        eax,dword ptr [y]  
00FE1056  mov         esi,dword ptr [z]  

【问题讨论】:

    标签: visual-studio assembly x86 addressing-mode intel-syntax


    【解决方案1】:

    它当然是在运行时执行的。之前“解决”它是没有意义的。

    mov eax,dword ptr [x]
    

    意思是:取x指向的DWORD,放入eax。在 C 中会是这样的:

       DWORD x;
       ...
       eax = *((DWORD*)x);
    

       mov eax,dword ptr [x + 4]
    

    在 C 中会是这样的

       DWORD x;
       ...
       eax = *((DWORD*)(x + 4));
    

    【讨论】:

    • 好的,谢谢您的澄清,作为第二个问题,版本 1 和版本 2 之间的性能是否存在差异? (有或没有这些添加)。
    • *((DWORD*)x) *((DWORD*)&x)吗?该地址是x 的地址,而不是将x 中存储的值视为地址。
    • @Michael 这是更多的伪代码,只是为了解释汇编指令的作用。所以,是的,在这个示例中,x 包含一个 32 位地址。
    • 好吧,如果不清楚我们应该如何解释解释,那么答案就会有点混乱。如果是 C,那么在 x 之前似乎应该有一个 & 符号,因为这就是汇编代码的真正含义。如果不是 C,那么可能应该对这些表达式在该语言中的含义进行某种解释。
    猜你喜欢
    • 2012-10-16
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多