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

Bash中cmp结合进程替换用法及MIPS编解码C程序批量测试咨询

问题1:在Bash中结合进程替换使用cmp命令

cmp本身是用来对比两个文件内容的工具,但借助Bash的进程替换(<(command)语法),我们可以直接把命令的stdout当作“虚拟文件”传给cmp,完全不用先把输出写到实际文件里,非常高效。

给你几个实用的场景示例:

  • 对比两个命令的输出结果:比如想验证ls -l和ls -la(排除.和..)的输出是否一致:
    cmp <(ls -l) <(ls -la | grep -v '\.\.')
    
  • 对比本地文件和命令输出:比如你有一个生成配置的脚本gen_config.sh,想确认它的输出和参考配置config_ref.txt是否匹配:
    cmp config_ref.txt <(./gen_config.sh)
    
  • 只关心结果是否一致,不想看差异细节?加上-s选项,通过$?判断返回值(0表示一致,1表示不同):
    cmp -s <(command1) <(command2)
    if [ $? -eq 0 ]; then
        echo "输出完全一致"
    else
        echo "输出存在差异"
    fi
    

核心逻辑很简单:<(command)会让Bash创建一个临时管道(或者/dev/fd下的文件描述符),把命令的stdout导向这个“虚拟文件”,cmp就像操作普通文件一样去对比它。


问题2:MIPS指令编码/解码程序的大规模测试方案

既然你已经有了test.asm(参考汇编指令)和test.bin(对应正确机器码),可以分编码测试和解码测试两部分来验证你的C程序,下面是具体的实现思路:

一、测试编码功能(汇编→机器码)

目标:验证你的程序把test.asm转成的机器码,和test.bin完全一致。

  1. 用你的编码程序处理test.asm,输出二进制文件:
    假设你的编码程序叫mips_encode,运行:

    ./mips_encode test.asm > my_encode_result.bin
    

    注意:要确保你的程序输出的字节序和test.bin一致(MIPS默认是大端字节序,如果你的程序输出小端,结果会直接不匹配)。

  2. 用cmp直接对比二进制文件:

    cmp my_encode_result.bin test.bin
    

    如果没有任何输出,说明完全一致;如果有差异,cmp会告诉你第一个不同的字节位置。

  3. 想更直观看差异?把二进制转成十六进制文本再对比:

    xxd test.bin > test_hex.txt
    xxd my_encode_result.bin > my_encode_hex.txt
    diff test_hex.txt my_encode_hex.txt
    

    这样能清楚看到哪一行哪一个字节不一样。

二、测试解码功能(机器码→汇编)

目标:验证你的程序把test.bin转成的汇编指令,和test.asm逻辑一致(注意先统一格式)。

  1. 用你的解码程序处理test.bin,输出汇编文件:
    假设解码程序叫mips_decode,运行:

    ./mips_decode test.bin > my_decode_result.asm
    
  2. 预处理汇编文件,统一格式:
    test.asm可能有注释、多余空格、大小写差异,直接diff会误判。用sed清理一下:

    # 清理原参考文件:去掉注释、合并多余空格、去除首尾空格
    sed -e '/^#/d' -e 's/[[:space:]]\+/ /g' -e 's/^[[:space:]]//' -e 's/[[:space:]]$//' test.asm > clean_test.asm
    # 用同样规则清理你的程序输出
    sed -e '/^#/d' -e 's/[[:space:]]\+/ /g' -e 's/^[[:space:]]//' -e 's/[[:space:]]$//' my_decode_result.asm > clean_my_decode.asm
    
  3. 对比清理后的文件:

    diff clean_test.asm clean_my_decode.asm
    

    没有输出说明解码结果完全一致;有差异的话,diff会显示具体的行差异。

三、自动化测试脚本

为了方便重复测试,可以写一个bash脚本自动完成上述步骤:

#!/bin/bash

# 替换成你的程序和测试文件名称
ENCODE_PROG="./mips_encode"
DECODE_PROG="./mips_decode"
TEST_ASM="test.asm"
TEST_BIN="test.bin"

# 测试编码功能
echo "=== 测试编码功能 ==="
$ENCODE_PROG $TEST_ASM > my_encode.bin
if cmp my_encode.bin $TEST_BIN; then
    echo "✅ 编码测试通过!"
else
    echo "❌ 编码测试失败!差异如下:"
    xxd $TEST_BIN > test.hex
    xxd my_encode.bin > my_encode.hex
    diff test.hex my_encode.hex | head -20  # 只显示前20行差异
fi

# 测试解码功能
echo -e "\n=== 测试解码功能 ==="
$DECODE_PROG $TEST_BIN > my_decode.asm
# 清理格式
sed -e '/^#/d' -e 's/[[:space:]]\+/ /g' -e 's/^[[:space:]]//' -e 's/[[:space:]]$//' $TEST_ASM > clean_test.asm
sed -e '/^#/d' -e 's/[[:space:]]\+/ /g' -e 's/^[[:space:]]//' -e 's/[[:space:]]$//' my_decode.asm > clean_my_decode.asm
if diff clean_test.asm clean_my_decode.asm; then
    echo "✅ 解码测试通过!"
else
    echo "❌ 解码测试失败!差异如下:"
    diff clean_test.asm clean_my_decode.asm | head -20
fi

# 清理临时文件
rm -f my_encode.bin my_decode.asm clean_test.asm clean_my_decode.asm test.hex my_encode.hex

保存为test_mips_prog.sh,给它加执行权限chmod +x test_mips_prog.sh,运行就能自动完成测试了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:27:00