Visual Studio中此代码中的rep stos程序集命令的用途

时间:2014-12-16 11:42:57

标签: c++ assembly

看看以下代码:

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指令的目的是什么?

我只是好奇。

1 个答案:

答案 0 :(得分:7)

rep stos指令将eax中的值写入edi(本例中为您的本地堆栈)指向的地址,ecx(0x30)次。 eax中的值为0xcccccccc,这是由microsoft选择的幻数,表示未初始化的内存。如果您尝试从该内存中取消引用指针,调试器将捕获您。 /RTCu选项启用了额外的诊断检查。

现在你可能会问为什么,在一个空的函数体中,任何内存都将保留在本地堆栈上。这是因为您已使用/ZI选项进行编辑并继续启用。编译器只是留出一些空间,以防你决定在调试会话中使用它。