何时使用 NOP¶
考虑一个不显示隐形敌人生命条的游戏。隐形敌人来袭时很难察觉,如果你至少能看到它们的生命条,在战斗中会拥有巨大优势。绘制生命条的代码通常看起来像清单 8-1。
for (int i = 0; i < creatures.size(); i++) {
auto c = creatures[i];
if (c.isEnemy && c.isCloaked) continue;
drawHealthBar(c.healthBar);
}
清单 8-1:drawCreatureHealthBarExample() 函数中的循环
绘制生命条时,有隐形生物的游戏可能会用 for 循环检查屏幕范围内的生物是否隐形。如果敌人没有隐形,循环调用某个函数(本例中是 drawHealthBar())显示敌人的生命条。
有了源代码,你可以通过简单地从代码中移除 if(c.isEnemy && c.isCloaked) continue; 来迫使游戏绘制甚至隐形敌人的生命条。但作为游戏黑客,你只有汇编代码,没有源代码。简化后,清单 8-1 翻译成的汇编看起来像这样的伪代码:
startOfLoop: ; for
MOV i, 0 ; int i = 0
JMP condition ; 第一个循环,跳过增量
increment:
ADD i, 1 ; i++
condition:
i < creatures.size()