故事是这样的。
昨天天我在群里看到,一个群里的朋友想测试当红的kimi k3 max。于是,就问了它 一个看起来简单的问题
risc-v 0x0ffef0b3是什么指令?
群里截图显示kimi给出的结果出人意料,让我大跌眼镜。
我有点不相信。
这么简单的问题,大模型不应该啊。
于是,我就把这条命令分别给了deepseek,智谱 ChatGLM,豆包,gemini,gork,还有chatgpt。
问了一遍之后。
怎么说呢,看到这个结果我是真的有点意外。
我当时的第一个反应是,???
机器码反汇编这东西,不就是一个纯种确定性的活儿么。
移位,掩码,查表。
没有任何需要「发挥」和「创作」的空间。
怎么还能错的?
这6个模型翻车的方式,居然各有各的脑回路。
有人位域算错了开始自由发挥,
有人字段都拆对了却不认识扩展指令,
有人连指令格式都搞混了。
每一种翻车方式,都精准地戳在大模型的某个命门上。
我觉得这事挺有意思的,值得好好聊一聊。
先把答案说了吧。
0x0ffef0b3 这条指令,正确反汇编是 czero.nez ra, t4, t6。
它来自 RISC-V 的 Zicond 条件操作扩展。
语义是:如果 rs2 非零,就把 0 写入 rd;否则把 rs1 写入 rd。代入寄存器后,即 t6 ≠ 0 时 ra = 0,t6 = 0 时 ra = t4。
真正的陷阱在于:opcode=0x33 只说明它使用 OP 类 R-type 外壳,不能据此直接套用 RV32I/RV64I 的 AND/OR 表。必须继续把 funct3 与 funct7 作为组合键,并检查扩展指令集。
Zicond 算是个比较年轻的扩展,RISC-V 在 2022 年左右把它标准化了。
它不属于那堆人人都熟悉的「基础指令」,在参数记忆里刚好落在那个「学过但没完全记住」的灰色地带。
好,下面来看看这6个模型分别是咋翻车的。
我只能说,不同的翻车,各有各的精彩。
第一个是 Kimi K3 Max。
Kimi 其实干得不错。
它正确拆出了 rd=ra、rs1=t4、rs2=t6、funct3=111、funct7=0000111,而且意识到标准 AND 的 funct7 应该是 0000000,所以不可能是 AND。
然后它说,这个组合不属于常见扩展,所以是非法指令。
就差一步啊朋友们。Zicond 就在那。但它没检索到,于是把一条标准的扩展指令判成了非法。并且它没有就此打住,还进一步猜测可能是数据污染、字节序问题、厂商自定义。开始编故障叙事了。
这就是第一种典型失败,位域拆对了,扩展知识没覆盖到,然后用猜测填补了空白。
Kimi 的回答截图
第二个是 DeepSeek。
DeepSeek 的翻车方式是我觉得最「危险」的一种。
它给出了 andn x22, x30, x31。
但正确值应该是 rd=x1、rs1=x29。所有的寄存器编号都不对。
错误发生在最基础的位提取阶段,就是从十六进制数里读二进制位的时候就错了。
然后离谱的是,它接下来把错误结果归入了 Zbb 扩展,还给它配了完整的指令语义、使用场景、注意事项。
读起来极其专业,极其流畅。你如果不是拿着规范逐字对,根本发现不了底层的字段全错了。
你想想看,如果是一个刚入门的工程师,拿到这个答案他根本不会怀疑。
这就是第二种典型失败,先算错,再自洽。
解释能力成了幻觉的放大器。
DeepSeek 的回答截图
第三个是智谱 ChatGLM。
这个属于最基础的错误,但也是最离谱的。
ChatGLM 先说是 and,然后把它按 I-type 格式拆了。I-type 的格式是 imm[11:0]、rs1、funct3、rd、opcode。给出的 opcode 是 0x23。但最低7位明明是 0x33。
这就像你把一个卡车底盘认成了轿车底盘,后面的分析就全没意义了。
这是第三种典型失败,连指令格式都选错了,结构识别完全失准。
智谱 ChatGLM 的回答截图
第四个是豆包。
豆包其实拆得挺准的,funct7=0x07、rs2=x31、rs1=x29、funct3=7、rd=x1、opcode=0x33。然后它正确排除了基础 AND、M 扩展和若干位操作编码。
但它没命中 Zicond。结论是厂商自定义或数据异常。
和 Kimi 一样,解码正确但知识不够。
但我想说,这种「我无法确认所以不乱猜」的克制,在态度上比那些瞎编一个指令的要好。虽然从结果来说都是错,但这个错法至少是诚实的。
豆包的回答截图
第五个是 Gemini。
Gemini 在字段读取阶段就出错了。rs2 被读成 x15、funct3 被读成 110。跟原始机器码对不上。
不过它没有凭空捏造一条具体的指令,而是保留了一个「自定义或非法」的模糊结论。这种做法虽然没答对,但至少没有编造一个听起来很真但其实全错的答案。
只能说位域读错让后续一切判断都没有了可靠基础。
Gemini 的回答截图
第六个是 Grok。
Grok 在这儿的表现特别有意思。
它正确地提取了 rd=x1、rs1=x29、rs2=x31、funct3=111、funct7=0000111。字段没错。
然后它说这是 or x1, x29, x31。
但是,OR 的 funct3 应该是 110,不是 111。基础 OR 的 funct7 应该是 0000000,不是 0000111。
它自己列出来的字段就已经把 OR 给排除了。它等于一边列出了「不是 OR」的证据,一边给出了「是 OR」的结论。
这是典型的「证据与结论脱节」。说真的,这种错误比单纯的「不知道」更值得警惕。模型在看到 funct3=111 和熟悉的 OP 类 opcode 后,联想到了 OR,然后硬是让文字去迎合这个猜测,哪怕自己刚写的字段数据已经把这个猜测推翻了。
Grok 的回答截图
这6个模型的翻车方式,可以归纳成三个明显的层次。
最底层是「字段读取错误」,DeepSeek、ChatGLM、Gemini 都在这个层面出问题了,连二进制位都数不对,后面的分析全是空中楼阁。
再往上一层是「字段读对了但知识覆盖不足」,Kimi 和豆包都拆对了位域,排除了标准指令,但认不出 Zicond。这不是算数的问题,是知识边界的问题。
最上面一层是「知识有但证据与结论脱节」,Grok 就是典型,字段数据已经排除了 OR,但还是给出了 OR 的结论。
唯一全部通过的是 ChatGPT。它给出了 czero.nez ra, t4, t6,字段全对,扩展归属清晰,语义准确。还额外提醒了处理器和工具链需要支持 Zicond。
ChatGPT 的回答截图
但我坦率的讲,如果只看「谁答对了」,这事就只值一条推文。
模型
位域提取
指令名
校验意识
本次评价
ChatGPT
正确
正确
较强
最佳:结论与证据闭环
豆包
正确
未识别
较强
谨慎但漏掉 Zicond
Kimi
正确
误判非法
较强
排除法好,知识缺口大
Grok
正确
误判 OR
较弱
字段与结论互相矛盾
Gemini
多处错误
未识别
一般
保守,但底层解码不可靠
DeepSeek
多处错误
误判 ANDN
较弱
错误答案被完整解释包装
智谱
格式错误
误判 AND
较弱
从指令格式开始就走错
真正有意思的,是这些翻车方式暴露出来的四个结构性问题。
第一个问题,模型会把十六进制当成文字模式匹配题。
机器码解码应该是个确定性计算,移位、掩码、查表。
但语言模型在干的,更像是文字接龙。
看到 0x33 这个熟悉的 opcode,就联想到 AND、OR,然后让后续的文字去迎合这个联想。
它不是不会算,它是压根没走「算」那条路。
它走的是「觉得像什么就说什么」。
这在很多场景下都好使,因为模式匹配覆盖了大部分常见情况。但一旦遇到需要精确计算的场景,这个机制就崩了。
第二个问题,能切字段,不等于认识扩展。
Kimi、豆包、Grok 其实都拿到了正确的位域。
他们缺的不是算数能力,是 Zicond 这个知识。
长尾扩展指令集、不同版本的规范差异、工具链支持状态,这些恰好就是参数记忆最容易模糊的区域。
大模型的知识压缩方式决定了它不可能记住所有长尾知识。
这是一个底层限制,不是靠「扩大训练数据」能解决的问题。
第三个问题,解释能力会放大幻觉的可信度。
这个我觉得是最危险的。
DeepSeek 的输出读起来非常专业。它给出了完整的指令格式拆解、扩展归属分析、备选方案、使用场景。看起来滴水不漏。你如果不是拿着 RISC-V 规范逐字核对,你根本不知道它从头到尾全错了。
这就产生了一个可怕的效应。一个刚入门的开发者,去问大模型一个机器码问题。大模型给了个「非常专业」的回答,而且是很详细、很权威的语气。这个人会直接把这个答案当真理,拿去用、去学、去教别人。
这不是假设。这就是正在发生的事情。
第四个问题,模型缺少自动一致性检查。
Grok 已经写出了 funct3=111,但结论却是 OR 的 funct3=110。ChatGLM 写出了 opcode=0x33,却按 I-type 去切字段。
任何一个有基础编程能力的开发者,看到这种矛盾都会立刻停下来,「等等,我这个字段和结论对不上」。
但模型没这个机制。
它不会回头检查自己说了什么。
生成就是终点。
这种事后验证的能力,在当前的架构下是完全缺失的。
说真的,写到这里我自己也有一些感慨。
这两年大模型的发展太快了,快到我们已经开始默认它们什么都能干。
写代码、写文章、做翻译、画图、算数学题。
在很多领域里,它们的表现确实惊艳。
但这次翻车击中了一个让我挺在意的问题,我们是不是对模型的能力边界越来越模糊了?
机器码反汇编是一个极端的测试用例。它没有任何模糊空间,对就是对错就是错。
这正是大模型最不擅长的那种任务。
它不是一个「语言问题」,它是一个「计算问题」。
语言模型的核心能力是在高维空间里做语义相似度匹配,不是按规范执行确定性的位运算。
但这并不意味着大模型在这种问题上就完全不能用。我觉得关键是要转变使用方式。
不是让模型直接给答案,而是让模型输出一条可审计的证据链。
在这类问题上,最有效的做法是要求模型按步骤输出,先把十六进制补齐32位、逐字段给出位段和二进制值、先由 opcode 确定格式再解析、用 funct7+funct3+opcode 的组合键去查表、把候选助记符反向编码验证。
每一步都展开放出来,人工扫一眼就能发现有没有问题。
这个模板的本质,是把大模型从一个「答案生成器」变成一个「带过程的工作台」。
它的流畅表述仍然是优势,但每一步的结果你都可以独立复核。
让我想起了《三体》里的一个概念,黑暗森林。
不是那个猜疑链的黑暗森林。
是宇宙里的文明交流,你收到一条信息,你永远无法确认它是不是真的,因为发出者的思维过程对你是不透明的。
你只能通过验证它的输出来间接推断。
大模型某种程度上也是这样。
你输入一个机器码,它给你一段文字。
你不知道它有没有真的「算了」还是「猜了」。
它的思维过程对你完全不透明。
你唯一能做的,就是拿到它的输出之后自己验证一遍。
以上,既然看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~
谢谢你看我的文章,我们,下次再见。
热门跟贴