如果有人帮助我理解下面的代码,我将不胜感激 谢谢
if (iins->uInstr.mnemonic == UD_Ipop)
regsUsed = (regsUsed & ~(LYNX_ESP | LYNX_SP));
答案 0 :(得分:2)
如果助记符为UD_Ipop
,则不会使用LYNX_ESP
和LYNX_SP
寄存器。
多一点:
LYNX_ESP
和LYNX_SP
将具有仅设置一位的值。假设LYNX_ESP
为0x01
而LYNX_SP
为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
的位,并保留其他位。
答案 1 :(得分:2)
第二行相当于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
/ {{1 }}
至于你关心的原因:这是CPU确定何时/是否可以并行执行指令所做的事情。例如,如果你有类似的东西:
pop ecx
pop ebx
pop eax
并非(必然)立即表明你不能轻易地并行执行所有这三个。每个写入不同的寄存器,但这三个都依赖并修改SP
/ ESP
中的值 - 上面的代码似乎专门用于提取/跟踪这种依赖性。
答案 2 :(得分:0)
'如果ulnstr.mneminic等于UD_lpop,则清除regsUsed在LYNX_ESP和/或LYNX_SP'中设置为1的所有位
答案 3 :(得分:0)
代码正在进行逐位数学运算以设置某些标志。我没有在这里快速写出不充分的解释,而是将你链接到this article,它解释了发生了什么。