看看下面的代码:
void f()
{
}
Run Code Online (Sandbox Code Playgroud)
我在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
Run Code Online (Sandbox Code Playgroud)
rep stos指令的目的是什么?
我只是好奇.
该rep stos指令将值写入eax从edi(本例中为本地堆栈),ecx(0x30)次指向的地址开始.值in eax是0xcccccccc由microsoft选择的幻数,表示未初始化的内存.如果您尝试从该内存中取消引用指针,调试器将捕获您./RTCu选项启用此额外诊断检查.
现在您可能会问为什么,使用空函数体,将在本地堆栈上保留任何内存.这是因为您已使用该/ZI选项进行编辑并继续打开.如果您决定在调试会话中使用它,编译器只是留出一些空间.
| 归档时间: |
|
| 查看次数: |
2908 次 |
| 最近记录: |