repne
0047094C |. 8B0D 34935E00 |MOV ECX,DWORD PTR DS:[5E9334]
00470952 |. F2: |PREFIX REPNE:
00470953 |. 0F2AC1 |CVTPI2PS XMM0,MM1
00470956 |. F2: |PREFIX REPNE:
00470957 |. 0F100D 88905E00 |MOVUPS XMM1,DQWORD PTR DS:[5E9088]
0047095E |. F2: |PREFIX REPNE:
0047095F |. 0F5CC8 |SUBPS XMM1,XMM0
00470962 |. F2: |PREFIX REPNE:
00470963 |. 0F2CD1 |CVTTPS2PI MM2,XMM1
00470966 |. 8915 5C925E00 |MOV DWORD PTR DS:[5E925C],EDX
是什么但是奇怪的是,在Im调试时,跳过了前缀repne之后的指令(单步执行时)。我的直觉告诉我这只是垃圾代码,但我想确保没有其他事情发生,因为我必须重写此特定函数(使用了更多的sse指令)
如果有人可以说明一点,我将不胜感激。谢谢
#1 楼
前缀不是垃圾-它们是原始指令的替代,以产生新指令。您的反汇编程序显然不了解SSE2指令,而是将它们分开。拆卸应如下所示:
0047094C |. 8B0D 34935E00 |MOV ECX,DWORD PTR DS:[5E9334]
00470952 |. F20F2AC1 |CVTSI2SD XMM0,ECX
00470956 |. F20F100D 88905E00 |MOVSD XMM1,DQWORD PTR DS:[5E9088]
0047095E |. F20F5CC8 |SUBSD XMM1,XMM0
00470962 |. F20F2CD1 |CVTTSD2SI EDX,XMM1
00470966 |. 8915 5C925E00 |MOV DWORD PTR DS:[5E925C],EDX
评论
你是绝对正确的!我一直忙于深入查看,以至于我什至没有注意到IDA Pro正确地分解了说明。 Olly和其他调试器似乎属于不支持SSE2并分离前缀的反汇编程序。谢谢!
– Gandolf
15年7月29日在16:35
fwiw odbg201和windbg都可以正确分解流
– blabb
15年7月29日在20:19
评论
repne是“不相等时重复”的助记符-因此,如果在执行到达该地址时将零标志设置为0,则该指令将不会执行。如果清除零标志,则最多可以执行n次,其中n为ecx的值;如果指令可以更改零标志,则重复次数可能更少。因此,如果可以确定在执行指令之前已设置ZF,则这是垃圾代码,但是指令未在单个调试器跟踪中得到执行并不意味着总是这样。