来自 Visual Studio 的此代码中的 rep stos 程序集命令的目的
Purpose of rep stos assembly command in this code from Visual Studio
看看下面的代码:
void f()
{
}
我在Visual Studio 2013中编译了它,调试,32位模式并查看了反汇编。
void f()
{
00304CB0 push ebp
00304CB1 mov ebp,esp
00304CB3 sub esp,0C0h
00304CB9 push ebx
00304CBA push esi
00304CBB push edi
00304CBC lea edi,[ebp-0C0h]
00304CC2 mov ecx,30h
00304CC7 mov eax,0CCCCCCCCh
00304CCC rep stos dword ptr es:[edi]
}
00304CCE pop edi
00304CCF pop esi
00304CD0 pop ebx
00304CD1 mov esp,ebp
00304CD3 pop ebp
00304CD4 ret
代表指导的目的是什么?
我只是好奇。
> rep stos
指令以eax
形式写入值,从 edi
指向的地址(在本例中为本地堆栈(开始,ecx
(0x30( 次。eax
中的值是 0xcccccccc
这是 Microsoft 选择的用于指示未初始化内存的幻数。如果您尝试从此内存中取消引用指针,调试器将捕获您。此额外的诊断检查由/RTCu
选项启用。
现在你可能会问,为什么在函数体为空的情况下,任何内存都会保留在本地堆栈上。这是因为您已使用/ZI
选项打开了编辑并继续。编译器只是留出一些空间,以防您决定在调试会话中使用它。
相关文章:
- 内联程序集printf将整数解释为地址
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 具有外部"c"和程序集的未定义函数
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 不同于按值传递和常量引用传递的程序集
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- C++变量在调用 x64 程序集函数后重置为 0
- 如何将C++子例程链接到 x86 程序集程序?
- Qt 网页程序集缓存
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 为什么从 constexpr 引用生成的程序集代码与从 constexpr 指针生成的程序集代码不同?
- 将内联程序集尾调用函数尾声替换为用于x86/x64 msvc的Intrinsics
- 解析 C# 中的C++程序集
- 64 位进程中的 AnyCPU C# DLL 无法引用 64 位C++ DLL(给出错误:无法加载文件或程序集)
- 使用CLANG内联程序集创建C++预增量操作
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 用于比较基元类型的std::可选的有趣程序集
- 来自 Visual Studio 的此代码中的 rep stos 程序集命令的目的