在下面的代码中,当我取消注释任何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
设置为绝对地址。