概念
语言
进制
进制如何运算
二进制 量子计算
数据宽度
有符号数和无符号数
原码和反码补码
位运算
位运算计算
汇编
寄存器
内存
内存复制
堆栈的指令
汇编如何写函数
堆栈传参
堆栈平衡
外挂
语言
人与人沟通,语言,学习计算机,计算机语言
什么是机器语言?
我们目前主流的电子计算机!
状态 0和1
最早的穿孔卡带
加减乘除 0100 0000 0100 1000
这些复杂的机器语言,能简化吗? 发明 :助记符!汇编语言!
加 INC–编译器 -》
减 DEC
乘 MUL
除 DIV
离程序的本质:隔阂! 汇编一般用于底层的编写,单片机。。
c语言
加 A+B
减A-B
乘A*B
除A/B
爆破
进制
二进制 0 1
学习进制的障碍?
10进制
人类天然选择十进制
二进制
每一种进制都是完美的,都有自己计算方式
进制?
一进制:一进一
二进制:二进一
八进制:八进一
十进制:满十进一
进制远没有想象复杂。查数
测试
一进制
1
1 1
1 1 1
.......
三进制
0 1 2
10 11 12
20 21 22
...........
八进制
0 1 2 3 4 5 6 7
10 11 12 13 14 15 16 17
问题:真的理解进制了吗?
1+1=3
二进制11 =01+1->10+1->11
菜十进制:j 2 4 d 5 6 5 z p
加密解密:程序员,破解程序的人! 进制的加密
数字量一大,总是有规律的!
#八进制怎么算
2+3=
2*3=
4/5=
#运算的本质就是查数
0 1 2 3 4 5 6 7 8 9 10 11 12 13
#八进制计算下面的结果 九九乘法表 = 加法表!
277+255
277
255 +
--------
要多想!
计算机二进制0 1! 状态 电子! 物理极限:摩尔定律! 追求语言的极限! 并发语言
量子计算器:一种见识
使用量子计算的机器。
传统计算机:集成电路!01.硅晶片
量子计算机的单位:昆比特(量子比特)量子的两态
光子:正交偏振方向
磁场:电子的自旋方向
21世纪。计算力到头【落伍】
量子计算机!提高计算机的计算力
量子比特,量子纠缠,量子叠加态,量子并行原理…
二进制 ,0 1111
0 1 10 11 100 101 110 111 1001 1010 1011 1110 1111
二进制能否简写
0 1 2 3 4 5 6 7 8 9 a b c d e f g h
为什么学习二进制?
寄存器,内存,位,底层的每一个位都是有含有的,汇编入门的继承!
技术作用:好,坏!
汇编高级:了解程序的深层!操作系统的内核?
数据宽度
计算机:内存!给数据增加数据宽度。
通过位实现加减乘除
c和c++,java都需要定义数据的类型,计算机底层需要我们给这些数据定义宽度
位 0 1
字节 0-0xFF
字 0-0xFFFF
双字 0-xFFFFFFFF
在计算机中,每一个数据都需要给它定义类型,给他定义宽度,在内存中的宽度。
有符号数无符号数
数据都是有宽度的,每个数据代表什么意思呢?
0 1 0 1 0 1 0 1
规则,二进制解码增加一个规则?
无符号数规则
1 0 0 1 1 0 1 0十六进制,
有符号数规则
最高位是符号位:1(负数)0(正数)
1 0 0 1 1 0 1 0
原码反码补码
编码规则
有符号数的编码规则
原码:最高符号位,对齐它的位进行本身绝对值即可
反码
- 正数:反码和原码相同
- 负数:符号位一定是1,其余位对原码取反
补码:
- 正数:补码和原码相同
- 负数:符号位一定是1,其余位
寄存器:mov寄存器 值
FFFF 1111
位运算
计算机现在可以存储所有的数字(整数,浮点数,字符)的,运算
01
位运算?
2*8最高效的计算方式
很多底层的调试器,
计算机本质
与运算(and&)
1011 0001
1011 1000
------------ 与运算
1001 0000
或运算(or |)
1011 0001
1101 1000
-----------或运算
1111 1001
异或运算
不一样就是1
1011 0001
1101 1000
-----------异或运算
0110 1001
非运算(单目运算符 not)
1101 1000
-----------
0010 0111
通过这些可以完成加减乘除,位运算来实现加减乘除
位运算(移动位,左移*2)
左移(shl<<)
0000 0001 @所有二进制全部左移若干,高位丢弃,低位补0
0000 0010
右移(shr>>)
0000 0001 @所有二进制全部右移若干,低位丢弃,高位补0符号位决定
0000 0000
printf(“%d\n”,a>>2);
位运算加减乘除
计算机只认识0 1
基于数学建立加减乘除(加法)
4+5?
4+5=
#计算机怎么操作
0000 0100
0000 0101
-----------
0000 1001
@计算机实现原理
#第一步,异或,如果不考虑进位,异或可以直接出结果
0000 0100
0000 0101
-----------
0000 0101
#第二部,与运算
0000 0100
0000 0101
--------
0000 0100
#第三步,将与运算的结果左移一位,000 1000#进位结果
#第四步 异或
0000 0001
0000 1000
----------
0000 1001
#第五步:与运算(判断进位)
0000 0001
0000 1000
----------
0000 0000
#所以最终结果就是与运算为0的结果的上一个异或运算
乘 X*Y 就是y个x相加
除 X/Y 就是x能减去多少个Y
计算机只会做加法
机器语言就是位运算,都是电路来实现的,这就是计算机的最底层的本质。
汇编语言环境说明
通过汇编指令可以给计算机发一些操作,然后让计算机执行,编译器的发展,底层的
在学习汇编之前,大家掌握环境的配置,vc6(程序到汇编的理解,2,OD!3,)
学汇编不是为了写代码
理解程序本质。
《汇编语言》 16 位 32位 64位
汇编入门:了解汇编和程序对应关系
通用寄存器
弊端:习惯一个老师
寄存器:
存储数据:CPU>内存>硬盘
32位 8 16 32
64位 8 16 32 64
32位通用寄存器只有八个
存储范围0~FFFFFFFF
对于二进制来说直接修改值
计算机如果象寄存器存值
mov指令
mov
计算器:计算力!
内存
寄存器很小,不够用,所以说,数据放到内存!
程序真正运行的时候才会用到物理内存。
内存地址
存一个数:占用的大小,数据宽度存到哪里
计算机中内存地址很多,空间很大
内存起编号
汇编如何向内存中写值。
mov 数据宽度 内存地址 1
mov byte/word prt ds:[0x19FF70],1
mov 内存地址 1
传递值的大小一定要和宽度相等
内存地址有多种写法
ds:[0x19FF70+4]
ds:[eax]
数组
ds:[reg*{1,2,4,8}]
ds:[reg*{1,2,4,8}+4]数据偏移