装配NASM分段故障,这是什么意思?

时间:2016-09-18 15:30:27

标签: ubuntu assembly nasm

当我汇编以下汇编代码时,我收到错误Segmentation fault (core dumped)

section .text
global _start

_start:
    mov eax, 8

我的Makefile如下

all:
    nasm -f elf64 -o asm.o asm.s
    ld asm.o -o asm
    rm asm.o

我不知道问题所在。

我正在运行64位Ubuntu。

感谢。

3 个答案:

答案 0 :(得分:2)

我用 64 位寄存器制作了这个快速 example.asm

section .data

        msg db "Hello world"

section .text

        global _start:

_start:

        call _myfunk

        call _exit


_myfunk:

        mov rax,1
        mov rdi,1
        mov rdx,12
        mov rsi,msg
        syscall
        ret


_exit:

        mov rax, 60
        mov rdi,0
        syscall

要编译此汇编代码,您可以使用 nasm 和 ld 命令

nasm -f elf64 example.asm -o example.o  
ld example.o -o example.elf  

现在运行程序./example.elf

答案 1 :(得分:0)

CPU执行程序,找到mov eax, 8指令,执行它......现在怎么办?目标文件中没有更多指令,但没有人告诉CPU!它执行接下来的任何操作,可能没有有效的指令,这会导致分段错误,就像@MichaelPetch所说的那样。

最简单的解决方案IMO是使用包装器,它负责初始化和清理程序,例如GCC。只需将mov eax, 8放入您可能熟悉的main函数中。

修改源文件,如下所示:

section .text
global main

main:
    mov eax, 8
    ret

main是一个函数,因此您需要ret指令才能从中返回。)

并使用以下脚本:

nasm -f elf64 -o asm.o asm.s
gcc asm.o -o asm
rm asm.o

答案 2 :(得分:0)

我只开始组装,但我可以提供帮助 - 现在它已经 4 岁了,你可能不需要它,但也许其他人需要它。

在此:

section .text
global _start

_start:
    mov eax, 8

你写完代码忘了停止程序, 因此在 _start 标签内,您可以添加 3 行,如下所示:

(我不知道为什么你需要 8 个 eax reg。所以我把它移到了 ebx)

section .text
global _start

_start:
    mov eax, 8

    mov ebx, eax
    mov eax, 1   ; this is for system call exit
    int 0x80    ; system call 

这里 ebx 的值将被视为返回值,因此您可以通过在终端中键入来获取值 (8)

echo $?

祝你好运:)