免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
本次游戲沒法給
內容參考于:微塵網絡安全
上一個內容:11.x86游戲實戰-匯編指令add sub inc dec
and指令是與的意思
or指令是或的意思
not指令是取反的意思
與、或、取反要從二進制開始說。二進制的范圍是0-1,也就是只有0和1兩個數
數字4的二進制是100
數字1的二進制是001
數字2的二進制是010
為什么二進制100是數字4?為什么001是數字1,為什么010是數字2?
Windows系統上有個計算器,可以很好的看出
![]()
計算器有64個位,現在計算機最大能表達的數也就64位
![]()
數字2
![]()
數字4
![]()
數字1
![]()
然后可以看出一個規律,二進制從右邊開始分別是1、2、4、8、16、24、32。。。下一個數都是上一個數乘以2的規律(這里面有數學公式,不懂數學的就不要去懂了,沒用,知道怎么看2進制就行了)
然后 011,從右邊開始數第一個(位)是1,從右邊開始數第二個(位)是1,從右邊開始數第三個(位)0,上方說右邊第一個代表數是1,右邊第二個代表數是2,所以011的十進制就是3(1+2),二進制翻譯成十進制就找出二進制中是1的位它對應的代表數,把所有是1位進行相加
與
現有兩個數字4 和 1
4的二進制是100
1的二進制是001
與操作(與是一個運算符)就把兩個數字翻譯成二進制然后對比它們的二進制如果兩個 位置都是1才是1
100 與 001,結果就是000
如下圖紅框,滿足不了都是1才是1的條件,它們都是一個1一個0
![]()
or
or是或運算符,它的作用是只要有1就是1
4的二進制是100
1的二進制是001
100 或 001,結果就是101,十進制就是6
如下圖紅框,滿足有1就是1的條件
![]()
not
not是取反,也就是0變1,1變0
4的二進制是100
nop 100結果是011,十進制是3
代碼:
現在eax的值是4
![]()
然后執行and eax, 2,結果就變成了0,100和010與不滿足都是1才是1的條件,所以都是0
![]()
然后再次手動把eax的值改成4
![]()
然后執行or eax, 2,然后就變成了6,100或010結果是110,也就是2+4=6
![]()
然后現在eax 的值是6,執行not eax,結果是 FFFFFFF9,如果帶上符號顯示那就會是-7(c++里顯示的不是-6是-7,沒有別的理由)
![]()
然后下圖紅框位置的代碼,由于11111不是有效內存地址,這里沒法執行,如果是有效內存地址它就會對內存地址里的值進行操作,這里只是表達一下or可以這樣寫,然后and的寫法與or一樣
![]()
c++代碼
![]()
#include <iostream> #include <Windows.h>int main() {int a = 4;int b = 4;int c = 6;_asm {and a, 2or b, 2not c}printf("%d %d %d", a, b, c); }
?