计算机底层初步了解

语言

沟通

机器语言
#我们目前主流的电子计算机
状态:0和1
#最早的程序员:穿孔卡带
加 减 乘 除

助记符!汇编语言!将人类理解的语言转化为机器能够理解的语言

加 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

进制

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

2进制:二进一,计算机

八进制:八进一, 8个符号组成

10进制:10进一,十个符号

16进制:16进一,十六个符号

#一进制 1~20
1
1 1
1 1 1
1 1 1 1
......

#三进制
0   1   2
10  11  12
20  21  22
100 101 102
110 111 112
120 121 122
200 201

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

#一组符号,逢几进几

进制如何运算

#八进制计算
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 30

#八进制计算 九九乘法表=加法表
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.

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

二进制: 0 1111
0 1 2 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

二进制简写就是16进制

0 1 2 3 4 5 6 7 8 9 a b c d e f

为了学习寄存器、内存、位!底层的每一个位的含义。汇编入门理解的基础!

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

数据宽度

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

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

位 0 1

字节 0~0xFF

字 0~0xFFFF

双字 0~0xFFFFFFF

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

有符号数和无符号数

无符号数规则

数字是什么就是什么

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

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

原码反码补码

编码规则

有符号数的编码规则

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

反码:

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

补码:

  • 正数:反码和原码相同
  • 负数:符号位一定是1,反码+1
#八位
#如果是正数,那都是一样
1
#原码 0 0 0 0  0 0 0 0
#反码 0 0 0 0  0 0 0 1
#补码 0 0 0 0  0 0 0 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

二进制需要了解是有符号数还是无符号数

位运算

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

0 1

2*8最高效的计算方式

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

位运算计算

1011 0001
1101 1000 
-------------------与运算and &
1001 0000

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

1011 0001
1101 1000 
-------------------异或运算 xor ^ 不一样就为1
0110 1001

1011 0001
-------------------非运算 not ~ 0就是1 1就是0
0100 1110

位运算(移动位)

左移:(shl <<)

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

右移:(shr >>)

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

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

位运算实现加减乘除

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的结果的上一个异或运算结果
4 + 5 = 9
0000 0100 + 0000 0101 = 0000 1001

4-5=?

#计算机操作
4+(-5)
-5 0000 0101 反码加1 1111 1010 + 1 = 1111 1011

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

乘:x*y 就是y个x相加

除:x/y 就是x能减去多少个y

计算机只会做加法

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

汇编

通过指令来代替二进制编码。

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

学习汇编的环境(1、Vc6(程序到汇编的理解)2、OD 3、抓包工具 4、加密解密工具)

建议直接学习32位汇编

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

寄存器

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

32位CPU: 8 16 32

64位CPU:8 16 32 64

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

存值范围:0~FFFFFFFF

对于二进制可以直接改值

mov指令

mov 存的地址,存的值
mov 存的地址,存的地址

可以将值写入寄存器,也可以将寄存器中的值写到寄存器

             FFFF         FF   
32位         16位          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

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

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

内存

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

1B = 8bit

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

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

内存地址

存一个数:占用的大小,数据宽度!

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

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

32位:寻址能力!4GB

FFFFFFFF + 1 = 100000000 ,最大值(内存地址)

100000000 内存地址*8 = 位:800000000

转换为十进制/8:4294967296字节

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

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

如何写值

数据宽度:byte word dword qword

地址的位置:0xFFFFFFFF

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

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

mov byte ptr ds:[0x19FF70],1

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

内存地址有多种写法

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

ds:[eax] 寄存器

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

数组[]

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值