最通俗易懂的计算机底层教学,二进制到汇编学习

汇编语言

汇编语言-编译器--》0100000(机器语言)
汇编一般用于底层的编写,单片机

进制

1进制:一进一,结绳记事。11
2进制:二进一,计算机
八进制:八进一。8个符号组成:01234567
10进制:10进-。10个符号组成:0123456789
16进制:16进-。16个符号组成:0123456789abcdef

狂神的十进制:02478abrdf,可以自己随便定义的,学习,创造者!
加密解密:程序员,破解程序的人!进制的加密(自己定义进制)
数字量一大,总是有规律的!

进制的运算

八进制计算下面结果
2+3=5(2后面往3位)
23=6(3个2)
4+5=11
4
5=24
运算的本质就是查数
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 20 21 22 23 24 25

277+333=632
276*54=20250

277
333
-----
632

276
 54
----
 1370
1666
----
20250

减法的本质其实就是加法

除法的本质 其实就是乘法,47*4,找到最接近234的数

234
4

47

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

二进制和16进制的深层理解

计算机使用二进制0 1 状态:电子 物理极限:摩尔定律

追求语言的极限,并发操作,Go语言

量子计算机:使用量子计算的机器
传统计算机:集成电路0:1 硅晶片

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



示例:

二进制 1101 1010 → 十六进制 DA
1101 → D,1010 → A
二进制 0011 1110 → 十六进制 3E
(左侧补零后)0011 → 3,1110 → E
2. 十六进制 → 二进制
规则:将每位十六进制数直接展开为 4 位二进制数(按上表反向对应)。
示例:
十六进制 F5 → 二进制 1111 0101
F → 1111,5 → 0101
十六进制 A3 → 二进制 1010 0011
A → 1010,3 → 0011

  1. 为什么这种关系重要?
    简化表达:
    二进制数过长时(如 1101 1010 1111 0001),用十六进制表示为 DAF1,更易读写。
    例如,内存地址、颜色代码(如 #FF0000 表示红色)均用十六进制简化二进制表达。
    计算机底层兼容性:

计算机以二进制存储数据,但十六进制更便于人类理解和调试(如查看内存数据或机器码)。
快速转换:

无需通过十进制中转,直接按 4 位分组转换,效率极高。

  1. 应用场景
    编程与调试:内存地址、寄存器值常用十六进制显示(如 0x1A3F)。
    网络协议:MAC 地址(如 00:1A:2B:3C:4D:5E)使用十六进制。
    文件编码:二进制文件内容常以十六进制形式查看(如 Hex 编辑器)。

总结
二进制和十六进制的关系本质是 4 位二进制 ⇄ 1 位十六进制,这种设计既保留了二进制在计算机中的底层逻辑,又通过十六进制提升了人类处理数据的效率。

忘记十进制的运算,不要将二进制转化为十进制来计算,而是直接用二进制来运算,这样才能学会汇编

为什么要学习理解二进制?
寄存器,内存,位,底层每一个位都是有含义的,汇编入门的基础!
汇编高级:了解程序的深层,操作系统的内核

数据宽度的理解

计算机:内存!给数据增加数据宽度
C和C++ JAVA都要定义数据类型,计算机底层需要我们给这些数据定义宽度
位 01
字节 0-0xFF(如果直接写 FF,编译器可能认为它是一个 变量名 或 字符串(如 "FF"),而非数值。加上 0x 后(如 0xFF),程序会明确知道这是一个 十六进制数。)
双字 0-0XFFFFFFF
在计算机中,每一个数据都需要给它定义数据类型,给它定义宽度,在内存中的宽度

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

无符号数规则
你这数字是什么,那就是什么
1001 1010 十六进制:0X9A 十进制154,一般都是二进制往十六进制转,不往十进制

有符号数规则
最高位是符号位:1(负数) 0(正数)
1001 1010 如何转换?原码反码补码

案例补充
为什么有符号的范围是-128-127,无符号的范围是0-255?
有符号和无符号整数的范围差异源于二进制位的分配方式不同,尤其是符号位的存在以及计算机用补码表示负数的方式。下面以 8位(1字节) 整数为例详细解释:

  1. 无符号整数(Unsigned)
    所有8位均用于表示数值,没有符号位:

最小:0000 0000 ➔ 0
最大:1111 1111 ➔ 255
计算方式:2⁸ - 1 = 256 - 1 = 255
(所有位为1时,是从0到255共有256个可能值)
2. 有符号整数(Signed)
最高位(第8位)为符号位,剩下7位表示数值。
关键点:计算机用补码(Two's Complement) 表示负数,具体规则如下:

正数:符号位为 0,其余位直接表示数值(如 0010 1010 = 42)。
负数:符号位为 1,其他位通过取反后加1得到绝对值的二进制(如负数 -42 表示为 1101 0110)。
范围计算
最大正数:0111 1111 ➔ 127
(符号位为0,其他7位全1:2⁷ - 1 = 127)
最小负数:1000 0000 ➔ -128
原因:补码系统的特殊设计,1000 0000不表示-0,而是分配到-128,使得范围对称性被打破,但能多表示一个负数。
因此,有符号8位整数的范围是 -128 到 127(共256个数)。

原码反码补码

补充,帮助理解,现在计算机用补码表示负数

原码、反码和补码是计算机中用于表示有符号整数的三种编码方式。以下是它们的定义及示例说明:

1. 原码(Sign-Magnitude)
定义:最高位为符号位(0正1负),其余位表示数值的绝对值。
特点:
直观,但加减法需处理符号位,硬件实现复杂。
0有两种表示(+0和-0),如 00000000 和 10000000。
示例(8位):
+5:00000101
-5:10000101
2. 反码(Ones' Complement)
定义:
正数:与原码相同。
负数:符号位不变,其余位按位取反。
特点:
简化了减法,但仍有正负零问题。
示例(8位):
+5:00000101(与原码相同)
-5:
原码:10000101
反码:11111010
3. 补码(Two's Complement)
定义:
正数:与原码相同。
负数:反码加1。
特点:
统一加减法运算,消除正负零问题,硬件实现简单。
现代计算机普遍使用补码。
示例(8位):
+5:00000101(与原码相同)
-5:
原码:10000101
反码:11111010
补码:11111011
案例演示
场景1:计算 5 - 5
补码运算:
5 的补码:00000101
-5 的补码:11111011
相加:00000101 + 11111011 = 1 00000000(溢出后结果为 00000000,即 0)。
场景2:计算 3 + (-2)
补码运算:
3 的补码:00000011
-2 的补码:11111110
相加:00000011 + 11111110 = 1 00000001(溢出后结果为 00000001,即 1)。
关键区别总结
编码方式	正数表示	负数表示	0的表示	硬件实现
原码	符号位+绝对值	符号位+绝对值	+0和-0(两种)	复杂(需处理符号)
反码	与原码相同	符号位不变,其余位取反	+0和-0(两种)	较简单
补码	与原码相同	反码加1	唯一0(00000000)	最简单
补码的溢出处理
溢出规则:
若符号位进位(最高位溢出)且数值位无进位,结果为负数(如 -128 的补码 10000000)。
若符号位和数值位均进位,结果为正数(如 -1 + (-1) 补码运算:11111111 + 11111111 = 1 11111110,溢出后为 -2)。
总结
原码:直观但运算复杂,适合人类阅读。
反码:过渡方案,仍存在双零问题。
补码:计算机标准,高效统一加减法,彻底解决零的歧义。

编码规则
有符号数的编码规则
1、原码:最高位是符号位,对齐它的为本身绝对值
2、反码:
--正数:反码和原码相同
--负数:符号位一定是1,其余位对原码取反
3、补码:
--正数:反码和原码相同
--负数:符号位一定是1,反码+1

示例
1
原码 0000 0001
反码 0000 0001 
补码 0000 0001
结论:如果是正数,原码、反码、补码都是一样的
-1
原码 1000 0001
反码 1111 1110 
补码 1111 1111 就是1111 1110+1
-7
原码 1000 0111
反码 1111 1000
补码 1111 1001

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

位运算理解-计算机的运算方法,不是我们理解的加减乘除

学习通过直接操作查看最有效,往寄存器存了-1,计算机显示FFFFFFFF 1111 1111...计算机是用补码进行存储
本质就是加减乘除
1就是接通,0就是没接通
与运算(and &)
计算机的本质

这个图的理解就是两个开关,只要其中一个开关接通了电路就能通
1011 0001
1101 1000
---------与运算,
1001 0000

或运算(or |)

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

异或运算(xor^)
不一样就是1 相同就是0

1011 0001
1101 1000
--
0110 1001

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

1110 0001
----
0001 1110

位运算(移动位,左移*2,右移除2)
左移*2 右移/2这只是相对于十进制而言
相对于计算机(纯二进制理解)
左移:(shl<<)
0000 0001 所有二进制位全部左移若干位,高位就丢弃了,低位补0
0000 0010

右移:(shr>>)
0000 0001 所有二进制位全部右移若干位,低位就丢弃了,高位补0,1(符号位决定)
0000 0010

0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8

位运算实现加减乘除

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

计算机的实现原理

解释为什么会存在上面的步骤
第一步:如果不考虑进位的情况,异或运算和正常的加法是一样的结果
第二步:由于与运算不为0,所以肯定是存在进位1的情况,所以计算机会将与运算的结果向左移一位(就像正常的进位一样)
第三步:继续异或(就是相当于加法)
第四步:继续与运算判断,如果为0,那就是第三步异或后的结果了,如果不为0,那就继续进位,继续上面的流程
帮助理解位运算的链接
上面链接间帮助理解位运算的,这个案例有点抽象

汇编

在学习汇编之前,大家需要先掌握环境的配置 1、Vc6(程序到汇编的理解),2、OD!3、抓包工具、4、加密解密工具)前面两个工具是重点
C语言(应用)汇编(安全)二进制

寄存器

posted @ 2025-02-27 14:07  乘加法  阅读(169)  评论(0)    收藏  举报