文章目录
数据宽度
计算机底层需要我们给这些数据定义宽度。
位 0 1
字节 0~0xFF
字 0~0xFFFF
双字 0~0xFFFFFFFF
在计算机中,每一个数据都需要给它定义类型。给它定义宽度,在内存中的宽度。
有符号数无符号数
无符号规则
这个数字是什么,就是什么
有符号数规则
最高位是符号位:1(负数) 0(正数)
原码反码补码
有符号数的编码规则
原码:最高位符号,对其他的位进行本身的绝对值即可。
反码
- 正数:反码和原码相同
- 负数:符号位一定是1,其余位对原码取反
补码:
- 正数:补码和原码相同
- 负数:符号位一定是1,反码 + 1
# 现在我们说的这些是 8 位
# 如果是正数,那都是一样的。
1
#原码 0 0 0 0 0 0 0 1
#反码 0 0 0 0 0 0 0 1
#补码 0 0 0 0 0 0 0 1
# 如果是负数
-1
#原码 1 0 0 0 0 0 0 1
#反码 1 1 1 1 1 1 1 0
#补码 1 1 1 1 1 1 1 1
-7
#原码 1 0 0 0 0 1 1 1
#反码 1 1 1 1 1 0 0 0
#补码 1 1 1 1 1 0 0 1
位运算
计算机现在可以存储所有的数字(整数,浮点数,字符)的运算。
0 1
此篇笔记是观看B站上狂神老师的免费课总结的,感谢狂神老师!
与运算(and &)
1001 0001
1101 1000
-------------
1001 0000
或运算(or |)
1011 0001
1101 1000
-------------
1111 1001
异或运算(xor ^)
不一样就是1。
1011 0001
1101 1000
-------------
0110 1001
非运算 (单目运算符 not ~ )
0就是1,1就是0,取反
1101 1000
------------
0010 0111
通过这些可以完成加减乘除……
位运算(移动位)
左移:( shl <<)
0000 0001 @ 所有二进制全部左移若干位,高位就丢弃了,低位补0
0000 0010
右移:(shr >>)
0000 0001 @ 所有二进制全部右移若干位,低丢弃了,高位就需要补0,1(符号位决定)
0000 0000
位运算的加减乘除
4+5?
# 计算机是怎么操作的
0000 0100
0000 0101
-----------(加法:计算机是不会直接加的)
0000 1001
#计算机的实现原理
# 第一步:异或 (如果不考虑进位,异或可以直接出结果。)
0000 0100
0000 0101
-----------
0000 0001
# 第二步:与运算(判断进位,如果与运算结果为0,没有进位。)
0000 0100
0000 0101
-----------
0000 0100
# 第三步:将与运算的结果,左移一位。 0000 1000 # 进位的结果
# 第四步:异或
0000 0001
0000 1000
------------
0000 1001
# 第五步:与运算(判断进位,如果与运算结果为0,没有进位。)
0000 0001
0000 1000
-----------
0000 0000
# 所以最终结果就是与运算为0的结果的上一个异或运算。
4-5?
# 计算机是怎么操作的!
4+(-5)
0000 0100
1111 1011
----------- (减法:计算机是不会直接减的)
1111 1111 ff -1
0000 0100
1111 1011
----------- 异或(如果不考虑进位,异或就可以直接出结果。)
1111 1111
0000 0100
1111 1011
----------- 与运算(判断进位,如果与运算结果为0,没有进位。)
0000 0000
最终结果 1111 1111 16 ff 10 -1
#
乘法:x*y, 就是 y 个 x 相加
除法:x/y, 本质就是减法,就是x能减去多少个Y
机器语言就是位运算。都是电路来实现的。就是计算机的最底层本质。
汇编语言
通过汇编指令可以给计算机发一些操作,然后让计算机执行。编译器的发展,底层的大佬,几乎都是最原始的IDE。
在学习汇编之前,大家需要先掌握环境的配置(1、Vc6 (程序到汇编的理解)2、OD! 3、抓包工具 4、加密解密工具)
学汇编是为了理解汇编的本质。
《汇编语言》 16位的汇编 32位 64位 (本质架构区别不大)
通用寄存器
寄存器:
存储数据:CPU > 内存 > 硬盘
32位 CPU 8 16 32
64位 CPU 8 16 32 64
通用寄存器
32位通用寄存器只有8个
EAX ECX EDX EBX
ESP EBP ESI EDI
存储的范围 0~FFFFFFFF
对于二进制来说,直接修改值
计算机向寄存器存值
mov 存的地址,存的数
mov 存的地址1,存的地址2
可以将数字写入到寄存器,可以将寄存器中的值写道寄存器。
不同的寄存器
FFFFFFFF FFFF FF
32位 16位 8位
EAX AX AL
ECX CX CL
EDX DX DL
EBX BX BL
ESP SP AH
EBP BP CH
ESI SI DH
EDI DI BH
8位:L低8位, H高8位
除了这些通用的寄存器之外,那么其他的寄存器每一位都有自己特定的功能!
内存
寄存器很小,不够用。所以说,数据放到内存。
内存如何存值?
数据宽度:byte word Dword
地址的位置:0xFFFFFFFF
汇编如何向内存中写值
mov 数据宽度 内存地址,1
mov byte ptr ds:[0x19ff70],1
传递的值的大小一定要和数据宽度相等
内存地址有多种写法
ds:[0x19FF70] 内存地址偏移
ds:[eax] 寄存器
ds:[eax+4] 寄存器偏移
数组 []
ds: [reg+reg*{1,2,4,8}] 数组
ds: [reg+reg*{1,2,4,8}+4] 偏移