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

如何在x86_64汇编(yasm)中向STDIN传递非打印ASCII字节

输入非打印ASCII字节到x86_64汇编程序的通用方法

针对你用x86_64 YASM汇编程序通过SYS_read读取STDIN时,需要输入像0x90这类非打印ASCII字节的问题,这里有几个通用的实现方法,覆盖不同场景需求:

1. 用printf生成并管道输入(最通用的命令行方式)

几乎所有类Unix系统都预装了printf,它支持用\xXX格式直接输出十六进制对应的字节,不管是否可打印。比如要输入单个0x90字节:

printf '\x90' | ./your_assembly_program

如果需要输入多个字节序列(比如0x90、0x48、0x83):

printf '\x90\x48\x83' | ./your_assembly_program

这种方式完全不需要交互,适合脚本化测试或者批量输入场景。

2. 使用Shell的Here-String/Here-Doc传递输入

如果不想用管道,也可以用Shell的here-string直接传递字节数据:

./your_assembly_program <<< "$(printf '\x90\x0a')"

如果需要多行输入(注意会自动添加换行符0x0a),可以用here-doc:

./your_assembly_program << EOF
$(printf '\x90\x41')
EOF

3. 创建字节文件并重定向输入

先把需要的字节写入一个二进制文件:

printf '\x90\x00\x7f' > input_bytes.bin

然后让程序从这个文件读取输入:

./your_assembly_program < input_bytes.bin

这种方法适合需要重复使用相同输入的测试场景,文件可以反复调用。

4. 终端交互式输入(适合手动调试)

你提到的<Ctrl+Shift+U>是X11终端的标准方法(输入十六进制码后按回车确认),除此之外还有终端特有的方式:

  • Linux控制台(非X11环境):按住<Alt>键,然后用小键盘输入字节对应的十进制数值(比如0x90对应十进制144,按1、4、4),松开Alt即可输入该字节。
  • macOS终端:开启“使用Option键作为Meta键”后,按住<Ctrl+Shift+U>,输入十六进制码,再按空格确认输入。

5. 汇编程序内直接构造测试数据(无需外部输入)

如果只是调试程序逻辑,不想依赖外部输入,可以直接在汇编代码里预定义需要的字节序列:

section .data
    test_input db 0x90, 0x48, 0x83, 0xec, 0x10 ; 自定义字节序列
    input_len  equ $ - test_input

section .text
global _start
_start:
    ; 直接使用test_input中的数据,替代SYS_read读取STDIN的步骤
    ; 后续处理逻辑...

这种方式完全脱离外部输入,适合快速验证程序逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:05:30