ARM64架构Mac M2下汇编实现输入回显功能问题求助
问题分析与修复方案
核心问题
你的代码存在两个关键问题导致无法正确回显输入:
b指令的错误使用:_main中的b是无条件跳转指令,虽然执行完_printf后会因代码顺序继续执行_read,但这种写法逻辑混乱,且_main内后续的b指令完全不会被执行,属于冗余且错误的流程控制。- 未利用
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
相关产品推荐
相关产品推荐

