Nasm分割错误

max*_*rez 1 linux x86 assembly nasm

对不起,我是汇编代码的新手.我编码这个线条

section .text
     global _start
_start:
     nop
main:
     mov eax, 1
     mov ebx, 2
     xor eax, eax
     ret
Run Code Online (Sandbox Code Playgroud)

我用这些命令编译:

nasm -f elf main.asm
ld -melf_i386 -o main main.o
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,Linux抛出了分段错误错误(我正在使用Linux Mint Nadia 64位).为什么会产生这个错误?

提前致谢

Gun*_*ner 8

因为ret 不是在Linux,Windows或Mac中退出程序的正确方法!

对于Windows而言ret,Linux是系统调用 - 对于x86 _start使用argc,或者_start使用retfor 64Bit或者0x00000001如果要链接到C库,则从C库调用.

32位Linux

mov     eax, sys_exit ; sys_exit = 1
xor     ebx, ebx
int     80H
Run Code Online (Sandbox Code Playgroud)

64位Linux

mov     rax, 60
xor     rdi, rdi
syscall
Run Code Online (Sandbox Code Playgroud)

视窗

push    0
call    ExitProcess
Run Code Online (Sandbox Code Playgroud)

Windows/Linux链接到C库

call    exit
Run Code Online (Sandbox Code Playgroud)

  • @maxiperez根本不是一个愚蠢的问题:)。它表明程序不仅是“主要”功能,而且它们以不同的方式与操作系统交互。 (2认同)