gpt4 book ai didi

linux - 段错误......在 Hello World 上

转载 作者:行者123 更新时间:2023-12-04 20:35:52 24 4
gpt4 key购买 nike

这段代码非常简单,我的 x86_64 linux 系统出现了段错误。这让我很困扰。刚刚开始使用 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 调度程序

使用系统调用(不是 int 80H)。

谢谢内特和迈克尔

32 Bit Linux SYSCALL TABLE

64 Bit Linux SYSCALL TABLE
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

最佳答案

您在 64 位模式下运行,但这是 32 位代码。如果您想要 64 位代码,则必须重写它。

您应该使用 64 位寄存器 rax, rbx等。在 64 位 Linux 中,不再使用 int 80h 进行系统调用。但是有了新的 syscall操作说明。见 http://cs.lmu.edu/~ray/notes/linuxsyscalls/举个例子(注意这里使用 AT&T 汇编语法而不是 Intel)。

或者,您可以保持代码不变,然后使用 nasm -f elf32 在 32 位模式下组装和链接它。和 ld -m elf_i386 .但是,您正在学习(相对)过时的技术。 (编辑:实际上,您的特定系统似乎没有启用 32 位兼容性,因此这对您根本不起作用。)

关于linux - 段错误......在 Hello World 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35546021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com