理解给定的代码

时间:2012-09-19 18:31:19

标签: c x86

如果有人帮助我理解下面的代码,我将不胜感激 谢谢

if (iins->uInstr.mnemonic == UD_Ipop)
    regsUsed = (regsUsed & ~(LYNX_ESP | LYNX_SP));

4 个答案:

答案 0 :(得分:2)

如果助记符为UD_Ipop,则不会使用LYNX_ESPLYNX_SP寄存器。

多一点: LYNX_ESPLYNX_SP将具有仅设置一位的值。假设LYNX_ESP0x01LYNX_SP0x02

(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_SPregsUsed的位,并保留其他位。

答案 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,它解释了发生了什么。