杂记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 ,最大的值

posted @ 2021-02-07 11:28  AnyTask  阅读(260)  评论(0编辑  收藏  举报
Title