这段代码非常简单,但在我的x86_64 Linux系统上出现了段错误。这让我很烦恼。我刚开始学习汇编语言,请耐心等待!
使用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(而不是int 80H)。
感谢Nate和Michael
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
int 0x80
机制的64位应用程序,它也应该正常工作。 - Michael Petchuname -a
返回的结果是什么。在你的问题中展示它会很有帮助。 - Michael Petch