简单的ASM代码的分段错误

问题描述:

对于我的问题,当我尝试在ubuntu 64位版本下创建一个NASM的例子,并在组装并链接到ELF后执行它。它返回的错误信息如下当我执行简单的ASM代码的分段错误

NASM -f ELF64 -o firstasm.o firstasm.asm LD -o firstasm firstasm.o firstasm

分割故障(核心转储)

我NASM代码将是下面我就开始想进行简单的write()和exit()函数

section .data ;Data segment 

msg db "This line is test", 0x0a 

section .text ;text segment 
global _start ;Default entry point for ELF linking 

_start: 

; SYSCALL : write (1,msg,14) 
xor rax,rax 
xor rbx,rbx 
xor rcx,rcx 
xor rdx,rdx 
mov rax,64 ; make a syscall write 4 
mov rbx,1 ; put 1 into rbx and also stdout is 1 
mov rcx,msg ;put address of string in rcx 
mov rdx,19 ; put length of string into rdx 
int 0x80 ; call kernel to made syscall 

; SYSCALL : exit(0) 
xor rax,rax 
xor rbx,rbx 
mov rax,93 ; make a syscall exit 93 
mov rbx, 0 ; store 0 argument into rbx, success to exit 
int 0x80 

有人能指出我有什么问题我NA SM代码和解决“分段错误(核心转储)”问题的建议。感谢任何人都可以提供帮助。

呃,你在哪里获得系统呼叫号码?你把它们从空中拉出来了吗?

64位sys_exit = 60 32位sys_exit = 1

64位SYS_WRITE = 1 32位SYS_WRITE = 4

Linux 64-bit System Call List

Linux 32-bit System Call List

Linux System Call Table for x86_64

上述链接将显示什么注册用于什么。

32位系统调用 - int 80不使用64位寄存器和寄存器参数不同。 64位系统调用是 - 系统调用。

32位sys_exit:

mov  ebx, ERR_CODE 
mov  eax, sys_exit ; 1 
int  80h 

64位sys_exit:

mov  rdi, ERR_CODE 
mov  rax, sys_exit ; 60 
syscall 

看到不同?

,如果你要创建的系统调用的名称和号码的INC文件系统(也许他们是出于某种原因不同)

grep __NR /usr/include/asm/unistd_64.h | grep define | sed -e 's/\#/\%/' -e 's/__NR_/sys_/' > unistd_64.inc 
当然

,调整到unistd_64.h的路径你系统。这对于32位来说是一样的,但我相信该文件被称为unistd_32.h。

现在我向您展示了exit sys调用和所提供的链接之间的区别,您可以修复您的写入系统调用是正确的。

+0

感谢Gunner的帮助,但我发现“系统调用”在ubuntu 64位(x86_64)上不起作用。你能指出我如何使用它? – user1884888

+0

“不工作”是什么意思?显示你如何设置参数并使用'syscall' – Gunner