阿小冷学计算机(9)--汇编的先导课

【狂神说】二进制到汇编学习(汇编的先导课)

概述

语言
进制
进制如何运算
二进制
数据宽度
有符号数和无符号数
原码反码补码
位运算
位运算计算
汇编
寄存器
内存
汇编指令
内存复制
堆栈的指令
汇编如何写函数
堆栈传参
堆栈平衡
外挂

语言

人和人沟通?语言!老外!计算机!学习计算机语言!
什么是机器语言?

# 我们目前主流的电子计算机!
状态  0 和 1
# 最早的程序员,穿孔卡带
加  0100 0000
减  0100 1000
乘  0100 1000 0100 1000
除  0100 1000 0100 1000

这些复杂的机器语言,能简化吗?助记符!汇编语言!人能够理解的语言转换为机器能够理解的语言!

加 INC -编译器-> 0100 0000
减 DEC          0100 1000
乘 MUL          0100 1000 0100 1000
除 DIV          0100 1000 0100 1000

离程序的本质:隔阂!汇编一般用于底层的编写,单片机…

C语言

加 A+B -编译器-> 0100 0000
减 A-B          0100 1000
乘 A+B          0100 1000 0100 1000
除 A/B          0100 1000 0100 1000

进制

二进制?0和1
学习进制的障碍?
10进制
人类天然的选择的就是10进制,10个指头。跳出固有的思维的方法!屈指可数
二进制
思想:每一种进制都是完美的,都有自己的计算方式

进制?
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 7 8 9 a b c d e f
查数
在这里插入图片描述真正的理解进制:1+1=3对吗??(1.5进制吗)
十进制:0 1 2 3 4 5 6 7 8 9
狂神的十进制: 0 2 4 6 8 a b r d f,可以直接随便定义的
加密解密: 进制的加密
数字量一大,总是有规律的!

进制怎么运算

在这里插入图片描述八进制的加分表
在这里插入图片描述八进制的乘法表
在这里插入图片描述

277
322    +
-----------
632

 276
  54    *
-------
 1370
1666    +
-------
20250

#减法的本质就是加法
237
 54   -
------
163 
#除法的本质 除数乘以那个数最接近结果即可
237
  4    /
--------
 47  

结论:无论是什么进制,本身都是有一套完美的运算体系的,我们都可以通过列表的方式将它计算出来!!

二进制

计算机使用二进制0 1! 状态:电子! 物理极限:摩尔定律!! 追求语言的极限! 并发语言!
量子计算机:(传道)
可以实现量子计算的机器
传统的计算机:集成电路! 0 1 硅晶片!
量子计算机的单位:昆比特。(量子比特!)量子的两态来表示
光子:正交偏振方向
磁场:电子的自旋方向
量子计算机!提高计算机的计算力。

在这里插入图片描述

数据宽度

计算机:内存!给数据增加数据宽度。
在这里插入图片描述C和C++、java都需要定义数据的类型。计算机底层需要我们给这些数据定义宽度
位 0 1
字节 0—0xFF
字 0-----0xFFFF
双字 0----0xFFFFFFF
在计算机中,每一个数据都需要给它定义类型,给它定义宽度,在内存中的宽度

有符号数无符号数

数据都是有宽度的。每个数据代表什么意思呢?二进制

0 1 0 1 0 1 0 1

规则,二进制解码增加一个规则?

无符号数规则
你这数字是什么,那就是什么

1 0  0  1  1 0 1 0 十六进制:0x9A  十进制:154 

有符号数规则
最高位是符号位: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

如果看到一个数字,二进制的,需要了解它是有符号数还是无符号数。
寄存器: mov寄存器,值

位运算

计算机现在可以存储所有的数字(整数,浮点数,字符)的运算!!
位运算?
2*8最高效计算方式。
很多底层的调试器。需要通过位来判断CPU的状态

与运算(and &)
在这里插入图片描述

1011 0001
1101 1000
-----------  与运算
1001 0000

或运算(or |)
在这里插入图片描述

1011 0001
1101 1000
---------- 或运算
1111 1001

异或运算(xor ^)
不一样则为1
在这里插入图片描述

1011 0001
1101 1000
----------异或运算
0110 1001

非运算(单目运算符 not)
0就是1,1就是0,取反1

1101 1000
----------
0010 0111

通过这些可以完成加减乘除!位运算来实现加减乘除

位运算(移动位)

左移:(shi<<)

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 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 1111

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
计算机只会做加法!
机器语言就是位运算,都是电路来实现的,这就是计算机的最底层的本质。
通过机器语言来实现加法计算器,设计电路

汇编语言

通过指令来代替我们的二进制编码
在这里插入图片描述在这里插入图片描述

通用寄存器

寄存器:
存储数据:CPU>内存>硬盘

32位 CPU 8 16 32
64位 CPU 8 16 32

通用寄存器 存储任意的东西

# 32位的通用寄存器只有8个

EAX ECX EDX EBX ESP EBP ESI EDI
在这里插入图片描述
存值的范围: 0-FFFFFFFF
对于二进制来说,直接修改值
计算机如果像寄存器存值。
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的内存空间,空头支票
在这里插入图片描述
程序真正运行的时候,才会用到物理内存
1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB
4G的内存,4096m===》最终计算位位,就是这个可以存储的最大容量的。
计算机的内存地址很多,空间很大

内存地址
存一个数:占用的大小,数据宽度!存到哪里?
计算机中的内存地址很多,空间很大,每个空间分配一个地址,名字
在这里插入图片描述
这些给内存起的编号,就是我们的内存地址,32位,8个16进制的值
32位:寻址能力!4GB
FFFFFFFF+1=100000000,最大的值
位是怎么限制内存大小的。
100000000 内在地址*8=800000000
转换为10进制/8;4294967296字节
按照规则/1024,最终发现就是4GB
64位,绰绰有余

所以每一个内在地址都有一个编号!可以通过这些编号向里面存值

内存如何存值?
数据宽度:byte,word,dword
地址的位置:0xFFFFFFFF
不是任意的地址都可以写东西的,申请使用的,只有程序申请过的内存地址我们才可以使用

汇编如何向内存中写值
mov  数据宽度 内存地址 1

mov byte ptr ds:[0x19FF70],1

传递的值的大小一定要和数据宽度相等

内存地址有多种写法
ds:[0x19FF70+4] 内存地址偏移
ds:[eax】 寄存器
ds:[eax+4] 寄存器偏移
数组 []
ds:[reg+reg*{1,2,4,8}]; 数组
ds:[reg+reg*{1,2,4,8}+4]; 偏移

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值