使用所有寄存器后的 MSVC 编译器行为
msvc compiler behaviour after all registers are used
我正在尝试进入ASM概念,在观察MSVC生成的反汇编时,我无法完全理解一些东西。这是我的测试用例:
#include <tchar.h>
#include <conio.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int v1 = 1;
int v2 = 2;
int v3 = 3;
int v4 = 4;
int v5 = 5;
int v6 = 6;
int v7 = 7;
int v8 = 8;
int v9 = 9;
int v10 = 10;
int v11 = 11;
int v12 = 12;
int v13 = 13;
int v14 = 14;
int v15 = 15;
int v16 = 16;
int sum = v1+v2 * (v3+v4 * (v5+v6 * (v7+v8 * (v9+v10 * (v11+v12 * (v13+v14 * (v15+v16)))))));
_getch();
return 0;
}
它生成类似以下内容:
mov eax, v1
mov edx, v3
mov ecx, v5
mov ebx, v7
mov esi, v9
mov edi, v11 // all 6 available registers are filled
mov dword ptr [ebp-60h), eax // free eax <<<<<<
mov eax, v15 // fill it again
add eax, v16
imul eax, v12
(...)
所以,我的问题是: 编译器在标有"<<<<<<"的行上做什么?我 猜测是它创建了一个变量来存储寄存器值 在。看起来它在堆栈上,因为它使用了ebp
,但是它是 类似于"全局变量"的东西,还是当前变量 仅范围(框架)?
提前谢谢。
MSVC 会将寄存器溢出到适当的内存:当它溢出包含具有块范围的变量的寄存器时溢出到堆栈,或者当寄存器保存全局时溢出到固定偏移量。在任何时候,编译器都知道哪些变量在哪个寄存器中。
不能将局部变量溢出到全局内存,因为由于线程和重入,局部变量的数量可能不可预测。编译器可能能够暂时将全局变量溢出到堆栈槽,但在存在线程的情况下,这非常复杂。
相关文章:
- __CHAR_BIT__宏是否为 MSVC 编译器预定义?
- 为什么 std::count 比 MSVC 编译器的普通循环慢,但与 GCC 相等?
- msvc 编译器(和其他编译器)如何知道要绑定到哪个 std 重载?
- 如何使用CLion和MSVC编译器工具链编译wxWidgets Hello World应用程序而没有错误?
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- MSVC 编译器/链接器何时合成标量/矢量删除析构函数
- 如何让MSVC编译器优化多步POD初始化?
- 使用 MSVC C++编译器创建动态大小的数组
- GCC,Apple LLVM和MSVC编译器的不同部分的名称是什么?
- MSVC编译器拆卸代码来自if/else语句
- MSVC 编译器在调试模式下构建 Qt 5.10 时崩溃
- MSVC编译器错误将模板与枚举参数重载时
- 为什么msvc编译器在显式调用析构函数时会发出未使用的变量
- 可视化如何禁用 msvc c++ 编译器的"note:"提示
- MSVC 编译器实例化函数模板的默认定义,即使存在专用化
- 使用所有寄存器后的 MSVC 编译器行为
- 这是MSVC 编译器错误
- 具有枚举规范的模板模板类在 MSVC++ 编译器 C3201 上失败
- MSVC++ 编译器错误 C2923 传递模板参数
- 涉及嵌套模板的 MSVC 编译器错误