为啥 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++时为啥有错误也没有下划波浪线?