Linux 在我的代码末尾进行系统调用后出现程序集分段错误
我正在进行实验,并拥有以下汇编代码,这些代码运行得非常好,只是在程序结束之前,我收到了一条“分段错误(内核转储)”消息:Linux 在我的代码末尾进行系统调用后出现程序集分段错误,linux,assembly,x86,nasm,system-calls,Linux,Assembly,X86,Nasm,System Calls,我正在进行实验,并拥有以下汇编代码,这些代码运行得非常好,只是在程序结束之前,我收到了一条“分段错误(内核转储)”消息: GLOBAL _start %define ___STDIN 0 %define ___STDOUT 1 %define ___SYSCALL_WRITE 0x04 segment .data segment .rodata L1 db "hello World", 10, 0 segment .bss segment .text _start: mov
GLOBAL _start
%define ___STDIN 0
%define ___STDOUT 1
%define ___SYSCALL_WRITE 0x04
segment .data
segment .rodata
L1 db "hello World", 10, 0
segment .bss
segment .text
_start:
mov eax, ___SYSCALL_WRITE
mov ebx, ___STDOUT
mov ecx, L1
mov edx, 13
int 0x80
不管我是否有ret
在结尾;我仍然明白这个信息
有什么问题吗
我正在使用x86和nasm。您不能从一开始就
ret
;它不是函数,堆栈上没有返回地址。堆栈指针指向进程条目上的argc
正如n.m.在评论中所说的,问题是你没有退出程序,所以执行会进入垃圾代码,你会得到一个segfault
您需要的是:
;; Linux 32-bit x86
%define ___SYSCALL_EXIT 1
// ... at the end of _start:
mov eax, ___SYSCALL_EXIT
mov ebx, 0
int 0x80
(以上是32位代码。在64位代码中,您需要mov eax,231
(退出组)/syscall
,退出状态为EDI。例如:
;; Linux x86-64
xor edi, edi ; or mov edi, eax if you have a ret val in EAX
mov eax, 231 ; __NR_exit_group
syscall
您不能从一开始就
ret
;它不是函数,堆栈上没有返回地址。堆栈指针指向进程条目上的argc
正如n.m.在评论中所说的,问题是你没有退出程序,所以执行会进入垃圾代码,你会得到一个segfault
您需要的是:
;; Linux 32-bit x86
%define ___SYSCALL_EXIT 1
// ... at the end of _start:
mov eax, ___SYSCALL_EXIT
mov ebx, 0
int 0x80
(以上是32位代码。在64位代码中,您需要mov eax,231
(退出组)/syscall
,退出状态为EDI。例如:
;; Linux x86-64
xor edi, edi ; or mov edi, eax if you have a ret val in EAX
mov eax, 231 ; __NR_exit_group
syscall
您需要显式地syscall exit。可能重复相关:,您必须创建一个
sys\u exit
,sys\u exit\u组
,或者发出一个终止进程的信号。从\u start
的末尾掉下来是另一个问题(使用相同的解决方案)当试图在\u start
末尾使用ret
时,您需要显式地调用syscall exit。可能重复相关:,您必须创建sys\u exit
,sys\u exit\u组
,或发出终止进程的信号。从\u start
末尾脱落是另一个问题(使用相同的解决方案)在\u start
的末尾尝试使用ret
。