汇编入门
语言
机器语言
目前主流的电子计算机只认识二进制
状态表示0 和 1
最早的程序员:穿孔卡带
加 0100 0000
减 0100 1000
乘 0100 1000 0100 1000
除 0100 1000 1100 1000
复杂的机器语言能简化——》助记符。
使用汇编语言将人能够理解的语言转换为机器能够理解的语言
加 INC->编译器->0100 0000
减 DEC
乘 MUL
除 DIV
汇编一般用于底层的编写,单片机…
C语言
加 A+B -> 编译器->0100 0000
减 A-B -> 编译器->0100 1000
加 A+B -> 编译器->0100 1000 0100 1000
加 A+B -> 编译器->0100 1000 1100 1000
进制
思想
每一种进制都有自己的计算方式
1进制:一进一,结绳记事。
2进制:二进一,计算机
8进制:八进一,0 1 2 3 4 5 6 7
10进制:十进一,0 1 2 3 4 5 6 7 8 9
16进制:十六进一,0 1 2 3 4 5 6 7 8 9 A B C D E
查数:几进制到几加一位
可以自己随便定义
十进制: 0 1 2 3 4 5 6 7 8 9
自己设置的十进制:0 2 4 6 8 B D F H J
使用自己设置的进制,达到进制的加密
数字量一大,总会有规律的
进制的运算
# 八进制的计算
277 276 237 234 / 4 = 47
+333 * 54 - 54
----- ------ -----
632 20250 163
结论:不论是什么机制,本身都是有一套体系的
二进制
计算机使用的二进制 0 1 因为计算机只有两种电平,使用电子表现状态
缺陷:因为摩尔定律,存在物理极限,硬操作快到极限了
追求语言的极限,并发语言,软操作
量子计算机
使用量子计算的机器。
传统的计算机通过集成电路表现出来0 1 两种状态
量子计算机的单位:昆比特,量子的两态来表示,比电子计算速度快
21世纪的计算力快到尽头了,
量子计算机能够提高计算机的计算力
二进制的简写
0 1 2 3 4 5 6 7 8 9 a b c d e f
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
这就是十六进制
数据宽度
数学上:0-无穷大是没有限度的,但计算机碍于内存,需要给数据增加数据宽度。
计算机底层需要我们给这些数据定义宽度,所以C、C++、Java等需要定义数据的类型。
bit 1位
byte 8位
word 16位
dword 32位
qword 64位
位 0 1
字节0-0xFF
字 0-0xFFFF
双字 0-0xFFFFFFFF
在计算机中,每一个数据都需要给它定义类型,给它定义宽度,在内存中的宽度
有符号数和无符号数
数据都是有宽度的。
规则
给二进制解码增加一个规则
无符号数规则
数字是什么就是什么
1 0 0 1 0 1 0 1
将其转换成十六进制,四位四位的计算
比如1 0 0 1 相当于十六进制中的9
0 1 0 1 相当于十六进制的5
所以转化为十六进制就是0x95
有符号数规则
最高位是符号位:1(负数)0(正数)
1 0 0 1 0 1 0 1
十六进制:-15
原码反码补码
编码规则
有符号数的编码规则
原码:最高位是符号位,对其他的位进行本身的绝对值即可
反码:
- 正数:反码和原码相同
- 负数:符号位一定是1,其余位对原码取反
补码:
- 正数:反码和补码相同
- 负数:符号位一定是1,反码 + 1
如果是正数,那么原码反码补码都是一样的
1
# 原码 0 0 0 0 0 0 0 1
# 反码 0 0 0 0 0 0 0 1
# 补码 0 0 0 0 0 0 0 1
如果是负数,
-5
# 原 码 1 0 0 0 0 1 0 1
# 反码 1 1 1 1 1 0 1 0
# 补码 1 1 1 1 1 0 1 1
如果看到一个二进制的数,需要了解它是有符号数还是无符号数
# 二进制的标志
2 10
4 100
8 1000
16 10000
寄存器
mov 寄存器,值
正数在计算机里面是正常存储的
负数在计算机里面是以补码的方式存储的
位运算
计算机可以存储所有的数字(正数,浮点数,字符)
很多底层的调试器。需要通过位来判断CPU的状态
与运算(and &)
或运算(or |)
异或运算(xor ^)
不相同就是1,相同就是0
1011 0001
1101 1000
--------- 异或运算
0110 1001
非运算( not ~)
单目运算符,只有一个数字
取反,0就是1,1就是0
位运算(移动位)
左移×2,右移/2
0000 0001 1
0000 0010 2
0000 0100 4
左移(shl <<)
所有二进制位全部左移若干位,高位丢弃,低位补0
0000 0001
000 00010
右移(shr >>)
所有二进制位全部有移若干位,低位丢弃,高位补0或者1(符号位决定)
1000 0010 (有符号数)
1100 0001
位运算的加减乘除
计算机只认识0,1
基本数学是建立在加减乘除上的。
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
说明没有进位,结果正确
4 - 5
#计算机是怎么操作的
4 + (-5)
0000 0100
0000 0101
---------减法,计算机不会直接计算,先将被减数取补码
0000 0100
1111 1011
---------
第一步:异或
0000 0100
1111 1011
---------
1111 1111
第二步:与运算
0000 0100
1111 1011
---------
0000 0000
最终结果
1111 1111
16进制下为 FF
10进制下为-1
乘:x * y ,就是y个x相加,还是加法
除:x/y,本质就是减法,x能够减去多少个y,本质还是加法
计算机只会做加法