1

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

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

4 回答 4

2

如果助记符是,UD_Ipop则不使用LYNX_ESPandLYNX_SP寄存器。

更多: LYNX_ESP并且LYNX_SP将具有仅设置一位的值。比方说LYNX_ESPis0x01LYNX_SPis 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_ESPLYNX_SP的位,regsUsed并保持其他位不变。

于 2012-09-19T18:33:08.540 回答
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

至于你为什么关心:这是 CPU 用来确定何时/是否可以并行执行指令的事情。例如,如果你有类似的东西:

pop ecx
pop ebx
pop eax

您不能轻松地并行执行所有这三个操作,这并不是(必然)立即显而易见的。每个都写入一个不同的寄存器,所有三个都依赖并修改SP/中的值ESP- 您上面的代码似乎专门用于提取/跟踪这种依赖关系。

于 2012-09-19T18:37:55.023 回答
0

'如果 ulnstr.mneminic 等于 UD_lpop 则在 regsUsed 中清除所有在 LYNX_ESP 和/或 LYNX_SP 中设置为 1 的位

于 2012-09-19T18:35:12.077 回答
0

该代码正在执行按位数学运算以设置某些标志。我不会在这里快速写一个不充分的解释,而是将你链接到这篇文章,它解释了发生了什么。

于 2012-09-19T18:38:16.030 回答