汇编学习(未完成)

根据以下学习视频,个人整理的笔记

https://www.bilibili.com/video/BV1ni4y1G7B9?spm_id_from=333.999.0.0&vd_source=7a8946d22777450e46486d5fd60d8d4d

汇编语言入门基础知识

汇编语言是你的必经之路

语言

机器语言

  • 目前主流的电子计算机
    • 状态:0 1

这些复杂的机器语言,能简化吗?————>助记符!(汇编语言)

加		INC   编译器--->   0100 0010
减		DEC
乘		MUL
除		DIV

通过编译器把助记符转化为机器语言(把人能理解的语言转化为机器能理解的语言)

离程序的本质有一个隔阂!(因为我们不知道计算机底层),所以认识汇编语言能够接近本质

研究硬件的话,汇编是一定要会写的!写C、C++的话,理解汇编,才能知道原理

汇编一般用于底层的编写,单片机

C语言:在汇编语言上再进行简化,C语言是所有第三方高级语言的鼻祖

在这里插入图片描述

爆破:如果会汇编语言,能直接破解软件

底层相关的古老软件:VC6、OD

进制

学习进制的障碍:学习了十进制,背了九九乘法表

思想:每一种进制都有各自的计算方式!

进制

  • 1进制:逢一进一
  • 2进制:逢二进一
  • 。。。
  • 本质上是一组符号,逢几进几(逢什么符号进什么符号)!

问题:1+1=3,对吗?

我们可以自己定义一套进制来让1+1=3成立!

进制的加密:当数字量一大,总是有规律的。最终可以发现加密者使用的进制编写的程序

从学习到创造!

进制怎么运算

# 八进制计算下面的结果
2+3=
2*3=
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 

#2+3就是在2后面往后走3位

277+333 =#自己画一张八进制加法表,分分钟算出来
277*333 =#画一张八八乘法表

#乘法、除法、减法的本质其实就是加法
#除法:要找 除数 乘 谁 更接近或等于 被除数
#减法:要找 减数 加 谁 更接近或等于 被减数

#查表可得,查表即查数!运算的本质就是查数!

在这里插入图片描述

在这里插入图片描述

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

二进制

现在的电子计算机使用二进制, 0 1 电子的两种状态

物理极限:摩尔定律!(硬操作)

当摩尔定律达到一个快极致的程度,就有人去追求语言的极限,这个时候很多语言就出来了,例如并发语言(软操作)

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

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

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

光子:正交偏振方向

磁场:电子的自旋方向

21世纪,计算力快到尽头了!本质问题:落伍

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

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

电子计算机====》量子计算机!(什么时候民用还不确定)

二进制:1111 对应十进制15

二进制这么去写很麻烦!二进制能否简写?可以用十六进制简写

1111—>f

1111 1111—>ff

为什么要学习二进制?

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

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

数据宽度

数学上:0~无穷大

计算机:内存是有限制的,内存不可能无穷大。所以要给数据增加数据宽度

在这里插入图片描述

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

位 0 1

字节 0~0xFF

字 0~0xFFFF

双字 0~0xFFFF FFFF

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

有符号数和无符号数规则理解

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

规则

解析一个音频:mp3(根据MP3的编码格式去解码)

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

  • 无符号数规则
  • 有符号数规则

关于有符号数规则如何处理负数,因此引出原码反码补码这套规则

原码反码补码

有符号数的编码规则

  • 原码
  • 反码
  • 补码

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

位运算的理解

寄存器:说白了就是存值

mov 寄存器,值

计算机底层存储负数通常都是存储补码

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

经典面试题:2*8最高效的计算方式? 位运算

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

位运算

  • 与运算(and &)(脑里要有一幅串联电路,两个开关控制灯泡的图)
  • 或运算(or |)
  • 异或运算(xor ^)

在这里插入图片描述

  • 非运算(not ~)(相当于取反)
  • 算数移位运算
    • 左移(shl <<)
    • 右移(shr >>)

通过这些可以完成加减乘除

位运算的加减乘除

4+5=?

#计算机怎么操作的?
0000 0100
0000 0101
-------------(加法,计算机是不会直接加的)



#计算机的实现原理
#第一步:异或。如果不考虑进位,异或就可以直接出结果
0000 0100
0000 0101
-------------(异或)
0000 0001 	#有0的话要考虑进位

#第二步:与运算(判断进位,如果与运算结果为0,说明没有进位)
0000 0100
0000 0101
-------------(与运算)
0000 0100

#第三步:将与运算的结果,左移一位
0000 0100
-------------(左移一位)
0000 1000

#第四步:异或
0000 0001	#第一步的结果
0000 1000	#第三步的结果
-------------(异或)
0000 1001

#第五步:与运算(判断进位,如果与运算结果为0,说明没有进位)
0000 0001	#第一步的结果
0000 1000	#第三步的结果
-------------(与运算)
0000 0000

#所以最终结果就是与运算结果为0的上一个异或运算,即 0000 1001

4-5=?

#计算机怎么操作的?
4-5 ---> 4+(-5)

0000 0100
1111 1011	#-5的补码
-------------(减法)
1111 1111	#0xff == -1

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

#第二步:与运算
0000 0100
1111 1011
-------------(与运算)
0000 0000

#所以最终结果就是与运算结果为0的上一个异或运算,即 1111 1111
#1111 1111 计算机存储的负数都是补码形式
#1111 1111 ===> 原码为 1000 0001 ===> -1

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

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

计算机只会做加法!

我们可以从零设计一套进制规则,自己设计电路,来实现加减乘除。然后手动转换这个结果和值

机器语言就是位运算,都是电路来实现的。

汇编语言环境说明

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

通过汇编指令可以给计算机发一些操作,然后让计算机执行(涉及到编译器)。因此想要更接近底层,就要用远古的编译器**(更底层的编译器是OD)**

在学习汇编之前,大家先要掌握环境的配置

1、写C++的话用 VC6(从程序到汇编的理解)

2、OllDbg(52破解版可以了解一下)

3、抓包工具

4、加密解密工具

学汇编不是为了写代码!!!

学汇编不是为了写代码!!!

学汇编不是为了写代码!!!

学汇编是为了理解程序的运行本质

32位 64位(本质架构区别不大,主要是寻址能力增加了)

在这里插入图片描述

通用寄存器

弊端:不要习惯一个老师!要自发学习,兴趣和思想为驱动

寄存器:

  • 存储数据:CPU(里面有一个寄存器) > 内存 > 硬盘

32位CPU 8 16 32

64位CPU 8 16 32 64

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

  • 32位的通用寄存器只有八个

在这里插入图片描述

每个寄存器存值的范围是 0~FFFF FFFF

计算机如何向寄存器存值

  • 对于二进制来说,直接修改值
  • 汇编命令 mov 指令
mov 存的地址,存的数
mov 存的地址1,存的地址2(把地址2的值写入地址1)

不同的寄存器

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代表低八位,H代表高八位

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

内存

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

1B = 8bit

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

内存地址

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

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

在这里插入图片描述

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

32位:寻址能力 4GB

64位:128G都可以达到

位数限制内存大小

  • 32位的最大地址表示为 FFFF FFFF,一共有8*(FFFF FFFF+1)个bit,转换成十进制,再转换成G,得出结果为4GB

每个内存地址都有一个编号,可以通过这些编号向里面存值

在这里插入图片描述

内存如何存值?

  • 数据宽度:byte word dword qword
  • 地址的位置:0xFFFF FFFF

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

#汇编如何向内存中写值

mov 数据宽度 内存地址 值

mov byte ptr ds:[内存地址],值

传递的值的大小不能大于数据宽度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值