汇编代码读取用户输入后无法正确打印的问题解决
汇编代码无法正确打印用户输入的问题修复
你的代码存在两个关键错误,导致无法正确输出用户输入:
- 未指定输入缓冲区地址:第二个
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
修复说明
- 保存读取字节数:
sys_read执行后,把rax中存储的读取字节数转移到rbx寄存器(Linux x86-64系统调用不会修改rbx、rbp、r12-r15这些寄存器,适合用来临时保存值),避免后续改写rax时丢失该数据。 - 指定输入缓冲区:第二个
sys_write调用时,显式用lea rsi, read_msg将输出地址指向用户输入的缓冲区,确保打印的是新输入的内容。 - 设置正确输出长度:将
rdx赋值为之前保存的rbx值,保证输出长度与实际读取的字节数一致,完整打印用户输入。
内容的提问来源于stack exchange,提问作者Merd Ceferzade
相关产品推荐
相关产品推荐

