计算机语言
机器语言
电子计算机状态: 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