概述
- 语言
- 进制
- 进制如何运算
- 二进制
- 数据宽度
- 有符号数和无符号数
- 原码反码补码
- 位运算
- 位运算计算
- 汇编
- 寄存器
- 内存
- 汇编指令
- 内存复制
- 堆栈的指令
- 汇编如何写函数
- 堆栈传参
- 堆栈平衡
机器语言
什么是机器语言?
目前主流的电子计算机!状态是0 和 1
汇编语言 将复杂的机器语言 简化为 助记符
加 INC -> 编译器-> 0100 0000
减 DEC 0100 1000
乘 MUL 0100 1000 0100 1000
除 DIV 0100 1000 1100 1000
汇编语言一般于底层的编写,单片机。
进制
二进制?
学习进制的障碍
10 进制
人类天然的选择就是10 进制, 10 个手指头 。调出固有的思维方法! “屈指可数”
二进制
思想: 每一种进制都是完美的,都有自己的计算方式!
进制?
1进制: 逢一进一, 结绳记事。1 1
2 进制: 逢二进一, 计算机
八进制: 八进一。 8个符号: 0 , 1, 2 ,3 ,4, 5, 6, 7
10进制: 10进一。 10个符号组成: 0, 1, 2,3 ,4, 5, 6, 7, 8 ,9
16进制: 16进一。16个符号组成: 0, 1, 2, 3, 4, 5 , 6, a, b , c , d , e ,f
一进制
1
1 1
1 1 1
...
# 三进制 1-20
0 1 2
10 11 12
20 21 22
100 101 102
110 111 112
120 121 122
# 二进制
0 1 10 11 100 101 110 111 1000
# 七进制
0 1 2 3 4 5 6
10 11 12 13 14 15 16
20 21 22 23 14 25 26
# 一组符号,逢几进几
无论是什么进制,本身都有一套完美的运算体系的,我们都可以用过列表的方式将它计算出来!
二进制
计算机使用二进制 0 1! 状态! 电子! 物理极限: 摩尔定律! 追求语言的极限!开发语言! 软操作。
量子计算机:
可以实现量子计算的机器。 传统的计算机: 集成电路!0 1
量子计算机的单位: 昆比特。两个的两态表示。
光子: 正交偏振方向。
磁场: 电子的自旋方向。
21世纪。计算力,快到尽头了!
量子计算机! 提高计算机的计算力。提高计算机的计算力
量子比特, 量子叠加状态, 量子纠缠,量子并行原理…
二进制 0 1111
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
这就是我们的16进制
为什么要学习理解二进制
寄存器,内存 位 底层的每一个位都是有含义的。汇编是入门理解的基础。
汇编高级: 了解程序的深层! 操作系统的内核
数据宽度
计算机: 内存!给数据增加数据宽度
bit Byte Word(16位) Dword(32位 0000 0000 0000 0000 0000 0000 0000 0000)
位 bit 0 1
字节 byte 0-0xFF
字 word 0-0xFFFF
双字 Dword 0- oxFFFFFF
在计算机中,每一个数据都需要定义类型。给它定义宽度,在内存中的宽度。
有符号数和无符号数
数据都有宽度。每个数据代表什么意思呢?
0 1 0 1 0 1 0 1
规则, 二进制解码增加一个规则?
无符号数规则
你这个数字是什么, 就是什么。无关正负。
1 0 0 1 1 0 1 0 十六进制: ox9A
有符号数规则
最高位是符号位: 1(负数)0 (正数)
1 0 0 1 1 0 1 0
原码反码补码
之后我们要用计算
编码规则
有符号数的编码规则
原码: 最高位符号位,对齐它的为进行本身绝对值即可。
反码:
正数: 反码和原码相同
负数: 符号位一定是1, 其余位对原码取反。
补码:
正数: 反码和原码相同
负数: 符号位一定是1, 反码+1
# 现在下面的这些数都是8 位
# 如果是正数,那都是一样的。
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
# 现在下面的这些数都是8位
# 如果是负数
-1
原码 1 0 0 0 0 0 0 1
反码 1 1 1 1 1 1 1 0
补码 1 1 1 1 1 1 1 1
-7
原码 1 0 0 0 0 1 1 1
反码 1 1 1 1 1 0 0 0
补码 1 1 1 1 1 0 0 1
需要记忆的几个值
# 二进制标志
2 10
4 100
8 1000
16 10000
32 100000
如果看到一个数字,二进制的,需要了解它是符号数还是无符号数。
寄存器: mov
位运算
计算机现在可以存储所有的数字(整数, 浮点数 字符)。
运算
2 * 8 最高效计算方式。
很多底层的调试器,需要通过位运算CPU的 状态 。
与运算 and &
与运算的电路图
1011 0001
1101 1000
-----------
1001 0000
或运算 or |
1011 0001
1101 1000
----------- 或运算
1111 1001
3. 异或运算(xor ^)
不一样就是1.
电路图如下:
1011 0001
1101 1000
----------- 异或运算
0110 1001
4. 非运算(单目运算符 not ~)
0就是1, 1 就是 0
1011 0001
---------- 非运算
0100 1110
通过这些就可以完成我们的加减乘除。
位运算(移动位, 对于十进值 左移乘2, 右移除2)
左移 (shl <<)
0000 0001 @所有二进制位全部左移若干位,高位就丢弃了, 低位补0。
0000 0010
右移(shr >>)
0000 0001 @所有二进制位全部右移若干位,高位补0,1 了, 低位就丢弃了。
0000 0010
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
位运算实现加减乘除
计算机只认识 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的结果(上一个异或运算。)
4-5?
# 计算机是怎么操作的
4 + (-5)
0000 0100
1111 1011 取补码 1111 1011
---------
1111 1111 ff -1
0000 0100
1111 1011 异或(如果不考虑进位,异或就可以直接出结果)
---------
1111 1111
0000 0100
1111 1011 与运算(判断进位, 如果与运算结果为0, 没有进位)。
---------
0000 0000
最终结果 1111 1111 16 ff 10 -1
乘: x*y, 就是y * x 相加,还是加法。
除: x/y, 本质就是减法, 就是x 能减去多少个Y。
汇编语言环境
通过指令来代替我们的二进制编码!
在学习汇编之前,大家需要需要先安装环境的配置
(1. VC6 (程序到汇编的理解)) 2.OD 3. 抓包工具,4 加密解密工具
学汇编不是为写代码!
理解程序的本质。
通用寄存器
寄存器:
存储数据: CPU > 内存 > 硬盘
32位 CPU 8 16 32
64位 CPU 8 16 32 64
通用寄存器
# 32位通用寄存器只有8个
EAX
ECX
EDX
EBX
ESP
EBP
ESI
EDI
存值的范围 0 - FFFF FFFF
计算机如何往寄存器存值。
对于二进制来说,直接修改。 计算机如果像寄存器值。
mov 指令
mov 存的地址, 存的数
mov 存的地址1, 存的地址1.
可以将数字写入到寄存器, 可以 将寄存器中的值写道寄存器。
计算机: 计算力。
不同的寄存器
FFFF FF
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
8 位:L 低8 位, H 高8 位 .
内存
寄存器很小,不够用,所以说,数据放到内存!
每个应用程序进程都有4GB 的内存空间,空头支票。
程序真正运行的时候,才会用到物理内存。
32 位.
1b = 8bit
1kB = 1024B
1MB = 1024KB
1G = 1024MB
4G 的内存,4096MB -> 最终计算为位,就是这个可以存储的最大的容量。
计算机中的内存地址很多,空间很大。
内存地址
存一个数: 占用的大小。数据宽度, 存到哪里?
计算机中内次年地址有很多,空间很大,每个空间分配一个地址。名字
这些给内存起的编号,就是我们的内存地址。 32 位8 个 16 进制的值。
32位: 寻址能力! 4GB.
FFFF FFFF + 1 = 最大的值。
位是怎么限制内存大小的。
100000000 内存地址 * 8 = 位 :
转换为10 进制/ 8 4294. 967, 296 字节 .
64 位, 绰绰有余!
所以每个内存地址都是一个编号! 可以通过这些编号往里面存值。
内存如何存值
数据宽度: byte word dword
地址的位置: 0xFFF FFFF
不是任意的地址都可以写值的,申请使用的。 只有程序申请通过的内存地址我们才可以使用。
汇编如何向内存中写值。
mov 数据宽度, 内存地址, 1
mov byte/word/dword/qword, 1
传递的值的大小一定要和数据宽度相等。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77123.html