0
function:  mov eax,ebx   
           and ebx,1
           shl ebx,2
           jmp [ebx+Tab]
Tab:       dd F1
           dd F2
           dd F3
           dd F4
F4:        sub eax,eax
F3:        add eax,eax
F2:        sub eax,eax
F1:        ret

当 ebx = Number--> 应该在 eax 中返回 Number,否则为 0

4

2 回答 2

3

它将 eax 的副本放入 ebx,取最右边的数字 (AND) => 0 或 1,将其四倍 (SHL) => 0 或 4,通过跳转表跳转到计算地址 => F1 或 F4,如果F1(ebx 为 0,eax 为偶数)返回原始 eax,如果 F2(ebx 为 4,eax 为偶数)返回 0(eax-eax)。

F3 和 F4 未使用。

于 2012-09-20T09:58:59.850 回答
3

and ebx,1 按位与运算,结果为 0(如果 ebx 为偶数)或 1(否则)

shl ebx,2 左移 2 位(相当于乘以 4)。ebx 现在是 0 或 4。

jmp [ebx+Tab]从 Tab + ebx 获取地址并跳转到它。Tab 是四字节指针数组,ebx 为 0 或 4,因此它指向第一个 (F1) 或第二个 (F2) 元素。如果偶数跳转到 F1(返回原始值),否则跳转到 F2(其中 eax 被清除并返回零)。

于 2012-09-20T10:01:06.203 回答