免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
上一个内容: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, 2 or b, 2 not c } printf("%d %d %d", a, b, c); }