gpt4 book ai didi

assembly - 试图弄清楚为什么会出现某个口袋妖怪红/蓝故障。为什么程序员在这里使用sbc指令?

转载 作者:行者123 更新时间:2023-12-04 14:50:14 25 4
gpt4 key购买 nike

我正在尝试理解 strange bug这发生在 Pokemon Red/Blue 中,如果你在你的最大 HP 正好低 255 hp 时尝试使用招式恢复,招式将会失败。

我看的代码是可以找到的反汇编here.有问题的具体代码在 .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 意思是“如果你可以从电流中减去最大值而不产生进位,这意味着电流至少是最大所以不允许操作"

关于assembly - 试图弄清楚为什么会出现某个口袋妖怪红/蓝故障。为什么程序员在这里使用sbc指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69195926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com