【问题标题】:Segmentation Fault Assembly debug分段故障组装调试
【发布时间】:2018-12-21 10:21:27
【问题描述】:

以下代码有可能导致分段错误的错误。描述问题。为什么会出现段错误?解决方法是什么?

  main: 
   call do_stuff 
   ret
  do_stuff: 
  push ebp 
  mov ebp, esp

  mov eax, 10 
  mov ebx, 20 
  mov ecx, 30 
  mov edx, 40 
  mov ebp, 50

  add eax, ebx 
  add eax, ecx 
  add eax, edx 
  add eax, ebp

  mov esp, ebp 
  pop ebp re

【问题讨论】:

  • mov ebp, 50 用地址 (50) 的值覆盖 EBP,该地址是一个虚假的内存地址。最终将到达mov esp, ebp,并且 EBP 将被复制到 ESP,这将导致堆栈出错,然后 POP EBP 将尝试读取您可能没有读取权限的内存的段错误..
  • 您还有另一个错误可能不会导致段错误,但仍然是错误:mov ebx, 20 clobbers EBX,它是在所有正常的调用约定。但如果 EBX 被破坏,大多数 CRT 启动例程(调用 main)不会崩溃。

标签: assembly segmentation-fault nasm


【解决方案1】:

问题在于堆栈处理。您首先将堆栈指针 (esp) 的地址写入帧指针 (ebp),然后更改 ebp 并将其移回 esp,这会导致程序崩溃。你的代码应该改写如下:

do_stuff: 
  push ebp 
  mov ebp, esp ; for correct debugging

  mov eax, 10 

  add eax, 20 
  add eax, 30 
  add eax, 40 
  add eax, 50

  mov esp, ebp ; refresh stack pointer if it was changed
  pop ebp ; get pointer to previous frame
  ret ; the result will be stored in eax

【讨论】:

  • 另外,重要的是,默认调用约定禁止您使用 ebx。如果你使用它,你也会得到一个段错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
相关资源
最近更新 更多