二进制到汇编学习

二进制到汇编学习

语言

人和人沟通?语言!老外!计算机!学习计算机的语言!

什么是机器语言?

# 我们目前主流的电子计算机!
状态 0和1
# 最早的程序员,穿孔卡带!
加 0100 0000
减 0100 1000
乘 0100 1000 0100 1000
除 0100 1000 1100 1000

这些复杂的机器语言能简化吗?助记符!汇编语言!人能够理解的语言转换成为机器能够理解的语言!

加 INC -编译器->  0100 0000
减 DEC 			0100 1000
乘 MUL			0100 1000 0100 1000
除 DIV			0100 1000 1100 1000

离程序的本质:隔阂!汇编一般用于底层的编写。(单片机)

C语言

加 A+B -编译器->  0100 0000
减 A-B 			0100 1000
乘 A*B			0100 1000 0100 1000
除 A/B			0100 1000 1100 1000
  • image-20220924082245630
  • image-20220924082328221
进制

二进制?0 / 1

学习进制的障碍?10进制!

人类天然的选择的就是十进制,因为人类就是有十根手指头。跳出固有思维的方法!(屈指可数)

二进制

思想:每一种进制都是完美的,都有自己的计算方式!

进制?

1进制:逢1进1,结绳记事。

2进制:逢2进1,计算机 0 1

8进制:逢8进1,8个符号组成:0 1 2 3 4 5 6 7

10进制:逢10进1,10个符号组成:0 1 2 3 4 5 6 7 8 9

16进制:逢16进1,16个符号组成:0 1 2 3 4 5 6 7 8 9 a b c d e f

进制远远没有大家想的那么复杂:查数。

​ 测试

# 一进制 1~20
1
1 1
1 1 1
.......
# 三进制 1~20
0   1   2
10  11  12
20  21  22
100 101 102
110 111 112
120 121 122
# 七进制 1~20
0  1  2  3  4  5  6
10 11 12 13 14 15 16
20 21 22 23 24 25 26

#一组符号,逢几进几

问题:你真的理解进制了吗?1+1=3对吗?!如果你可以使用进制来解答这问题,那你就学会了。

十进制:0 1 2 3 4 5 6 7 8 9

XX的十进制:0 2 4 7 8 a b r d f,可以自己随便定义的,学习,创造者!

加密程序:程序员,破解程序的人!进制的加密

数字量一大,总是有规律的。

进制怎么运算
# 八进制计算下面的结果
2+3=5
2*3=6
4+5=11
4*5=24

# 运算的本质就是查数
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27
0 1 2 3 4 5 6 7 8  9  10 11 12 13 14 15 16 17 18 19 20 21 22 23

# 八进制计算下面的结果 九九乘法表=jia'fa'b
277+333=632
276*54=20250
#减法的本质其实就是加法!
237-54=163
#除法的本质:除数乘以那个数最接近的结果即可!
234/4=47

八进制的乘法表:

image-20220928075148583

八进制的加发表:

image-20220928075241251

结论:无论是什么进制,本身都是有一套完美的运算体系的,我们都可以通过列表的方式将它计算出来!

二进制

计算机使用二进制 0 1!状态!电子!物理极限:摩尔定律!硬操作!追求语言的极限!并发语言!软操作!

量子计算机:

可以使用使用量子计算的机器。

传统的计算机:集成电路!0 1。硅晶片!

量子计算机的单位:昆比特。(量子比特)量子的两态来表示。

光子:正交偏振方向.

磁场:电子的自旋方向.

21世纪我们的计算力快到尽头了!【落伍】本质问题!

量子计算机,提高计算机的算力。

量子比特,量子叠加态,量子纠缠,量子并行原理……

电子计算机——>量子计算机!

回到我们的电子计算机!0 1

#二进制, 0  1111

0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

二进制这么去写很麻烦!二进制能否简写?

0 1 2  3  4   5   6   7   8    9    a    b    c    d    e    f
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

这就是我们的16进制。

操作系统!

课本上的教学!2进制转换为10进制,然后计算!

100+101 = 1001
#按位 2的零次方+2的一次发+......=10 进制——>二进制
0111 (1+2+4)= 7

为什么要学习理解二进制?

寄存器,内存,位!底层的每一个位都是有含义的。汇编入门理解的基础。

汇编高级:了解程序的深层。操作系统的内核?

数据宽度

数学上:0~无穷大

计算机:内存!给数据增加数据宽度。

C和C++,Java都需要定义数据的类型。计算机底层需要我们给这些数据定义宽度。

位 0 1

字节 0~0xFF

字 0~0xFFFF

双字 0~0xFFFFFFFF

在计算机中,每一个数据都需要给它定义类型。给它定义宽度。在内存中的宽度。

有符号数和无符号数

数据都是有宽度的。每个数据代表什么意思呢?

0 1 0 1 0 1 0 1

规则

二进制解码增加一个规则:

  • 无符号数的规则

    你这个数字是什么,那就是什么。

    1 0 0 1 1 0 1 0 十六进制:0x9A 十进制::154
    
  • 有符号数规则

    最高位是符号位:1(负数)0(正数)

    1 0 0 1 1 0 1 0 如何转换十六进制?
    
原码反码补码

之后我们要用原码反码补码来进行运算。

编码规则

有符号数的编码规则:

原码:最高位是符号位,对其他的位进行本身绝对值即可。

反码:

  • 正数:反码和原码相同。
  • 负数:符号位一定是1,其余位对原码取反。

补码:

  • 正数:反码和原码相同
  • 负数:符号位一定是1,反码+1

​ 测试

# 现在我说的这些都是8位
#如果是正数,那都是一样的

1
#原码:0000 0001
#反码:0000 0001
#补码:0000 0001

#如果是负数
-1
#原码:1000 0001
#反码:1111 1110
#补码:1111 1111

-7
#原码:1000 0111
#反码:1111 1000
#补码:1111 1001

如果看到一个数字(二进制的),我们需要了解它是有符号数还是无符号数。

二进制的标志......
2	10
4	100
8	1000

寄存器:mov寄存器,值

正数直接存放,负数在寄存器中以补码的形式存储。

学习通过直接操作来查看是最有效的。

位运算

计算机现在可以存储所有的数字(整数)的。运算。

0 1

位运算

2*8最高效的计算方式。

很多底层的调试器,需要通过位来判断CPU的状态。

与运算(and &)

计算机的本质:

image-20220929201817742
#两个都为1,结果为1
1011 0001
1101 1000
-------------与运算
1001 0000

或运算(or |)

image-20220929202126866
#只要有一个为1,结果为1
1011 0001
1101 1000
-----------或运算
1111 1001

异或运算(xor ^)

image-20220929202506997

不相同才能连通。

#不一样就是1
1011 0001
1101 1000
-----------异或运算
0110 1001

非运算(单目运算符 not ~)

# 0就是1,1就是0,取反
1101 1000
----------非运算
0010 0111

通过这些可以完成我们的加减乘除!位运算来实现加减乘除。

位运算(移动位)

左移(shl <<):

0000 0001	@所有的二进制位全部左移若干位,高位就丢弃了,低位补0
000 00010

右移(shr >>):

0000 0001	@所有二进制位全部右移若干位,低位就丢弃了,高位就需要补0,1(符号决定)
0000 0000	@负数补1,正数补0


# 左移*2,右移/2
0000 0001	1
0000 0010	2
0000 0100	4
0000 1000	8

汇编的本质就是直接操作二进制数。

二进制,位运算=>加减乘除

位运算的加减乘除

计算机只认识0 1

基本数学是建立在加减乘除之上的。加法

4+5?

# 计算机是怎么操作的?
0000 0100
0000 0101
-----------(加法,计算机是不会直接加的)
0000 1001
#计算机只懂与,或,非,异或
#计算机的实现原理
# 第一步异或。如果不考虑进位,异或就可以直接出结果。
0000 0100
0000 0101
-----------
0000 0001
#第二步,与运算(判断进位!如果与运算结果为0,说明没有进位。不为0则说明有进位。)
0000 0100
0000 0101
-----------
0000 0100
#第三步,将与运算的结果,左移一位。 0000 1000 (进位的结果)
#第四步,异或!
0000 0001
0000 1000
-----------
0000 1001
#第五步,与运算(判断进位!如果与运算结果为0,说明没有进位。不为0则说明有进位。)
0000 0001
0000 1000
-----------
0000 0000
#所以最终结果就是与运算为0的结果的上一个异或运算。

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. Vc 6(程序到汇编的理解)
  2. OD
  3. Wireshark,抓包工具
  4. 加密解密工具

学汇编不是为了写代码,就是为了理解程序的本质。

王爽老师的《汇编语言》16位的汇编,现在的计算机至少都是32位的。(64位和32位本质架构区别不大,主要是寻址能力增加)建议大家可以直接学习32位的汇编。

汇编入门:了解汇编和程序的对应关系,程序的本质即可。

image-20220929212957660

寄存器,内存,汇编指令。

通用寄存器

寄存器:

存储数据:CPU>内存>硬盘

CPU分为32位和64位:

32位CPU 8 16 32

64位CPU 8 16 32 64

64位是根据32位演进过来的。架构和结构体系都是一样的,只是增加了寄存器,增加了寻址能力。

通用寄存器

#32位的通用寄存器只有8个
image-20220929214251668

存值的范围:0~FFFFFFFF

对于二进制来说,直接修改值

计算机如何往寄存器里存值:

mov指令

mov存的指令,存的数
mov存的地址1,存的地址2

可以将数字写入到寄存器,,可以将寄存器中的值写到寄存器。

计算器:计算力!

不同的寄存器:

FFFFFFFF FFFF	 FF
32168位
EAX 	AX		 AL
ECX		CX		 CL	
EDX		DX		 DL
EBX		BX		 BL
ESP		SP		 AH
ENP		NP		 CH
ESI		SI		 DH
EDI		DI		 BH

8位:L低8位,H高8位

除了这些通用寄存器之外,其他的寄存器每一位都有自己特定的功能;

内存

寄存器很小,而且不够用,所以说我们会把数据放到内存中。

平时买的内存条。

每个应用程序都有4GB的内存空间。空头支票。

程序真正运行的时候,才会用到物理内存。

1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB

4G的内存,4096m==>最终计算为位,就是这个可以存储的最大容量。

计算机中的内存地址很多,空间很大。

内存地址

存一个数:占用的大小,数据宽度。WORD DWORD 存到哪里?

计算机中内存地址很多,空间很大,每个空间分配一个地址,名字。

这些给内存起的编号,就是我们的内存地址。32位 8个16进制的值

32位:寻址能力!4GB

FFFF+FFFF+1=100000000,最大的值。

位是怎么限制内存大小的。

100000000 内存地址*8=位:800000000

转换为10进制/8;4,294,967,296字节

按照规则/1024,最终发现就是4GB!

所以每个内存地址都有一个编号!可以通过这些编号往里面存值。

image-20220929222203890

内存如何存值?

数据宽度:byte word dword

地址的位置:0xFFFFFFFF

不是任意的地址都可以写东西的,申请使用的。只有程序申请通过的内存地址我们才可以使用。

#汇编如何向内存中写值
mov 数据宽度 内存地址,1
mov 数据宽度(byte/word/dword/qword) ptr ds:[内存地址],值

传递的值的大小一定要和数据宽度相等

内存地址有多种写法

ds:[0x19FF70+4]内存地址偏移

ds:[eax]寄存器

ds:[eax+4]寄存器偏移

数组[]:

​ ds:[reg+reg*(1,2,4,8)]

​ ds:[reg+reg*(1,2,4,8)+4]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游子无寒衣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值