当我执行按下指令时,我收到:分段错误(核心转储)
问题描述:
在以下代码中,当我取消注释push
指令时,我在运行可执行文件时收到错误Segmentation fault (core dumped)
。我试图找出错误原因,但找不到原因。当我执行按下指令时,我收到:分段错误(核心转储)
section .data
; Message contains app purpose
msg db 'This app calculates 2^3+5^2',0x0a
mlen equ $-msg
msg1 db 'Computation is done',0x0a
lmsg1 equ $-msg1
num1 dd 2
lnum1 equ $-num1
pow1 dd 3
lpow1 equ $-pow1
num2 dd 5
lnum2 equ $-num2
pow2 dd 2
lpow2 equ $-pow2
section .text
global _start
_start:
xor edx, edx ; clear registers
xor ecx, ecx
xor ebx, ebx
xor eax, eax
xor esi, esi
xor edi, edi
xor esp, esp
xor ebp, ebp
mov edx, mlen
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80 ; print message
mov edx, dword [pow2]
mov ecx, dword [num2]
mov ebx, dword [pow1]
mov eax, dword [num1]
;push edx
;push ecx ; --> When I un-comment any push command,
;push ebx ; --> I receive: Segmentation fault (core dumped)
;push eax ;
jmp end
end:
mov edx, lmsg1 ; length
mov ecx, msg1 ; memory location
mov ebx, 1
mov eax, 4
int 0x80 ; print a newline i.e. 0x0a
mov ebx, 0
mov eax, 1
int 0x80
答
你期望什么?
如果你乱堆栈指针(esp
)显然你会遇到麻烦。
在x86保护模式下,地址0永远不是有效的目标。
此外,所有'负'地址(0x80000000-0xFFFFFFFF)都在内核空间中。
您重置esp
,然后您push
,这意味着您在地址0-4 = 0xFFFFFFFC
存储注册。这将失败,因为您的用户空间进程无法访问内核空间。
不管细节如何,你永远不会像ESP
那样混乱。只需根据需要递增或递减ESP
即可清除或创建堆栈空间。
千万不要将esp
设置为绝对地址。
什么'push'ed必须'流行',或者你不平衡的堆栈。这是seg故障的常见原因。无论如何,“推”指令的目的是什么?你想做什么?另外,顺便说一句,你不需要'imp end';无论如何,执行都会落到那里! –
@CodyGray这段代码只是开发函数来计算一些数学的开始。 'push'命令正在准备将要开发的函数的参数 – user3405291
'''''''''''''''''''''''''''''''''您可以将堆栈指针清零,duh。如果你想使用堆栈,你会意识到这有点不好,对吧? – Jester