汇编语⾔的⼊门介绍
深⼊理解进制及汇编语⾔的⼊门介绍
计算机底层,⼆进制到汇编学习
机器语⾔
⼈和⼈交流,语⾔?⼈?计算机?学习计算机的语⾔!
什么是机器语⾔?
我们⽬前主流的电⼦计算机,状态0和1
⽐如
加 0100 0000
减 0100 0100
乘 0100 1000 0100 1000
除 0100 1000 1100 1000
这些复杂的机器语⾔可以简化吗?助记符!汇编语⾔!⼈能够理解的语⾔转化成为机器能够理解的语⾔!加 INC -编译器-> 0100 0000
减 DEC 0100 0100
乘 MUL 0100 1000 0100 1000
16进制转换器计算器除 DIV 0100 1000 1100 1000
离程序的本质:隔阂!汇编⼀般⽤于底层的编写,单⽚机…
c语⾔,更加简化
加 a+b -编译器-> 0100 0000
减 a-b 0100 0100
乘 a*b 0100 1000 0100 1000
除 a/b 0100 1000 1100 1000
进制的介绍
进制 本质:⼀组符号,逢⼏进⼏
⼆进制? 0 和 1
学习禁⽌的障碍?
10进制!
⼈类天然的选择就是10进制,⼗个指头,跳出固有思维的⽅法!
⼆进制
每⼀种进制都是完美的,都有⾃⼰的计算⽅式!
进制?
1进制:逢⼀进⼀,结绳记事 11
2进制:逢⼆进⼀,计算机
8进制:逢⼋进⼀,8个符号组在⼀起 0 1 2 3 4 5 6 7
10进制:逢⼗进⼀,10个符号组在⼀起 0 1 2 3 4 5 6 7 8 9
16进制:逢⼗六进⼀,16个符号组在⼀起 0 1 2 3 4 5 6 7 8 9 a b c d e f
进制远远没有⼤家想得这么复杂, 查数
⼀进制 1~10
1
11
111
1111
那如果说三进制呢(⾃制)
0 1 2
10 11 12
20 21 22
100 101 102
110 111 112
120 121 122
1000 1001 1002
七进制
0 1 2 3 4 5 6
10 11 12 13 14 15 16
20 21 22 23 24 25 26
30 31 32 33 34 35 36
那⼆进制呢
0 1
10 11
100 101
110 111
1000 1001
问题:你真的理解了进制了吗? 1+1=3对吗?!如果你可以使⽤进制来回答这个问题你就真的理解了进制!
⼗进制
0 1 2 3 4 5 6 7 8 9
我的⼗进制
0 2 4 6 8 a b c d e 可以⾃⼰随便定义的,学习,创造者!
如果⽤来加密解密,别⼈想不到这个:程序员,破解程序的⼈ 进制的加密 ⾮常⾼级的加密⽅法 数字量⼀⼤,总是有规律的
进制怎么⽤来运算
⼋进制计算下⾯的结果
2+3 2往后再数3位就是5
23 以2个数为单位,数3个 就是6
4+5 4往后再数5位就是11
45 以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
结论:⽆论是什么进制,本⾝都是由⼀套完美的运算体系的,我们都可以通过列表的⽅式将它计算出来
⼆进制
计算机使⽤⼆进制0和1!状态!电⼦!物理极限:摩尔定律! 硬操作 追求语⾔的极限!并发语⾔!软操作
⼆进制
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
⼆进制这么写进去很⿇烦!⼆进制能否简写!
0 1 2 3 4 5 6 7 8 9 a b c d e f
⼗六进制来了
为什么要学习理解⼆进制?
寄存器、内存、位!底层的每⼀个位都是有含义的,汇编⼊门理解的基础!
汇编的⾼级:了解程序的深层!操作系统的内核?
数据宽度
计算机:内存! 给数据增加数据宽度。
bit:⼀位,⼀个⼩格⼦ 位 0 1
Byte:⼋位,⼋个⼩格⼦ 字节 0~0xFF
Word:⼗六位,⼗六个⼩格⼦ 字 0~0xFFFF
DWord:三⼗⼆位,三⼗⼆个⼩格⼦ 双字 0~0xFFFFFFFF
c和c++以及java都需要定义数据的类型,计算机底层需要我们给这些数据定义宽度
在计算机中,每⼀个数据都需要给它定义类型,给它定义宽度,在内存中的宽度
有符号数和⽆符号数
数据都是有宽度的,每个数据代表什么意思呢?,⼆进制
规则,⼆进制解码增加⼀个规则?
⽆符号数规则:你这个数字是什么就是什么
1001 1010 ——>⼗六进制 0x9A 前⾯四个是9后⾯四个是10(A)转换很快 ⼗进制 154有符号数规则:最⾼位是符号位:1(负数)0(正数)
1001 1010如何转换?
原码,反码,补码
编码规则
有符号数的编码规则
原码:最⾼位符号位,对齐它它的为进⾏本⾝绝对值即可。
反码:
正数:反码和原码相同
负数:符号位⼀定是1,其余位对原码取反
补码:
正数:补码和原码相同
负数:符号位⼀定是1,反码+1
测试:
现在说的都是8位
如果是正数,都是⼀样
1
原码 0000 0001
反码 0000 0001
补码 0000 0001
如果是负数
-1
原码:1000 0001
反码:1111 1110
补码:1111 1111
-7
原码:1000 0111
反码:1111 1000
补码:1111 1001
如果看到⼀个数字,⼆进制的,需要了解它是有符号数还是⽆符号数
计算机底层,存储 负数 是通过 补码 来进⾏的
位运算
计算机现在可以存储所有的数字,运算!
与运算(and &)
计算机的本质(两个都为1,结果为1)
1011 0001
1101 1000
------------------与运算
1001 0000
或运算(or |)
只要有⼀个为1,结果为1
1011 0001
1101 1000
------------------或运算
1111 1001
异或运算(xor ^)
不⼀样就是1
1011 0001
1101 1000
------------------异或运算
0110 1001
⾮运算(单⽬运算符 not ~)
取反,1是0,0是1
1011 0001
------------------⾮运算
0100 1110
通过这些可以完成我们的加减乘除,位运算来实现加减乘除!
位运算(移动位,左移就是*2 右移就是/2)
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
左移:(shl <<)
0000 0001 所有⼆进制位全部左移若⼲位,⾼位抛弃,低位补0
000 0001 0
右移:(shr >>)
0000 0001 所有⼆进制位全部右移若⼲位,低位抛弃,⾼位补0或者1(符号位决定)0 0000 000
⼆进制、位运算=>加减乘除
位运算的加减乘除
计算机只认识 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
最终的结果就是与运算结果为0,的上⼀个异或运算
如果上⾯结果不是0,继续重复上⾯的操作
那4-5呢?
4+(-5)
0000 0100
1111 1011(补码,,,,难道是反码后最后⼀位是0,就加1,是1就不变)--------------异或
1111 1111
再进⾏⼀次与运算确认结果
0000 0100
1111 1011(补码,,,,难道是反码后最后⼀位是0,就加1,是1就不变)--------------与运算(判断进位,如果与运算结果为0.,没有进位)
0000 0000
乘:x*y,就是y个x相加,还是加法
除:x/y,本质就是减法,即使x能减去多少个y
计算机只会做加法
机器语⾔就是位运算,都是电路来实现的。这就是极端及的最底层的本质。
通过机器语⾔来实现加法计算器,设计电路
汇编的介绍