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

64位x86 Ubuntu环境下汇编代码换行打印异常求助

问题分析与解决方案

你的代码核心问题是print函数缺少ret指令,导致调用该函数后无法返回调用点,程序执行流程完全混乱:

  • 第一次调用print打印提示字符串时,执行完int 0x80后,程序不会回到_start的第28行,而是直接往下执行read函数的代码,接着进入quit函数退出程序——打印换行的代码(第29-31行)根本没机会执行,所以看不到换行。
  • 移除第一个打印块后,直接调用print打印换行时,执行完int 0x80后程序会继续执行read函数,此时SYS_READ会等待用户输入,而之前的换行已经输出到标准输出,所以你能看到换行,但这只是巧合,程序流程依然错误。

修正后的代码只需在print和read函数末尾添加ret指令,确保函数调用后能正确返回:

section .data
        queryUserNumber db 'Pick a number between 1 and 100:'
        queryUserNumberLength equ $ - queryUserNumber
        guessText db 'Is the number? '
        guessTextLength equ $ - guessText

        newline db 10
        newlineLength equ $ - newline

        ; SYSTEM CONSTANTS
        SYS_EXIT equ 1
        SYS_WRITE equ 4
        SYS_READ equ 0
        STDOUT equ 1
        STDIN equ 0

section .bss
        userNumber resb 4
        guess resb 4

section .text
 global _start

_start:
        mov ecx, queryUserNumber
        mov edx, queryUserNumberLength
        call print

        mov ecx, newline
        mov edx, newlineLength
        call print

        call quit

print:
        mov eax, SYS_WRITE
        mov ebx, STDOUT
        int 0x80
        ret  ; 添加ret指令返回调用点

read:
        mov eax, SYS_READ
        mov ebx, STDIN
        int 0x80
        ret  ; 同样添加ret指令

quit:
        mov eax, SYS_EXIT
        xor ebx, ebx
        int 0x80

另外补充:你在64位Ubuntu系统中使用32位的int 0x80系统调用是可以正常运行的,但如果要编写原生64位汇编,建议使用syscall指令及对应的64位系统调用号(比如SYS_WRITE的64位调用号是1,SYS_EXIT是60),不过这不是当前问题的核心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:20:58