首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >赛格fault...on你好世界

赛格fault...on你好世界
EN

Stack Overflow用户
提问于 2016-02-22 04:52:30
回答 1查看 1.4K关注 0票数 7

这段代码非常简单,我在我的x86_64 linux系统上遇到了一个seg错误。这让我很困扰。刚开始使用asm,所以请有耐心!

用NASM nasm -f elf64 test.asm组装

ld -o test test.o链接

代码语言:javascript
复制
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位的系统。这会归因于我所收到的错误吗?

代码语言:javascript
复制
$ 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表

代码语言:javascript
复制
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

代码语言:javascript
复制
rafael@rcepeda ~/asm $ ./a.out 
Rafael
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 elf32ld -m elf_i386将代码保持不变,并以32位模式进行组装和链接。但是,你正在学习(相对地)过时的技术。(编辑:实际上,在您的特定系统上没有启用32位兼容性,因此这对您根本不起作用。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35546021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档