VisualStudio没有';引用堆栈变量时不要使用EBP 我有以下C++代码< /P> int myFuncSum( int a, int b) { int c; c = a + b; return c; } int main(int argc, char *argv[]) { int result; result = myFuncSum(100, 200); return 0; }
当我在Win7 Pro机器上的Visual Studio 2008的反汇编窗口中单步执行此操作时,我看到以下调用myFuncSum()VisualStudio没有';引用堆栈变量时不要使用EBP 我有以下C++代码< /P> int myFuncSum( int a, int b) { int c; c = a + b; return c; } int main(int argc, char *argv[]) { int result; result = myFuncSum(100, 200); return 0; },c++,assembly,visual-studio-2008,C++,Assembly,Visual Studio 2008,当我在Win7 Pro机器上的Visual Studio 2008的反汇编窗口中单步执行此操作时,我看到以下调用myFuncSum() intmyfuncsum(inta,intb) { 001C1000推式ebp 001C1001电动制动踏板,esp 001C1003推动ecx INTC; c=a+b; 001C1004 mov eax,dword ptr[a]反汇编程序只是想提供帮助,而不是对不相关的详细信息滥发太多信息。这并非完全偶然,在带有\uu asm关键字的内联汇编中也允许使用此语法
intmyfuncsum(inta,intb)
{
001C1000推式ebp
001C1001电动制动踏板,esp
001C1003推动ecx
INTC;
c=a+b;
001C1004 mov eax,dword ptr[a]反汇编程序只是想提供帮助,而不是对不相关的详细信息滥发太多信息。这并非完全偶然,在带有\uu asm
关键字的内联汇编中也允许使用此语法缩写
您可以来回切换,右键单击“反汇编”窗口并取消选中“显示符号名称”。现在您将看到真实的机器代码:
c = a + b;
003613DE mov eax,dword ptr [ebp+8]
003613E1 add eax,dword ptr [ebp+0Ch]
003613E4 mov dword ptr [ebp-8],eax
return c;
003613E7 mov eax,dword ptr [ebp-8]
它已经在使用ebp
(或esp
)引用它们但是你的反汇编程序只是想帮你把它转换成变量名。根据谷歌的说法,你可以右键点击弹出上下文菜单,取消选中显示符号名
。我还建议在这样的函数中只返回总和,而不在函数中创建临时值。@NathanOliver,是的当然;但这是我遵循的初学者教程:)旁注-有一个编译器命令行选项用于关闭堆栈帧,这将释放ebp(除非不使用它,否则仍然保存),并将esp用于基于堆栈的变量。@Wad-Visual Studio的选项是“忽略帧指针”。命令行选项是/Oy(VS2013回到VC/C++4.0)。我不知道gcc。
c = a + b;
003613DE mov eax,dword ptr [ebp+8]
003613E1 add eax,dword ptr [ebp+0Ch]
003613E4 mov dword ptr [ebp-8],eax
return c;
003613E7 mov eax,dword ptr [ebp-8]