day12汇编语言
数据宽度
0 1 10 11 100 101 110 111 1000(16进制8) 1001 1010 1011 1100
C和C++都需要定义数据的类型。计算机底层需要我们给这些数据定义宽度
位(bit) 0 1
字节(Byte) 0 ~0xFF
字(Word) 0~0xFFFF
双字(DWord) 0~0xFFFFFFFF
( 一个F四个1)
在计算机中,每一个数据都需要给它定义类型。定义宽度。在内存中的宽度。
编码规则
无符号的直接一样
有符号数的编码规则
原码:最高位符号位,对齐它的为进行本身绝对值即可
反码:
- 正数:反码和原码相同
- 负数:符号位一定是1,其余为对原码取反
补码:
- 正数:补码和原码相同
- 负数:符号位一定是1,反码+1
测试
# 现在说的这些都是8位
#如果是正数,那都是一样
#如果是负数
-1
#原码 1000 0001
#反码 1111 1110
#补码 1111 1111
#二进制的标志
2 10
4 100
8 1000
16 10000
32 100000
运算
与运算(and &)
电路串联 ---------- > 两个都为1 ,结果为1
1011 0001
1101 1000
------------------------- 与运算
1001 0000
或运算(or |)
电路并联 ---------- > 只要有一个为1 ,结果为1
1011 0001
1101 1000
------------------------- 或运算
1111 1001
异或运算 (xor ^)
不一样就是1
1011 0001
1101 1000
------------------------- 异或运算
0110 1001
非运算 (单目运算符 not ~)
1101 1000
--------------------- ^
0010 0111
位运算 (<< >>移动位 , 左移*2 右移/2)
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
print("%d\n",a>>2);
(<< ) @所有二进制位全部左移若干位 ,高位丢弃
(>> )@ 所有二进制位全部右移若干位 ,低位丢弃 //区别开正 0 / 负数补1
汇编工具 (1.Vc6 程序到汇编的理解、 2.OD 3.抓包工具 4.加密解密工具)
通用寄存器 (mov指令 )
8个 EAX, ECX..
内存
内存写值
mov 数据宽度(byte word dword qword) 内存地址 ,1
mov byte ptr ds:[0x19FF70],1
传递值 大小一定要和数据宽度相等
内存地址有多种写法
ds:[0x19FF70+4]
ds:[eax]
ds:[eax+4]
数组[]
ds:[reg+reg*{1,2,4,8}]
浙公网安备 33010602011771号