免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
本次游戏没法给
内容参考于:微尘网络安全
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:12.x86游戏实战-汇编指令and or not
neg 是取反之后加+1
shr 是右移运算
shl 是左移运算
sar 是右移运算,它与shr的区别是sar会看最高位(最左边第一个位就是最高位),最高位是1它会补1shr不管是不是1它都会补0
代码
首先是neg eax,如下图现在eax的值被我手动改成了1
手动改计算机的值的方式,双击下图红框位置
在下图红框位置输入要改成的数字,然后点确认
然后执行neg eax,然后它就变成了FFFFFFFF,也就是-1,如果是not这个取反它的结果会是-2
然后再手动把eax的值改成2
然后执行shr eax,2,这个一句的意思是往右移动两位(右移几位取决于shr eax,2中的2,这里写3它就移动3位,写几就移动几位,shl、sar也是同理)它的结果就变成了0
变成0的原因,2的二进制是010,往右移2为就是000,下图红色横线标出来的两个0就是通过shr指令加的,一般这种加的两个0会被称为补两个0
然后再次把eax的值手动改成2
然后执行shl eax, 2,然后eax的值就变成了8
变成8的原因,二进制并不是图里写的就那么几位,计算机中32位程序里有32位,64位里有64位,图里写的位数少是为了好看
现在eax的值是8
然后执行sar eax,2,然后结果是2,最高位是0它就补0,最高位是1它就补1
然后把eax 的值改成FFFFFFFF,也就是-1
然后执行sar eax,2,结果还是-1,最高位是1它补1合着没变化
c++代码
#include <iostream> #include "Windows.h" int main() { int a = 10; int b = 2; int c = 3; int d = 4; int e = -1; _asm { neg a shr b,2 shl c, 2 sar d,2 sar e, 2 } printf("%d, %d, %d, %d, %d", a, b, c, d, e); printf("===="); }