如果有人帮助我理解以下代码,我将不胜感激谢谢
if (iins->uInstr.mnemonic == UD_Ipop)
regsUsed = (regsUsed & ~(LYNX_ESP | LYNX_SP));
如果助记符是,UD_Ipop
则不使用LYNX_ESP
andLYNX_SP
寄存器。
更多:
LYNX_ESP
并且LYNX_SP
将具有仅设置一位的值。比方说LYNX_ESP
is0x01
和LYNX_SP
is 0x02
。
(LYNX_ESP | LYNX_SP) -> (0x01 | 0x02) -> 0x03 (00000011b)
~(LYNX_ESP | LYNX_SP) -> 0xfc (11111100b)
regsUsed can be anything; ????????b
(regsUsed & ~(LYNX_ESP | LYNX_SP)) -> (????????b & 11111100b) -> ??????00b
所以它关闭代表LYNX_ESP
和LYNX_SP
的位,regsUsed
并保持其他位不变。
第二行相当于regUsed &= ~(LYNX_ESP | LYNX_SP);
(我很难想象为什么有人会这样写)。
推测 LYNX_ESP 和 LYNX_SP 是(可能)在每个中设置一个位的值,例如:
LYNX_EAX 1 ; 00000001b
LYNX_EBX 2 ; 00000010b
LYNX_ECX 4 ; 00000100b
; ...
LYNX_SP 64 ; 01000000b
LYNX_ESP 128 ; 10000000b
Or
将这些 ( (LYNX_SP | LYNX_ESP)
) 设置为两个位都设置的值。not
对该 ( )进行逐~
位操作会反转所有位,因此这两个位将被清除,并且所有其他位都将被设置。然后它and
在结果值和 的当前值之间进行逐位处理regsUsed
,这会清除这两个位,并保持所有其他位不变。
从更高的层次来看,我猜它使用的是负(低电平有效)逻辑——即,有一点被清除regsUsed
表明寄存器正在使用中。从更高的角度来看,它基本上是说pop
像这样的指令pop ebx
不仅使用EBX
,而且还使用SP
/ ESP
。
至于你为什么关心:这是 CPU 用来确定何时/是否可以并行执行指令的事情。例如,如果你有类似的东西:
pop ecx
pop ebx
pop eax
您不能轻松地并行执行所有这三个操作,这并不是(必然)立即显而易见的。每个都写入一个不同的寄存器,但所有三个都依赖并修改SP
/中的值ESP
- 您上面的代码似乎专门用于提取/跟踪这种依赖关系。
'如果 ulnstr.mneminic 等于 UD_lpop 则在 regsUsed 中清除所有在 LYNX_ESP 和/或 LYNX_SP 中设置为 1 的位
该代码正在执行按位数学运算以设置某些标志。我不会在这里快速写一个不充分的解释,而是将你链接到这篇文章,它解释了发生了什么。