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 =數量 - >如果是應該EAX返回數甚至否則爲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 =數量 - >如果是應該EAX返回數甚至否則爲0這個方案是如何工作的,以及如何跳工作
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被清零並返回零)。
它採用的EAX拷貝到EBX,採用最右邊的如果F1(ebx爲0,eax爲偶數)返回原始數字(AND)=> 0或1,則將其四倍化(SHL)=> 0或4,跳轉到跳轉表的計算地址=> F1或F4 eax,如果F2(ebx是4,eax不均勻)返回0(eax-eax)。
F3和F4未使用。
但dd的每個是4個字節,所以4的偏移量是指F2,而不是F4。 – harold
沒錯,我相應地更新了我的答案。 – lilalinux