Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在我的代码末尾进行系统调用后出现程序集分段错误_Linux_Assembly_X86_Nasm_System Calls - Fatal编程技术网

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