【发布时间】: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, 20clobbers EBX,它是在所有正常的调用约定。但如果 EBX 被破坏,大多数 CRT 启动例程(调用main)不会崩溃。
标签: assembly segmentation-fault nasm