计算机语言

机器语言

电子计算机状态: 0, 1

汇编语言

助记符:

加 INC   <-编译器->  0100 0000

减 DEC

乘 MUL

除 DIV

C语言

加 A+B  <-编译器->

减 A-B

乘 A*B

除 A/B

进制

一组符号,逢几进几

一进制:一进一 结绳记事

二进制:二进一,计算机

八进制:八进一,符号 0-7

10进制:10进一,符号 0-9

16进制:16进一,符号 0 1 2 3 4 5 6 7 8 9 a b c d e f

进制的运算

运算的本质就是查数

八进制:0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27

2+3 = 5
2*3 = 6
4+5 = 114*5 = 24

277+333 = 632
276*54  = 20250
237-54  = 
234/4   = 47

 277 
 333 +
----------
 632

 276
  54 x
----------
 1370
1666  +
----------
20250

减法的本质是:加法 a-b = a +(-b)

除法的本质是:除数乘以哪个数最接近结果,除不完就会多出余数

计算机分类

传统计算机

电子计算机,集成电路 0,1 硅晶片

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

语言极限:并发语言(软操作)

量子计算机

提高计算机的计算力。

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

光子:正交偏振方向

磁场:电子的自旋方向

二进制

1111

0  1  10  11  100  101  110  111  1000  1001  1011  1100  1101  1110  1111

二进制的简写(16进制)

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

寄存器、内存、位。底层的每一个位都有含义。

数据宽度

计算机内存是有限制的。给数据增加数据宽度

bit(位)             1位 []

Byte(字节)      8位 [] [] [] [] [] [] [] []

World(字)       16位

DWord(双字)  32位

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

bit(位)             0-1

Byte(字节)      0-0xFF

World(字)       0-0xFFFF

DWord(双字)  0-0xFFFFFF

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

有符号数和无符号数

无符号数规则

10011010 –(16进制)–> 0x9A

1000 –(16进制)–> 8

有符号数规则

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

10011010

数据运算

原码、反码、补码

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

反码:

正数:反码和原码相同

负数:符号位一定是1,其余位对原码取反

补码:

正数:补码和原码相同

负数:符号位一定是1,反码+1

1 写成8位:

原码 0000 0001
反码 0000 0001
补码 0000 0001

-1 写成8位:

原码 1000 0001
反码 1111 1110
补码 1111 1111

-7 写成8位:

原码 1000 0111
反码 1111 1000
补码 1111 1001

位运算

td>| td>^ td>~

and &
or
异或 xor
not

位运算(移动位)

<操作/td> 二进制 十进制
0000 0001 1
左移1位 0000 0010 4
左移1位 0000 0100 8

左移相当于乘2,右移除2

左移(shl <<)

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

0000 0010

9 << 2

     9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)

在数字 x 上左移 y 位时,得出的结果是 x * 2^y,即 9 << 2 = 9 * 2^2

右移(shr >>)

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

0000 0000

9 >> 2

     9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 >> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

-9 >> 2

     -9 (base 10): 11111111111111111111111111110111 (base 2)
--------------------------------
-9 >> 2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)

相比之下, -9 >> 2 得到 -3,因为符号被保留了。

无符号右移

该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用 0 填充。因为符号位变成了 0,所以结果总是非负的。

对于非负数,有符号右移和无符号右移总是返回相同的结果。

9 >>> 2 和 9 >> 2 一样返回 2:

      9 (base 10): 00000000000000000000000000001001 (base 2)
--------------------------------
9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

但是对于负数却不尽相同。

-9 >>> 2 产生 1073741821 这和 -9 >> 2 不同:

      -9 (base 10): 11111111111111111111111111110111 (base 2)
--------------------------------
-9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10)
 -9 >> 2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)

使用位运算进行加减乘除

加法:4+5

 0000 0100
+0000 0101
-----------(加法)
0000 1001

step 1: 异或运算(如果不考虑进位,异或可以直接出结果)

0000 0100
0000 0101
----------- xor
0000 0001

step 2: 与运算(判断进位,与运算为0,没有进位)

0000 0100
0000 0101
----------- and
0000 0100

step 3: 与运算结果,左移一位

0000 1000

step 4: 异或运算

0000 0001
0000 1000
----------- xor
0000 1001

step 5: 与运算(判断进位,与运算为0,没有进位)

0000 0001
0000 1000
----------- and
0000 0000

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

减法:4-5  -> 4+(-5)

 0000 0100
-0000 0101
-----------(减法,计算机需要换成补码)

 0000 0100
+1111 1011
-----------(加法)
 1111 1111 -> ff(计算机存储,16进制) -> -1(10进制)

step 1: 异或运算

 0000 0100
 1111 1011
-----------(异或,如果不考虑进位,异或可以直接出结果)
 1111 1111

step 2: 与运算

 0000 0100
 1111 1011
-----------(与,判断进位,与运算为0,没有进位)
 0000 0000

最终结果: 1111 1111

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

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

结论:计算机只要会做加法就可以了

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

汇编语言:通过汇编指令,给计算机发一些操作,让计算机执行。(编译器)

汇编语言

32位汇编 工具:OD

寄存器

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

32位CPU: 8 16 32

64位CPU: 8 16 32 64

通用寄存器

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
FFFFFFFF FFFF FF

8位:

L:高八位 H:低八位

32位存值的范围 0-FFFFFFFF

计算机如何向寄存器存储?

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

内存

每一个应用程序的进程都有4GB存储空间

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

1B    = 8bit

1KB = 1024B

1MB= 1024KB

1GB= 1024MB

4G = 4096MB = 34,359,738,368 bit ≈ 343亿

255 -> ffff -> 32位

内存地址

存一个数:

数据宽度:占用大大小  byte word dword

内存地址:只有程序申请的内存地址才可以使用

32位:寻址能力

16进制最大值:ffffffff+1=1 0000 0000

bit:1 0000 0000*8 – 8 0000 0000

=> 转换为10进制:34,359,738,368 bit

汇编指令

mov指令

mov 存的地址,存的数

mov 存的地址,原地址

$ move dword ds:[0019ff74] 1

https://www.bilibili.com/video/BV1ni4y1G7B9?p=11&vd_source=3790692eb971db4659c7e5f6dc3e29fc

作者 admin

百度广告效果展示