Cheat Engine汇编注入异常:cmp指令未按预期执行求助
Cheat Engine脚本问题:区分自身与敌人血量的cmp指令未生效
尝试编写Cheat Engine脚本实现自身不受伤害但敌人正常受击的效果,基础免伤代码可正常运行,但加入cmp [edi+B08],1和jne指令后,程序始终跳转到原代码执行,无法区分自身与敌人。
注入代码如下:
[ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat alloc(newmem,2048) label(returnhere) label(originalcode) label(exit) newmem: //this is allocated memory, you have read,write,execute access //place your code here cmp [edi+B08],1 // this is not passing jne originalcode add [esi+48],500 jmp exit originalcode: movsd [esi+48],xmm1 exit: jmp returnhere "noita.exe"+589231: jmp newmem returnhere: [DISABLE] //code from here till the end of the code will be used to disable the cheat dealloc(newmem) "noita.exe"+589231: db F2 0F 11 4E 48 //movsd [esi+48],xmm1
[edi+B08]是通过内存扫描得到的偏移,原本希望用该值是否为1来区分自身与敌人的血量,但cmp指令未按预期生效,排查方向如下:
- 寄存器或偏移指向错误:确认
edi在代码执行点是否真的指向当前处理的实体对象。可以用CE调试器在cmp指令处暂停,查看edi的数值,再检查[edi+B08]的实际内容,验证是否为实体的标识位。 - 数据类型不匹配:默认的
cmp [edi+B08],1可能未指定数据大小,若[edi+B08]是4字节整数,需明确写cmp dword ptr [edi+B08],1;若是字节则写cmp byte ptr [edi+B08],1,避免因数据类型不匹配导致对比失效。 - 标识位数值错误:自身的实体标识位可能不是1,而是其他值(比如0、2)。可以在游戏中定位自身血量地址,回溯指针到实体结构,查看
B08偏移处的实际数值,再对比敌人的对应值,确认正确的区分标识。 - 代码执行时机问题:在
noita.exe+589231这个注入点,edi可能还未被正确赋值为实体指针,导致访问的是无效内存或错误数据。查看原代码上下文,确认edi的赋值逻辑,确保它指向当前血量所属的实体。
调试建议:
- 用CE调试器在注入的
cmp指令处设置断点,触发血量变化(自身掉血或敌人受击)后暂停,检查edi和[edi+B08]的实际值。 - 修改
cmp指令,明确指定数据类型,测试是否生效。 - 回溯原代码中
edi的来源,确认其指向的正确性。
内容的提问来源于stack exchange,提问作者DevFish
相关产品推荐
相关产品推荐

