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

汇编代码读取用户输入后无法正确打印的问题解决

汇编代码无法正确打印用户输入的问题修复

你的代码存在两个关键错误,导致无法正确输出用户输入:

  • 未指定输入缓冲区地址:第二个sys_write调用时,没有重置rsi寄存器指向存储用户输入的read_msg缓冲区,系统调用会沿用之前load_msg的地址,因此打印旧内容。
  • 输出长度设置错误:sys_read的返回值(实际读取的字节数)原本存在rax中,但你在调用sys_write前将rax改写为1(sys_write的调用号),随后把rdx赋值为rax的值(即1),导致只会打印1个字节。

修复后的代码

.global _start
.intel_syntax noprefix

_start:

    # Write "Hello, World!"
    mov rax, 1          # syscall number for sys_write
    mov rdi, 1          # file descriptor 1 (stdout)
    lea rsi, load_msg   # pointer to the message to be written
    mov rdx, 14         # message length
    syscall

    # Read user input
    mov rax, 0          # syscall number for sys_read
    mov rdi, 0          # file descriptor 0 (stdin)
    lea rsi, read_msg   # pointer to the buffer to store user input
    mov rdx, 255        # maximum number of bytes to read
    syscall             # rax now holds the number of bytes read

    # 保存读取到的字节数到rbx(Linux系统调用会保留rbx寄存器的值)
    mov rbx, rax

    # Write user input
    mov rax, 1          # syscall number for sys_write
    mov rdi, 1          # file descriptor 1 (stdout)
    lea rsi, read_msg   # 指向用户输入的缓冲区
    mov rdx, rbx        # 使用实际读取的字节数作为输出长度
    syscall

    # Exit
    mov rax, 60         # syscall number for sys_exit
    mov rdi, 0          # exit code 0
    syscall

load_msg:
    .asciz "Hello, World!\n"

read_msg:
    .space 256

修复说明

  1. 保存读取字节数:sys_read执行后,把rax中存储的读取字节数转移到rbx寄存器(Linux x86-64系统调用不会修改rbx、rbp、r12-r15这些寄存器,适合用来临时保存值),避免后续改写rax时丢失该数据。
  2. 指定输入缓冲区:第二个sys_write调用时,显式用lea rsi, read_msg将输出地址指向用户输入的缓冲区,确保打印的是新输入的内容。
  3. 设置正确输出长度:将rdx赋值为之前保存的rbx值,保证输出长度与实际读取的字节数一致,完整打印用户输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:07:41