这段代码非常简单,我在我的x86_64 linux系统上遇到了一个seg错误。这让我很困扰。刚开始使用asm,所以请有耐心!
用NASM nasm -f elf64 test.asm组装
与ld -o test test.o链接
SECTION .text
GLOBAL _start
_start:
; print name
mov eax,4 ; sys_write
mov ebx,1 ; stdout
mov ecx,name ; start address of name
mov edx,1 ; length
int 80H ; syscall
; exit program
mov eax,1 ; sys_exit
mov ebx,0 ; success
int 80H ; sys_call
SECTION .data
name DB 'R'我的机器: Gentoo x86_64 nomultilib!我在没有IA32仿真的情况下编译了自己的内核。我应该说我的系统是一个64位的系统。这会归因于我所收到的错误吗?
$ uname -a
Linux rcepeda 4.4.1-2-ARCH #1 SMP PREEMPT Wed Feb 3 13:12:33 UTC 2016 x86_64 GNU/Linux解决方案
使用64位寄存器和64位linux调度程序
使用syscall (而不是int80H)。
谢谢内特和迈克尔·
32位Linux SYSCALL表
64位Linux SYSCALL表
SECTION .text
GLOBAL _start
_start:
; print name
mov rax,1 ; sys_write
mov rdi,1 ; stdout
mov rsi,name ; start address of name
mov rdx,7 ; length
syscall
; exit program
mov rax,60 ; sys_exit
mov rdi,0 ; success
syscall
SECTION .data
name DB "Rafael",10。
rafael@rcepeda ~/asm $ ./a.out
Rafael发布于 2016-02-22 05:45:29
您在64位模式下运行,但这是32位代码。如果你想要64位代码,你必须重写它。
您应该使用64位寄存器rax, rbx等,在64位Linux中,系统调用不再使用int 80h,而是使用新的syscall指令。有关示例,请参见http://cs.lmu.edu/~ray/notes/linuxsyscalls/ (注意,这里使用AT&T汇编程序语法而不是Intel)。
或者,您可以使用nasm -f elf32和ld -m elf_i386将代码保持不变,并以32位模式进行组装和链接。但是,你正在学习(相对地)过时的技术。(编辑:实际上,在您的特定系统上没有启用32位兼容性,因此这对您根本不起作用。)
https://stackoverflow.com/questions/35546021
复制相似问题