当我执行按下指令时,我收到:分段错误(核心转储)

问题描述:

在以下代码中,当我取消注释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 
+0

什么'push'ed必须'流行',或者你不平衡的堆栈。这是seg故障的常见原因。无论如何,“推”指令的目的是什么?你想做什么?另外,顺便说一句,你不需要'imp end';无论如何,执行都会落到那里! –

+0

@CodyGray这段代码只是开发函数来计算一些数学的开始。 'push'命令正在准备将要开发的函数的参数 – user3405291

+6

'''''''''''''''''''''''''''''''''您可以将堆栈指针清零,duh。如果你想使用堆栈,你会意识到这有点不好,对吧? – Jester

你期望什么?
如果你乱堆栈指针(esp)显然你会遇到麻烦。

在x86保护模式下,地址0永远不是有效的目标。
此外,所有'负'地址(0x80000000-0xFFFFFFFF)都在内核空间中。

您重置esp,然后您push,这意味着您在地址0-4 = 0xFFFFFFFC存储注册。这将失败,因为您的用户空间进程无法访问内核空间。

不管细节如何,你永远不会像ESP那样混乱。只需根据需要递增或递减ESP即可清除或创建堆栈空间。
千万不要将esp设置为绝对地址。