理解vmp

 

原文做者: 海風月影_百度空間spa

vmp裏面只有1個邏輯運算指令 not_not_and 設這條指令爲P
P(a,b) = ~a & ~b效率

這條指令的神奇之處就是能模擬 not and or xor 4條常規的邏輯運算指令
怕忘記了,直接給出公式,後面的數字指須要幾回P運算百度

not(a)   = P(a,a)    1
and(a,b) = P(P(a,a),P(b,b))   3
or(a,b)   = P(P(a,b),P(a,b))   2
xor(a,b) = P(P(P(a,a),P(b,b)),P(a,b)) 5數字

上面的次數應該是最少須要的次數了,固然也能夠展開,那樣就更加複雜了
vmp用1條指令模擬了4條指令,所以逆向起來比較複雜,若是中間夾雜垃圾運算,那麼工程量非同小可
下面來證實一下上面4條等式

not(a) = ~a = ~a & ~a = P(a,a)
and(a,b) = a & b = ~(~a) & ~(~b) = P(not(a),not(b)) = P(P(a,a),P(b,b))
or(a,b) = a | b = ~(~(a|b)) = ~(~a & ~b) = ~P(a,b) = P(P(a,b),P(a,b))
xor(a,b) = ~a & b | a & ~b = ~(~(~a & b | a & ~b)) = ~(~(~a & b) & ~(a & ~b)) = ~((a | ~b) & (~a | b)) = ~(1 | 1 | a & b | ~a & ~b) = ~(a & b) & ~(~a & ~b) = P(and(a,b),P(a,b)) = P(P(P(a,a),P(b,b)),P(a,b))

上面的xor是最複雜的,不過簡化後也只須要5次運算就能夠實現了

至於eflag,eflag是根據結果來定的,因爲都是邏輯運算,因此最後取一下eflag便可

在某修改版的vm中,還能夠看到另外一個強大的指令 not_not_or 設這條指令爲Q
Q(a,b) = ~a | ~b

一樣,這一條指令能夠模擬4條常規的邏輯運算指令
怕忘記了,直接給出公式,後面數字表示須要幾回Q運算

not(a)   = Q(a,a)    1
and(a,b) = Q(Q(a,b),Q(a,b))   2
or(a,b)   = Q(Q(a,a),Q(b,b))   3
xor(a,b) = Q(Q(Q(a,a),b),Q(a,Q(b,b))) 5

基本和上面P指令相同,效率沒什麼變化
只對最複雜的xor證實一下,以防忘記

xor(a,b) = ~a & b | a & ~b = ~(~(~a & b | a & ~b)) = ~(~(~a & b) & ~(a & ~b)) = ~((~(~a) | ~b) & (~a | ~(~b))) = ~(~(~a) | ~b) | ~(~a | ~(~b)) = Q(Q(not(a),b),Q(a,not(b))) = Q(Q(Q(a,a),b),Q(a,Q(b,b)))

實在太難了,徹底搞不定啊

相關文章
相關標籤/搜索