汇编

初识汇编

搭配视频食用效果更佳(B站狂神说)

机器语言

人和人之间沟通需要相同的语言,中国人说中文,日本人说日语,美国人说英语等。而与计算机沟通使用的是机器语言。

什么是机器语言?

# 目前主流的电子计算机!
状态: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-20200626170439172

进制

常见的进制包括:2进制、8进制(0开头)、10进制、16进制(0x开头)。

可以使用win10自带的计算机来换算

image-20200626171745728

学习进制的阻碍

10进制!

人类天然的选择的就是10进制,正常人都有10个指头(不论是手还是脚),而想要学好其他进制就得跳出固有的10进制思维。

测试

# 一进制 1~20 
1
1 1 
1 1 1 
1 1 1 1 
..... 
# 十进制: 
0 1 2 3 4 5 6 7 8 9 10 
# 三进制: 
0 1 2 10 11 12 20 21 22 100 101 102 100 101 102 110 111 112 120 121 122 
# 二进制
0 1 10 11 100 101 110 111 1000 
# 七进制 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对吗?如果你可以使用进制来解答这个问题,那么你就学会

了!

进制可以自己随便定义,用自己定义的进制来进行加密解密可以大大减少被破解的概率。

进制怎么运算

# 八进制计算下面的结果 
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 
# 八进制计算下面的结果 九九乘法表=加法表! 
277+333 = 
276*54 = 
237-54 = 
234/4 = 

八进制乘法表:

1*1=11*2=21*3=31*4=41*5=51*6=61*7=7
2*2=42*3=62*4=102*5=122*6=142*7=16
3*3=113*4=143*5=173*6=223*7=25
4*4=204*5=244*6=304*7=34
5*5=315*6=365*7=43
6*6=446*7=52
7*7=61

八进制加法表:

1+1=2
1+2=32+2=4
1+3=42+3=53+3=6
1+4=52+4=63+4=74+4=10
1+5=62+5=73+5=104+5=115+5=12
1+6=72+6=103+6=114+6=125+6=136+6=14
1+7=102+7=113+7=124+7=135+7=146+7=157+7=16
# 运算的本质就是查数 

# 加法
277 
333 + 
-------- 
632 

# 乘法
  276
   54 *
-------- 
 1370
1666 + 
-------- 
20250 

# 减法的本质其实就是加法! 
237-54 = 237 + (-54) 

# 除法的本质,除数乘以那个数最接近结果即可! 
234
  4 
---- 
 47 

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

二进制

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

量子计算机:(传道)

可以实现量子计算的机器。

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

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

光子:正交偏振方向。

磁场:电子的自旋方向。

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

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

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

2019年,Google研究人员展示其最新54比特量子计算机,该计算机只用200秒便可计算完毕当前世界最大的超级计算机需1万年进行的运算。

2020年,6.18霍尼韦尔宣布已经建造了目前世界上性能最好的量子计算机,量子体积达到64,其性能是下一代量子计算机的两倍,甚至超过了谷歌、IBM、英特尔的同类产品。

霍尼韦尔还表示,将在一年之内得到至少10个有效量子比特,相当于1024个量子体积。量产!

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

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

二进制: 
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

这就是我们的16进制。

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

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

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

数据宽度

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

image-20200626200741839

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

位 0 1

字节 0~0xFF 8位

字符 0~0xFFFF 16位

双字符 0~0xFFFFFFF 32位

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

有符号数/无符号数

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

无符号数规则

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

1 0 0 1 1 0 1 0 十六进制:0x9A 十进制 154

有符号数规则

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

1 0 0 1  1 0 1 0  -26
0 0 0 1  1 0 1 0   26

原码反码补码

之后要用它来计算。

编码规则

有符号数的编码规则

原码: 最高位符号位,对齐它的为进行本身绝对值即可。

反码:

  • 正数:反码和原码相同

  • 负数:符号位一定是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得到补码
-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 

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

寄存器:mov 寄存器名, 值

image-20200626202548621

位运算

计算机现在可以存储所有的数字(整数,浮点数,字符)的,运算。!

问题:

2*8最高效的计算方式是什么? 移位

与运算 (and &)

计算机的本质。

image-20200626203054989

1011 0001 
1101 1000 
----------- 与运算。 
1001 0000

或运算 (or |)

image-20200626203200003

1011 0001 
1101 1000 
----------- 或运算 
1111 1001 

异或运算 (xor ^)

不一样的为1。

image-20200626203357846

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 

int a = 10; 
printf("%d\n",a>>2);

位运算加减乘除

计算机只认识0 1。

基本数据是建立在加、减、乘、除上的。

3+5
# 常规计算
0000 0011
0000 0101
----------
0000 1000  # 但是计算机是不会直接进行进位加的

# 计算机是如何进行加法操作的!

# 第一步:两个数做异或运算,如果不考虑进位,异或就可以直接出结果。
0000 0011 
0000 0101 
------------ 
0000 0110 # 第一次异或

# 第二步:两个数做与运算(判断进位,如果与运算结果为0,没有进位。) 
0000 0011 
0000 0101 
------------ 
0000 0001 # 第一次与

# 第三步:如果两个数与的结果中有1,则结果左移1位。 
0000 0010 # 第一次移位

# 第四步:将上一次移位后的结果和上一次异或的结果异或! 
0000 0010 
0000 0110 
------------- 
0000 0100 # 第二次异或

# 第五步:上一次移位后的结果和上一次异或的结果与(判断进位,如果与运算结果为0,没有进位。) 
0000 0010 
0000 0110 
----------- 
0000 0010 # 第二次与

# 第六步:左移
0000 0100 # 第二次移位

# 第七步: 异或
0000 0100
0000 0100
-----------
0000 0000 # 第三次异或

# 第八步:与
0000 0100
0000 0100
----------
0000 0100 # 第三次与

# 第九步:移位
0000 1000 # 第三次移位

# 第十步:异或
0000 1000
0000 0000
----------
0000 1000 # 第四次异或

# 第十一步:与
0000 1000
0000 0000
----------
0000 0000 # 第四次与

# 与运算结果全为0,不需要移位,输出最后一次异或结果。
0000 1000    8

总结:异或–>与–>移位循环,直到与的结果没有0,输出最后一次异或的值。

4-5==>4+(-5)
# 常规计算
0000 0100 
1111 1011  # -5取补码
---------- (减法:计算机是不会直接减的) 
1111 1111

# 第一步:两个数异或
0000 0100 
1111 1011
----------  异或(如果不考虑进位,异或就可以直接出结果。) 
1111 1111

# 第二部:两个数与
0000 0100 
1111 1011 
----------- 与(判断进位,如果与运算结果为0,没有进位。) 
0000 0000 

最终结果 
2进制  1111 1111 
16进制 0xff 
10进制 -1

乘:x*y, 就是 y 个 x 相加,还是加法

除:x/y, 本质就是减法,就是X 能减去多少个Y。

计算机只会做加法!

机器语言就是位运算。都是电路来实现的。这就是计算机的最底层的本质。

通过机器语言来实现加法计算器,设计电路。

汇编语言环境说明

通过指令来代替我们的二进制编码!

通过汇编指令可以给计算机发一些操作,然后让计算机执行。编译器的发展,底层的大佬,几乎都是最

原始的IDE。

在学习汇编之前,需要先掌握环境的配置(1、Vc6(程序到汇编的理解),2、OD!3、抓包工

具、4、加密解密工具)

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

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

image-20200626211700837

通用寄存器

寄存器:

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

32位 CPU 8 16 32

64位 CPU 8 16 32 64

通用寄存器,可以存储任意的东西

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

FFFFFFFF   FFFF     FF      1个F等价于0000 0000也就是8位
32位  	  16位 	   8位      L表示低8位,H表示高8位
EAX 		AX 		AL 
ECX 		CX 		CL 
EDX 		DX 		DL 
EBX			BX 		BL 
ESP 		SP 		AH 
ENP 		NP 		CH 
ESI 		SI 		DH 
EDI 		DI 		BH
存值的范围 0 ~ FFFFFFFF
对于二进制来说,直接修改值
计算机如果通过mov指令向寄存器存值。
mov 存的地址,存的数 
mov 存的地址1,存的地址1
可以将数字写入到寄存器,也可以将寄存器中的值写到寄存器。

image-20200626212255652

低八位和高八位示例。

image-20200626213020836

内存

寄存器很小,不够用。所以说,数据放到内存!

每个应用程序进程都有4GB的内存空间,空头支票,只有程序运行时,才会使用物理内存。

image-20200626213355109

1B = 8bit

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

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

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

内存地址

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

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

image-20200626213516088

这些给内存起的编号,就是我们的内存地址。

32位:寻址能力!4GB 。

FFFFFFFF+1 = 100000000,最大的值。

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

100000000 内存地址 * 8 = 位:800000000

转换为10进制:4,294,967,296

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

64位操作系统,内存地址绰绰有余!

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

image-20200626214030788

内存如何存值?

数据宽度:byte word dword

地址的位置:0xFFFFFFFF

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

汇编如何向内存中写值。 
mov 数据宽度 内存地址,1 

mov byte ptr ds:[0x19FF70],1 

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

image-20200626214254852

内存地址有多种写法

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

ds:[eax] 寄存器

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

数组 []

ds:[reg+reg*{1,2,4,8}] 数组!

ds:[reg+reg*{1,2,4,8}+4] 偏移 !

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值