x64中.byte数组与.asciz字符串是否等价?printf打印异常咨询
x64架构下.byte与.asciz数组的差异及printf输出问题解决
两者的核心差异
.asciz声明的是带空字节(\0)终止的字符串,完全符合C标准字符串格式,printf等函数会以此终止符判断输出结束位置。.byte仅用于定义原始字节序列,不会自动添加终止空字节。如果没有手动追加\0,它就是一段无结束标记的字节数据,无法被printf的%s格式符正确识别。
printf无输出的解决方法
当你用read系统调用读取数据到.byte缓冲区后,必须做两个关键处理:
- 手动追加终止空字节:read只会写入读取到的原始字节,不会自动加\0。拿到read的返回值(成功读取的字节数n)后,要在缓冲区的第n个位置写入
0,确保形成符合C标准的字符串。 - 预留缓冲区空间:定义.byte缓冲区时,要额外留至少1字节的空间用于存放终止空字节,避免溢出。
举个汇编代码示例:
section .bss buffer: .byte 0x00, 0x00, 0x00, 0x00, 0x00 ; 5字节缓冲区,预留1字节给终止符 section .text global _start _start: ; 调用read读取标准输入到buffer mov rax, 0 ; sys_read系统调用号 mov rdi, 0 ; 标准输入文件描述符 mov rsi, buffer mov rdx, 4 ; 最多读4字节,留1字节给终止符 syscall ; 手动添加终止空字节 mov byte [rsi + rax], 0 ; rax存储read返回的读取字节数 ; 调用printf输出内容 mov rax, 0 ; 调用libc函数时rax传0 mov rdi, format ; format为预定义的输出格式 mov rsi, buffer call printf ; 退出程序 mov rax, 60 mov rdi, 0 syscall section .data format: .asciz "%s\n"
内容的提问来源于stack exchange,提问作者TheSinisterStone
相关产品推荐
相关产品推荐

