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

ARM64架构Mac M2下汇编实现输入回显功能问题求助

问题分析与修复方案

核心问题

你的代码存在两个关键问题导致无法正确回显输入:

  1. b指令的错误使用:_main中的b是无条件跳转指令,虽然执行完_printf后会因代码顺序继续执行_read,但这种写法逻辑混乱,且_main内后续的b指令完全不会被执行,属于冗余且错误的流程控制。
  2. 未利用read的返回值:read系统调用成功后,会将实际读取的字节数存在X0寄存器中,你直接用固定的1024作为write的输出长度,会导致写入缓冲区中未被输入填充的空数据,终端输出时会被忽略或干扰正常内容显示。

修复后的代码

.global _main
.align 2

_main:
    // 输出提示信息
    mov X0, #1                      // stdout 文件描述符
    adr X1, prompt                  // 提示字符串地址
    mov X2, #17                     // 字符串长度
    mov X16, #4                     // write 系统调用号
    svc 0                           // 触发系统调用

    // 读取用户输入
    mov X0, #0                      // stdin 文件描述符
    adr X1, buffer                  // 缓冲区地址
    mov X2, #1024                   // 最大读取字节数
    mov X16, #3                     // read 系统调用号
    svc 0                           // 触发系统调用
    mov X20, X0                     // 保存实际读取的字节数到X20寄存器

    // 回显输入内容
    mov X0, #1                      // stdout 文件描述符
    adr X1, buffer                  // 缓冲区地址
    mov X2, X20                     // 使用实际读取的字节数作为输出长度
    mov X16, #4                     // write 系统调用号
    svc 0                           // 触发系统调用

    // 程序退出
    mov X0, #0                      // 返回码0
    mov X16, #1                     // exit 系统调用号
    svc 0                           // 触发系统调用

// 提示字符串
prompt: .ascii "Say something: \n"
.align 2
buffer: .space 1024

修复说明

  • 移除冗余跳转:让_main直接顺序执行各段代码,流程更清晰直观。
  • 保存并复用读取长度:将read返回的实际字节数存入X20,在write时用该值作为输出长度,确保只回显用户输入的有效内容。
  • 规范命名:将拼写错误的_prinfbuffer整合进主流程(或重命名为_printbuffer),提升代码可读性。

测试效果

运行修复后的程序,输入内容会正确回显:

❯ ./hello
Say something: 
test input
test input
❯

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 13:53:08