当我汇编以下汇编代码时,我收到错误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。
感谢。
答案 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 $?
祝你好运:)