杂记001. 计算机底层-汇编语言
一、二进制
1、打开计算机:Windows + R + 'calc'
2、进制代码:十六进制 HEX
十进制 DEC
八进制 OCT
二进制 BIN
3、进制的运算:查表 --> 每一种进制都有完美的运算规律,不必将其他进制转化为十进制后再运算
4、为什么要学习理解二进制?
寄存器、内存、位!底层的每一个位都是有含义的。是汇编入门的基础!
汇编高级:了解程序的深层、操作系统的内核
二、数据宽度
计算机的内存是有限制的,所以要给数据增加数据宽度!
位 0 ~ 1
字节 0 ~ 0xFF
字 0 ~ 0xFFFF
双字 0 ~ 0xFFFFFFFF
在计算机中,每一个数据都需要给它定义数据类型,就是要给它定义宽度,划分它占用的内存空间!
三、有符号数与无符号数
数据都是有宽度的,每个数据代表什么意思呢?
规则
给二进制解码规定一个规则!
无符号数规则:你这个数是什么就是什么
1 0 0 1 1 0 1 0 十六进制:0x9A
有符号数规则:最高位是符号位
#最高位是符号位 1(负数) 0(正数)
1 0 0 1 1 0 1 0
如何转换?
原码反码和补码
位运算基础
有符号数的编码规则
原码:最高位为符号位,对其他的位进行本身的绝对值即可。
反码:
- 正数:反码与原码一致
- 负数:符号位一定是1,其余位与原码相反
补码:
- 正数:补码和原码相同。
- 负数:符号位一定是1,反码+1
测试
# 以下均为八位
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
#二进制的标志
2 10
4 100
8 1000
16 10000 f 1111
……
四、位运算理解
寄存器:mov 寄存器,值
很多底层调试器,都需要通过位来判断CPU的状态。
与运算(and &)
1011 0001
1101 1000
--------- & and
1001 0000
或运算(or |)
1011 0001
1101 1000
--------- | or
1111 1001
异或运算(xor ^)
不一样就是一
1011 0001
1101 1000
--------- ^ xor
0110 1001
非运算(单目运算符 not ~)
0就是1,1就是0
1011 0001
--------- ~ not
0100 1110
与非运算(NAND)
有0出1,全1出0
或非运算(NOR)
有1出0,全0出1
位运算(移动位,左移*2,右移/2)
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
左移(shl <<)
0000 0001 @所有二进制位全部左移若干位,高位丢弃,低位补0
0000 0010
右移(shr >>)
0000 0001 @所有二进制位全部右移若干位,低位丢弃,高位补0或1(由符号位决定)
0000 0000
五、位运算的加减乘除
计算4+5=?计算机是怎么实现的呢?
#计算4+5
0000 0100
0000 0101
--------- +:计算机是不会直接加的
0000 1001
#计算机实现的原理
#第一步:异或,如果不考虑进位,异或就可以直接得到答案
0000 0100
0000 0101
--------- xor
0000 0001
#第二步:与运算(判断进位,如果与运算结果为0,没有进位)
0000 0100
0000 0101
--------- and
0000 0100
#第三步:将与运算的结果,左移一位
0000 1000 #进位的结果
#第四步:异或,将第一步和第三步的结果异或
0000 0001
0000 1000
--------- xor
0000 1001
#第五步:与运算(判断进位,如果与运算结果为0,没有进位)
0000 0001
0000 1000
--------- and
0000 0000
#所以最终的结果就是与运算为0的结果的上一个异或运算
#结果为1001
4-5=?
#计算4-5
#转化为4+(-5)
4 0000 0100
-5 1000 0101(原码) -> 1111 1010(反码) -> 1111 1011(补码)
0000 0100
1111 1011
--------- +
1111 1111
#计算机运算
#第一步:异或运算
0000 0100
1111 1011
--------- xor
1111 1111
#第二步:与运算
0000 0100
1111 1011
--------- and
0000 0000
#最终结果:1111 1111(补码)-> 1111 1110(补码的反码)-> 1000 0001(反码的原码)
减:x-y,就是x+(-y)
乘:x*y,就是y个x相加,本质还是加法
除:x/y,本质就是减法,就是x能减去多少个y
所以说,计算机只会做加法!
机器语言就是位运算,都是通过电路来实现的,这就是计算机最底层的本质!
六、汇编语言环境说明
通过指令来代替我们的二进制编码。
通过汇编指令可以给计算机发一些操作,然后让计算机执行。这又关系到编译器的发展
学习汇编之前,大家需要先掌握环境的配置(1、Vc6(程序到汇编的理解) 2、OD 3、抓包工具 4、加密解密工具)
学汇编不是为了写代码,而是为了理解程序的本质!
寄存器、内存和汇编指令
通用寄存器,可以存储任意的值
存储数据:CPU>内存>硬盘
32位CPU 8 16 32
64位CPU 8 16 32 64
通用寄存器
#32位的通用寄存器只有8个
存值范围:0~FFFFFFFF
计算机如何向寄存器存值?
mov指令
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位
除了通用寄存器以外,其他的寄存器每一位都有自己特定的功能!
内存
寄存器很小,不够用,所以数据放到内存。
每个程序进程都有4GB的内存空间,空头支票。
程序真正运行的时候,才会用到物理内存
1B = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
4G的内存,最终计算为位
计算机中内存地址很多,空间很大。
内存地址
存一个数:占用的大小,数据宽度->存到哪里?
计算机中内存地址很多,空间很大,所以要给每一个空间分配一个地址,名字!
这些给内存起的编号,就是我们的内存地址。(32位 8个16进制的值)
32位:寻址能力,4GB
FFFFFFFF +1 = 100000000 ,最大的值