lmyj2me 发表于 2019-11-17 08:36

请教关于imul的疑问

本帖最后由 lmyj2me 于 2019-11-17 08:38 编辑

分析某64位游戏,这句代码 imul r8d,eax,01000193 自己用易语言实现的话和调试里面的结果不一样,不知道原因,请高手指点下,不胜感激!
此处eax=811C9D0F,r8d=811c9dc5
调试工具里面的r8d结果为:4F0B3E9D我用程序实现结果为4F0B3E9C
我的程序里面试过方法:1:r8d=eax * 0x1000193
                                       2:tmp=eax * 0x1000193
                                             r8d=tmp xor 0xffffffff两个结果都是4F0B3E9C

高手指点下怎么回事,谢谢!

苏紫方璇 发表于 2019-11-17 09:53

imul最后是补码,最后要+1的

lmyj2me 发表于 2019-11-17 10:07

eax=0x9E77B6BC的时候又不用加1了啊,这个什么时候加1,什么时候不用加1

lmyj2me 发表于 2019-11-17 10:14

不好意思,我是新人,发错版块了,还请指点下这个问题,非常感谢!

lmyj2me 发表于 2019-11-17 10:17

我试过r8d=eax * 0x1000193结果为负数时,取低8位后+1,有时候又不对,比如eax=0x9E77B6BC的时候

cndml 发表于 2019-11-22 22:00

汇编语言功底欠缺,imul是有符号数乘法,eax=811c9d0f 最高位是1说明是个负数,乘上0x1000193后结果肯定是个负数,所以其结果应该是-(0x11c9d0f × 0x1000193)=-4F0B3E9D,在64位寄存器上就是r8d=4F0B3E9D,cf位=1

lmyj2me 发表于 2019-11-24 18:34

是啊,汇编基础很差,谢谢指点,eax=811c9d0f 怎么看出最高位是1呢,应该不用转成二进制才能看出的吧
页: [1]
查看完整版本: 请教关于imul的疑问