assembly - 试图弄清楚为什么会出现某个 Pokemon Red/Blue 故障。为什么程序员在这里使用 sbc 指令?
问题描述
我试图了解 Pokemon Red/Blue 中发生的一个奇怪错误,如果您在低于最大 HP 255 hp 时尝试使用移动恢复,移动将失败。
我正在查看的代码是可以在此处找到的反汇编代码。有问题的特定代码位于 .healEffect 标签下。
我想我已经从代码方面弄清楚了为什么会发生这种情况。假设您的最大 HP 为 703,而您目前为 448。机器会比较您的 HP 值,以确保您没有尝试以满 HP 进行治疗。但是,程序员使用了“cp”指令,该指令仅适用于 8 位数字,切断了最高位。我认为这只是程序员错误。
703 = 00000010 10111111 448
= 00000001 11000000
去掉最高位,你的最大值变成191,电流变成192。这是不可能的,所以触发了进位。
现在我感到困惑的是为什么使用 sbc 指令。sbc 被调用,机器执行当前 HP - 最大 HP - 进位。使用上面的示例,结果为 0,这意味着在机器眼中你的 HP 已满,移动失败。
我可以将 cp 指令解释为程序员错误。但是为什么在这里使用 sbc 呢?sbc 旨在用于多字算术,但 HP 是一个 16 位数字。我很难想到在这种情况下需要 sbc 的情况。
有任何想法吗?
解决方案
要检查是否相等,您不需要进位,您可以简单地分别检查两个字节。如果您想要执行此代码明确打算执行的“更少/更大”,则进位很有用。因此,该错误jp z
应该jp nc
意味着“如果您可以从电流中减去最大值而不产生进位,这意味着电流至少与最大值一样大,因此不允许操作”
推荐阅读
- r - 根据二分网络边列表中的公共顶点创建新边列表
- json - 我在 JSON 文件中嵌套了数据,并且正在使用嵌套结构。如何快速访问嵌套在第一个结构中的值
- javascript - javascript下载按钮而不是右键单击
- git - 如何浏览图像的 git 历史记录
- javascript - 为什么 await 让我的 for 循环非常慢?
- laravel - 是否可以从 Laravel 中的 hasmany 关系中返回特定的索引元素?
- raspberry-pi - Raspberry Pi Pico - 使用 Macbook 烧写程序
- python-3.x - 向服务器发送数据时如何正确上传图像
- javascript - React Context TypeError:BlurChangeValue 不可迭代
- powerbi - 用逻辑覆盖列 - PowerQuery