我正在尝试并拥有以下汇编代码,该代码运行得很好,只是在程序结束之前我收到了“分段错误(核心转储)”消息:
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
在流程输入上。
作为纳米在评论中说,问题是您没有退出程序,因此执行会进入垃圾代码,并且会出现段错误。
你需要的是:
;; 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)