宝可梦红/蓝Recover技能故障分析:为何代码使用sbc指令?
宝可梦红/蓝Recover技能失效问题研究
我正在研究宝可梦红/蓝中出现的一个奇怪bug:当宝可梦当前HP比最大HP恰好少255时,使用Recover技能会触发失效问题。
我参考的宝可梦红/蓝反汇编代码中,该功能相关逻辑位于.healEffect标签下。
已梳理的代码触发逻辑
该bug的核心触发原因是开发人员错误使用了仅支持8位数值的cp指令做HP值比较,截断了高位比特,属于典型的编程失误,具体示例如下:
- 测试数值:最大HP为703,当前HP为448,两者差值恰好为255
- 对应二进制表示:
703 = 00000010 10111111
448 = 00000001 11000000
- 截断高位后的8位数值:最大HP变为191,当前HP变为192,该非法比较会触发进位标志。
待解答的疑问
目前我无法理解的是此处sbc指令的使用逻辑:执行sbc时会计算 当前HP - 最大HP - 进位值,以上述示例计算结果为0,程序会误判为满血导致技能失效。cp指令的误用可以解释为编程失误,但sbc本身是用于多字算术运算的指令,而HP是16位数值,我无法想到该场景下使用sbc的合理原因,希望得到相关解答。
内容的提问来源于stack exchange,提问作者Gummysaur
相关产品推荐
相关产品推荐

