You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编Hello World程序运行报错:Bad system call (core dumped)求助

32位汇编程序运行报错"Bad system call (core dumped)"的问题排查

问题描述

这是一个名为Lab.asm的基础Hello World汇编程序:

汇编代码

section .text

global _start

_start:
  mov eax, 4
  mov ebx, 1
  mov ecx, message
  mov edx, message_len
  int 0x80
  
section .data
  message db "Hello, World!", 0x0a
  message_len equ $-message

编译命令

rm Lab.o
rm lab
nasm -f elf -F dwarf -g Lab.asm
ld -m elf_i386 -o lab Lab.o

编译并运行该程序时,出现错误:Bad system call (core dumped),且无法找到核心转储文件进行gdb调试。


问题原因与解决办法

核心原因

你编写的是32位x86汇编程序,但当前运行环境大概率是64位Linux系统。64位Linux默认可能未完全启用32位程序的系统调用支持,或者缺少32位兼容库,导致执行int 0x80时触发非法系统调用。另外,原程序缺少退出系统调用,进程输出后未正常终止,也可能引发后续异常。

修复步骤

  1. 补充退出系统调用
    在输出操作的int 0x80后添加退出代码,确保进程正常终止:

    ; 执行完输出后添加退出调用
    mov eax, 1  ; 32位exit系统调用号
    mov ebx, 0  ; 退出码0表示正常结束
    int 0x80
    
  2. 安装32位兼容库

    • Debian/Ubuntu系系统:
      sudo apt-get install gcc-multilib libc6-i386
      
    • RHEL/CentOS系系统:
      sudo yum install glibc.i686
      
  3. 启用核心转储(可选)
    若需要生成核心转储文件用于调试,先设置核心转储大小限制:

    ulimit -c unlimited
    

    重新运行程序后,当前目录会生成core文件,即可用gdb调试:

    gdb ./lab core
    

替代方案:改用64位汇编

如果系统是64位,更推荐直接编写64位汇编,使用syscall指令而非int 0x80,示例代码如下:

section .text
    global _start

_start:
    ; write系统调用(64位)
    mov rax, 1        ; 64位write调用号为1
    mov rdi, 1        ; 文件描述符1=标准输出
    mov rsi, message  ; 字符串地址
    mov rdx, message_len ; 字符串长度
    syscall

    ; exit系统调用(64位)
    mov rax, 60       ; 64位exit调用号为60
    mov rdi, 0        ; 退出码0
    syscall

section .data
    message db "Hello, World!", 0x0a
    message_len equ $-message

编译命令改为:

rm Lab.o
rm lab
nasm -f elf64 -F dwarf -g Lab.asm
ld -o lab Lab.o

内容的提问来源于stack exchange,提问作者Cheesebellies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:00:49