【问题标题】:Why is Visual C++ 2010 using this Assembly syntax for memory addressing?为什么 Visual C++ 2010 使用此汇编语法进行内存寻址?
【发布时间】:2014-12-28 03:31:53
【问题描述】:

我使用 Visual C++ 2010 将以下 C++ 代码转换为程序集:

int main()
{
    int i;
    i = 1234;

    return 0;
}

我收到以下输出:

根据我对内存寻址的理解,内存地址的计算总是放在方括号内,那么为什么_i$在这种情况下放在方括号外呢?

【问题讨论】:

  • 因为语法允许吗?
  • 可能是因为它与堆栈帧有关? i是局部的,一个局部变量地址是和栈帧相关的,你看到的是相对地址计算。全局变量地址是固定的。

标签: c++ visual-studio-2010 assembly visual-c++ addressing-mode


【解决方案1】:

Microsoft 的汇编器处理 a[b] 之类的东西的方式与 C 或 C++ 的处理方式大致相同,因此 a[b]b[a] 几乎是等价的。两者都表示添加和一些可选的缩放,然后是解引用,但对于哪个部分是“地址”和哪个部分是“索引”没有太多要求。

【讨论】:

  • 正常的 Intel 汇编语法是 offset[register],或者可选的 [register+offset],但是 register[offset] 通常是不允许的,因为 [] 意味着寄存器间接,而没有 [] 的 register 意味着注册直接访问。
猜你喜欢
  • 2012-04-30
  • 2011-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 2013-11-05
相关资源
最近更新 更多