- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是的,我敢肯定这是隐含地回答了很多次,但我似乎无法完全理解它。
如果您有一个 (x86) 堆栈跟踪(例如,在 WinDbg 中查看它),并且您查看了寄存器,那么 EBP 和 ESP 值相距 x 字节意味着什么?
链接:
0:016> k
ChildEBP RetAddr
1ac5ee8c 76b831bb ntdll!NtDelayExecution+0x15
1ac5eef4 76b83a8b KERNELBASE!SleepEx+0x65
1ac5ef04 0060e848 KERNELBASE!Sleep+0xf
1ac5ef10 76859d77 MyApp!application_crash::CommonUnhandledExceptionFilter+0x48 [...\applicationcrash.inc.cpp @ 47]
1ac5ef98 775a0df7 kernel32!UnhandledExceptionFilter+0x127
1ac5efa0 775a0cd4 ntdll!__RtlUserThreadStart+0x62
1ac5efb4 775a0b71 ntdll!_EH4_CallFilterFunc+0x12
1ac5efdc 77576ac9 ntdll!_except_handler4+0x8e
1ac5f000 77576a9b ntdll!ExecuteHandler2+0x26
1ac5f0b0 7754010f ntdll!ExecuteHandler+0x24
1ac5f0b0 6e8858bb ntdll!KiUserExceptionDispatcher+0xf
1ac5f400 74e68ed7 mfc80u!ATL::CSimpleStringT<wchar_t,1>::GetString [f:\dd\vctools\vc7libs\ship\atlmfc\include\atlsimpstr.h @ 548]
1ac5fec0 6e8c818e msvcr80!_NLG_Return [F:\dd\vctools\crt_bld\SELF_X86\crt\prebuild\eh\i386\lowhelpr.asm @ 73]
1ac5ff48 74e429bb mfc80u!_AfxThreadEntry+0xf2 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp @ 109]
1ac5ff80 74e42a47 msvcr80!_callthreadstartex+0x1b [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 348]
1ac5ff88 76833677 msvcr80!_threadstartex+0x66 [f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c @ 326]
1ac5ff94 77569f02 kernel32!BaseThreadInitThunk+0xe
1ac5ffd4 77569ed5 ntdll!__RtlUserThreadStart+0x70
1ac5ffec 00000000 ntdll!_RtlUserThreadStart+0x1b
0:016> r
eax=00000000 ebx=1ac5efc8 ecx=19850614 edx=00000000 esi=1ac5eed0 edi=00000000
eip=7754fd21 esp=1ac5ee8c ebp=1ac5eef4 iopl=0 nv up ei pl nz na pe nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010206
1ac5ee8c
- EBP
1ac5eef4
= 104 字节差异。那么里面有什么?
最佳答案
ESP 是当前堆栈指针。 EBP 是当前堆栈帧的基指针。
调用函数时,通常会在堆栈上为局部变量保留空间。这个空间通常通过 EBP 引用(所有局部变量和函数参数在函数调用期间都是一个已知的常量偏移量。)另一方面,ESP 会在函数调用期间随着其他函数的调用而改变,或作为临时堆栈空间用于部分运算结果。
请注意,现在大多数编译器都可以选择通过 ESP 引用所有局部变量。这释放了 EBP 以用作通用寄存器。
通常,当您查看函数顶部的反汇编代码时,您会看到如下内容:
push EBP
mov EBP, ESP
sub ESP, <some_number>
关于debugging - ESP 和 EBP 之间是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15020621/
回车和有什么区别 push ebp mov ebp, esp sub esp, imm 说明?有性能差异吗?如果是这样,哪个更快,为什么编译器总是使用后者? 与离开和类似 mov esp, eb
我有一个简单的代码: void func() { func2(); } 我省略了 func2 和 main 的实现,因为它们无关紧要。然后我用windbg跟踪汇编,下面是执行“func2()”
这两条指令在gcc为x86机器生成的汇编代码中产生了什么影响: push %ebp movl %esp, %ebp 最佳答案 unwind的解释是字面上的事实(尽管有一个较小的方向性错误),但没有解释
我们为什么push ebp作为汇编函数的被调用者中的第一个操作? 我明白了,那么我们使用mov edi, [ebp+8]获取传入的变量,但是我们的 esp已经指向调用者函数的返回地址。我们可以使用 m
我正在阅读这本书 Hacking: The Art of Exploitation, 2nd Edition 并在简单的 C 程序中 #include int main() { int i;
我正在 Uni 学习计算机体系结构和汇编编程类(class)。前段时间我们学习了如何在 ASM 中编写函数并从 C 中调用它们。但是有一件事我不明白——在每个 ASM 函数的开头,讲师总是进行两条指令
我有这个 C 函数: void hello(char * src) { char buffer[64]; strcpy(buffer, src); printf("Hello %s !\n
我正在努力为考试而学习,并查看堆栈溢出的东西,我希望有人能为我解决一些问题。 (假设这是在 32 位系统上,所以所有地址都是 4 个字节。另外我正在从 C 函数研究它,所以引用的任何代码都来自 C)
我目前正在学习英特尔处理器的汇编。既然堆栈“向下增长”,为什么我们必须添加才能访问特定元素 [ebp + 8] ;; This will access the first param 我知道我们必须跳
我一直在研究 StackGuard 和类似的技术,以及英特尔关于“控制流执行”(基本上是影子堆栈)的新技术预览,此处:https://software.intel.com/sites/default/
我在这里需要一些帮助,我是汇编语言的新手。到目前为止我做了什么。汇编代码: extern puts section .data test: db 'test',0 section .text
当明确告知编译器不要使用 ebp 作为堆栈帧指针时,如何实现堆栈回溯? 最佳答案 这个问题的答案只出现在对 What is the purpose of the EBP frame pointer r
我正在尝试通过 EBP 从被调用方获取调用方中定义的局部变量。这应该是可能的,但如果不是,请解释原因。 这是我现在的代码: #include void TEST(int a, int b, int
我想通过查看堆栈上的原始数据将堆栈划分为堆栈帧。我想通过找到保存的 EBP 指针的“链表”来做到这一点。 我可以假设(标准和常用的)C 编译器(例如 gcc)将始终在函数序言中的函数调用中更新和保存
对于这个简单的代码: void main(){ char buf[12]; buf[11]='\xff'; puts(buf); } 我使用 gdb 调试此代码并获取其堆栈信息,如下所示:
前段时间我在尝试写汇编例程并将其与 C 程序链接,我发现我可以跳过标准的 C 调用序言结语 push ebp mov ebp, esp (sub esp, 4 ...
我正在编写一个汇编程序和一个 C 程序; C 程序将调用一个用汇编编写的函数。环境为Ubuntu 18.04LTS x64。 它是为 32 位 x86 设计的,将由 NASM 编译,但它不能传递正确的
是的,我敢肯定这是隐含地回答了很多次,但我似乎无法完全理解它。 如果您有一个 (x86) 堆栈跟踪(例如,在 WinDbg 中查看它),并且您查看了寄存器,那么 EBP 和 ESP 值相距 x 字节意
我对以下代码中的 EBP、ESP 和堆栈帧有一些疑问。 为什么我们要从 esp 中减去 28? main 中有两个局部变量 x 和 y。那么我们为什么不减去 8呢? 我们不把值从右(或上)到左(或下)
当我使用disas时在gdb 。我可能会得到这样的东西。 (gdb) disas bar Dump of assembler code for function bar: 0x08048e84
我是一名优秀的程序员,十分优秀!