二进制到汇编笔记

汇编语言

1 概述

什么是机器语言?

#我们目前的主流电子计算机! - > 量子计算机
状态:0 和 1
#最早的程序员:穿孔卡带
加 减 乘 除 指定的01命令

助记符 INC DEC MUL DIV 汇编语言

加 INC 编译器 -> 汇编语言
减 DEC 编译器 -> 汇编语言
乘 MUL 编译器 -> 汇编语言
除 DIV 编译器 -> 汇编语言

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


2 进制

2.1 进制的思想

查数

测试

# 一进制 1-20
1
1 1
1 1 1
1 1 1 1
...

# 二进制 0-20 1110=(1*2^(4-1))+(1*2^(4-2))+(1*2^(4-3))+(0*2^(4-4)) = 8+4+2+0 = 14
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001 10010 10011 10100

# 三进制 0-20  102 = (1 * 3^(3-1)) + (0 * 3^(3-2)) + (2 * 3^(3-3)) = 9+0+2 = 11
0   1   2
10  11  12
20  21  22
100 101 102
110 111 112
...

# 七进制 0-20
0  1  2  3  4  5  6 
10 11 12 13 14 15 16
20 21 22 23 24 25 26

自定义进制

加密解密 进制的加密

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


2.2 进制的运算

减法的本质是加法

除法的本质:除数乘以那个数最接近的结果即可

结论:无论什么进制,都可以通过列表的方式计算出来。


3 二进制的理解

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

量子计算机

可以实现量子计算的机器,提高计算机的计算力

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

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

光子:正交的偏振方向

磁场:电子的自旋方向

补:量子比特,量子叠加态,量子纠缠,量子并性原理...

十六进制可以简写二进制 1111 1111 = ff

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

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

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


4 数据宽度

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

强内型语言C、C++、JAVA都需要定义数据的类型,计算机底层需要我们给这些数据定义宽度

位 0 1

字节 0 -0xFF

字 0-0xFFFF

双字 0-0xFFFFFFFF

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


5 有符号数和无符号数

数据都是有宽度的,每个数据代表什么意思呢?无符号数前面的0可以省略

规则:

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

  • 无符号数规则

    数字是什么,那就是什么

1001 1010 十六进制:0x9A 十进制:154 八进制:010 011 010—>232
  • 有符号数规则

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

1001 1010如何转换?

6 原码反码补码

编码规则

有符号数的编码规则

  • 原码:最高的符号位,0为正1为负,对齐它的位,进行本身绝对值即可
  • 反码
    • 正数:反码和原码相同
    • 负数:符号位(不变)为1,其余位对原码取反
  • 补码
    • 正数:补码和原码相同
    • 负数:符号位(不变)为1,原码取反+1

结论:

  1. 正数的原反补都是一样的
  2. 负数的反码为:符号位不变,其余为按位取反
  3. 负数的补码为:符号位不变,其余位按位取反后,整体+1
  4. 如果看到一个二进制的数字,需要了解它是有符号数还是无符号数

7 位运算

概述

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

2*8 最高效的计算方式 2<<3

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

与运算(and &) 全1为1

或运算(or |)有1为1

异或运算(xor ^)同0异1

非运算(单目运算符 not ~)按位取反

位运算(移动位)

  • (shl <<) 左移 *2
    • 所有的二部制位全部左移若干位 高位丢弃 低位补0
  • (shr >>) 右移 /2
    • 所有的二部制位全部右移若干位 低位丢弃 高位补0,1(符号位决定)

8 位运算实现加减乘除

计算机只认识0 1

基本数学是建立在 加减乘除。

8.1 加法

4+5=?

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

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

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

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

#第四步:异或!
0000 0001
0000 1000
----------
0000 1001

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

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

8.2 减法

负数在计算机中是以补码存储的,补码就是 反码 + 1

4-5=?

#计算机是怎么操作4-5的?   4+(-5)
0000 0100
1111 1011
----------(减法,计算机是不会直接减的)
1111 1111 

0000 0100
1111 1011
----------(异或)
1111 1111

0000 0100
1111 1011
----------(与)(判断进位:如果与运算的结果为0,没有进位)
0000 0000

最终结果:1111 1111 16进制:ff 10进制:-1

8.3 乘除

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

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

总结:

  • 计算机只会做加法!
  • 机器语言就是位运算,都是电路来实现的,这就是计算机的最底层的本质
  • 可以通过机器语言实现加法计算器,设计电路

9 汇编学习环境

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

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

在学习汇编之前,大家需要先掌握环境的配置(1. Vc6(程序到汇编的理解),2. OD!,3.抓包工具,4.加密解密工具。)

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

《汇编语言》讲的是16位的汇编,但是现在的电脑都是32位,64位(32和64本质架构区别不大,寻址能力增加)

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

OD工具 4个窗口的信息
汇编语言 寄存器
内存信息 堆栈的信息

10 寄存器

10.1 通用寄存器

寄存器

存储数据:cpu→内存→硬盘

cpu位数 支持的寄存器位数
32位的CPU 8 16 32
64位的CPU 8 16 32 64

通用寄存器

# 32位的通用寄存器只有8个 EAX ECX EDX EBX ESP EBP ESI EDI
存值的范围:0~FFFF_FFFF

计算机如果向寄存器存值:

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

  • 对于汇编来说,使用mov指令

    mov指令 存的地址,存的数
    # 可以将数字写入到寄存器,可以将寄存器中的值写到寄存器
    

不同的寄存器

       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位

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

11 内存

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

内存条

每个应用程序都有4GB的内存空间,虚拟内存

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

1B = 8bit

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

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

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

内存地址

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

计算机中内存地址很多,空间很大,每一个空间分配一个地址,名字。这些给内存地址起的编号,就是我们的内存地址。

32位:寻址能力!4GB

FFFF FFFF+1 = 1 0000 0000,最大的值

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

内存怎么存值

需要知道的东西

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

不是任意的地址都可以写东西的,是需要申请使用的才可以。

mov 数据宽度 内存地址,值
mov [byte/word/dword/qword] ptr ds:[0x19FF70],1
# 注:只写[]中的任意一个,第二个[]需要写

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

内存地址有多种写法

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

[eax] 寄存器的地址

[eax+4] 寄存器的地址偏移

数组[]

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

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

12 后续的任务

汇编指令,内存复制,堆栈的命令,汇编语言如何写函数,堆栈传参,堆栈平衡,外挂

END

posted @   lyluoye  阅读(137)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示