为啥 Visual C++ 2010 使用此汇编语法进行内存寻址?

Posted

技术标签:

【中文标题】为啥 Visual C++ 2010 使用此汇编语法进行内存寻址?【英文标题】: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是局部的,一个局部变量地址是和栈帧相关的,你看到的是相对地址计算。全局变量地址是固定的。 【参考方案1】:

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

【讨论】:

正常的 Intel 汇编语法是 offset[register],或者可选的 [register+offset],但是 register[offset] 通常是不允许的,因为 [] 意味着寄存器间接,而没有 [] 的 register 意味着注册直接访问。

以上是关于为啥 Visual C++ 2010 使用此汇编语法进行内存寻址?的主要内容,如果未能解决你的问题,请参考以下文章

为啥以下无法在 Visual Studio 2010 C++ 下编译?

Visual C++ 2010 / QT:为啥调用类的赋值运算符?

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

visual C++ 2010 序列号

Visual Studio 2010在编译c++时为啥有错误也没有下划波浪线?

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