汇编入门

语言

  • 人和人沟通?语言!老外!计算机!学习计算机语言
什么是机器语言
  • 我们目前主流的电子计算机
  • 状态0和1
  • 加 0100 0000
  • 减 0100 1000
  • 乘 0100 1000 0100 1000
  • 除 0100 1000 1100 1000
这些复杂的机器语言,能简化吗?助记符!汇编语言!人能够理解的语言转换成计算机语言
  • 加:INC -编译器->0100 0000
  • 减 :BEC 0100 1000
  • 乘 : MUL 0100 1000 0100 1000
  • 除: div 0100 1000 1100 1000
离程序的本质:隔阂!汇编一般用于底层的编写,单片机
c语言
  • 加 : A + B -编译器->0100 0000
  • 减 : A - B 0100 1000
  • 乘 : A * B 0100 1000 0100 1000
  • 除 : A / B 0100 1000 1100 1000
    在这里插入图片描述

在这里插入图片描述

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

1进制; 一进一 结嗓记事 11
2进制: 二进一 计算机
八进制: 八进一 8个符号组成:0, 1, 2,3, 4,5, 6,7
十进制 : 十进一 十个符号组成: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
十六进制: 十六进一 十六个符号组成: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a,b, c, d, e, f

进制远远没有大家想的那么复杂:

  • 就是一组定义的符号,逢几进几。可以自己随便定义的。我们要做学习和创造者。
  • 加密解密:程序猿,破解程序的人!进制的加密是有一定规律的。

进制怎么计算

//用八进制计算下面的数
2 + 3 =5
2*3 = 6
4+5 = 11
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、、、、

277 + 333 = 632
276 * 54 = 20250
237 - 54 = 163
234 / 4 = 47

  277
    +
  333
-------
  632
  
 276
    *
  54
-------
  1370
 1666
-------
 20250
 
//减法的本质是  237 + (-54)
 237
    -
  54
-------
 163

//除法的本质是,除数乘与商等于被除数
234
    /
  4
-------
47

八进制加法表

1+1 = 2
1+2 = 32 +2=4
1+3 = 42+3 = 53+3 = 6
1+4 = 52+4 = 63+4 = 74+4 = 10
1+5 = 62+5 = 73+5 = 104+5 = 115+5 = 12
1+6 = 72+6 = 103+6 = 114+6 = 125+6 = 136+6 = 14
1+7 = 102+7 = 113+7 = 124+7 = 135+7 = 146+7 = 157+7 = 16

八进制乘法表

1*1 = 1
1*2 = 22*2=4
1*3 = 32*3 = 63*3 = 11
1*4 = 42*4 = 103*4 = 144*4 = 20
1*5 = 52*5 = 123*5 = 174*5 = 245*5 = 31
1*6 = 62*6 = 143*6 = 224*6 = 305*6 = 366*6 = 44
1*7 = 72*7 = 163*7 = 254*7 = 345*7 = 436*7 = 527*7 = 61
  • 结论:论是什么进制,本身都是一套完美的运算体系的,完美都可以通过列表的方式将它计算出来。
二进制
  • 计算机使用二进制0 , 1!状态!电子!物理极限:摩尔定律!硬操作,追求语言的极限!并发语言!软操作。

量子计算机

  • 可以实现量子计算机计算的机器。
  • 传统的计算机:集成电路 0,1 。 硅晶片
  • 量子计算机的单位:昆比特!(量子比特!量子的两态来表示)
  • 光子:正交偏振方向。
  • 磁场:电子的自旋方向。
  • 21世纪:计算机,快到了浸透!汇编落伍了,本质问题
  • 量子计算机!提高计算机的能力
  • 量子比特,量子叠加态,量子纠缠,量子并行原理。。。
  • 2019年,Google研究人员展示其最新54比特量子计算机,该计算只用200秒便可计算完毕当前世界最大的超级计算机需1万年进行的运算。
    • 2020年,6,18 量子体积64的量子计算机!!!
    • 霍化韦尔,将在一年之内得到至少10个有效量子比特。相当于1024个量子体积。
    • 电子计算机–>量子计算机

电子计算机:0和1

  • 二进制:
0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
  • 二进制这么写很麻烦!二进制能够简写
    这就是我没打16进制
0 1 2  3   4   5   6   7   8   9    a    b    c     d    e    f

为什么要学习理解二进制?

  • 寄存器,内存,位!底层的每一位都有含义的,汇编入门理解的基础。
  • 汇编高层:了解程序的深层!操作系统的内核

数据宽度

  • 计算机:内存,给数据增加数据宽度
  • c和c++都需要定义数据类型,计算机底层需要我们给这些数据定义宽度
    • 位:0 1
    • 字节: 0 - 0XFF
    • 字: 0 - 0XFFFF
    • 双字: 0 - 0XFFFFFFF
  • 在计算机中,每一个数据都需要给它定义类型。给它定义宽度,在内存中的宽度。

有符号和无符号

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

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

  • 无符号规则:你这个数字是什么,那就是什么
1 0 0 1  1 0 1 0   十六进制:  0X9A    十进制:154 
  • 有符号数规则:最高位是符号位: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
原码:0 0 0 0 0 1 1 1
反码:1 1 1 1 1 0 0 0
补码:1 1 1 1 1 0 0 1
  • 如果看到一个数字,二进制的,需要了解它是有符号还是无符号
    寄存器:mov 寄存器,值
    在这里插入图片描述
    在这里插入图片描述
    学习直接操作来查看是最有效的
位运算
  • 计算机现在可以存储所以的数字(正数、浮点数、字符)的位运算!
  • 很多底层的调试器。需要通过位来判断CPU的状态

与运算:(and & )两个都为1,结果才为1

1 0 1 1 0 0 0 1
1 1 0 1 1 0 0 0 
---------------与运算
1 0 0 1 0 0 0 0

或运算(or | )只要有一个1,结果就为1

1 0 1 1 0 0 0 1
1 1 0 1 1 0 0 0 
---------------或运算
1 1 1 1 1 0 0 1

**异或运算(or ^ )不一样就是1,一样就是0

1 0 1 1 0 0 0 1
1 1 0 1 1 0 0 0 
---------------异或运算
0 1 1 0 1 0 0 1

非运算(单目运算符 ~) 0 就是1,1就是0

1 0 1 1 0 0 0 1
---------------非运算
0 1 0 0 1 1 1 0

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

位运算(移动位)

  • 左移(shl <<):所以二进制左移若干位,高位丢弃,低位补0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
  • 右移(shr >>):所以二进制右移若干位,低位丢去,高位就需要补0,1(符号位决定);
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
位运算的加减乘除

计算 4 + 5

0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 1
----------------------计算机是不会直接进行加法的
0 0 0 0 1 0 0 1
  • 计算机实现的原理
    • 第一步:异或,如果不考虑进位,异或就可以直接得到结果。
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 1
---------------------
0 0 0 0 0 0 0 1
  • 第二步:与运算(判断仅为,如果与运算结果为0,没有排位)
0 0 0 0 0 1 0 0
0 0 0 0 0 1 0 1
----------------------
0 0 0 0 0 1 0 0
  • 第三步:将与运算的结果,左移一位
0 0 0 0 0 1 0 0
----------------------
0 0 0 0 1 0 0 0 
  • 第四步:将第一步与第三步的进行异或。
0 0 0 0 0 0 0 1
0 0 0 0 1 0 0 0 
----------------------
0 0 0 0 1 0 0 1
  • 第五步:将第一步与第三步与运算(判断进位,如果与运算结果为0,没有进位)
0 0 0 0 0 0 0 1
0 0 0 0 1 0 0 0 
----------------------
0 0 0 0 0 0 0 0

所以最终的结果就是与运算为0的上一个异或运算。

计算4-5(其实就是4+(-5))

0 0 0 0 0 1 0 0
1 1 1 1 1 0 1 1
-------------------
1 1 1 1 1 1 1 1 
  • 计算机实现的原理
    • 第一步:异或,如果不考虑进位,异或就可以直接得到结果。
0 0 0 0 0 1 0 0
1 1 1 1 1 0 1 1
-------------------
1 1 1 1 1 1 1 1 
  • 第二步:与运算(判断仅为,如果与运算结果为0,没有排位)
0 0 0 0 0 1 0 0
1 1 1 1 1 0 1 1
-------------------
0 0 0 0 0 0 0 0 
  • 所以结果就是与运算什么那个了

乘法,说白了就是x*y,y个x相加。
除法,x/y,本质就是减法,就是x能减去多少个y

  • 机器语言就是位运算。都是电路来实现的,这就是计算机的最底层的本质。
汇编语言环境理解

在这里插入图片描述

  • 通过汇编指令可以给计算机发一些操作,然后让计算机执行。编译器的大佬,几乎都是原始的IDE
  • 在学习汇编之前,大家需要掌握环境的配置。(1、Vc6(程序到汇编的理解)2、OD! 3、抓包工具! 4、加密解密工具)
  • 学汇编不是为了写代码,理解程序的本质。
    在这里插入图片描述
通用寄存器:
  • 存储数据:CPU > 内存 >硬盘
  • 32位CPU: 6, 16, 32
  • 64位CPU: 8, 16, 32, 64

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

  • 存值的范围:0 ~ FFFFFFFF
  • 对于二进制来说:直接修改值

计算机如何向寄存器存值

  • mov指令
mov存的地址,存的数
mov存的地址1,存的地址1

可以将数字写入到寄存器,可以将寄存器中的值写到寄存器!
计算机:计算机!

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
L代表低8位,H代表高8位

除了这些通用的寄存器外,其它的寄存器都有自己的特定功能。

内存
  • 寄存器很小,不够用。所以说,数据方到内存!
  • 每个应用程度进程都有4GB的内存空间,空头支票
  • 程序真正运行的时候,才会用到物理内存
    • 1B = 8bit
    • 1KB = 1024B
    • 1MB = 1024KB
    • 1GB = 1024MB
  • 计算机中内存地址很多,空间很大。

内存地址

  • 计算机中的内存地址很多,空间很大,每个空间分配一个地址,名字。
  • 这些给内存起的编号,就是我们的内存地址,32位 8个 16进制的值。
  • 32位:寻找能力!
FFFFFFFF + 1 = 100000000  最大的值
  • 位是怎么限制大小的
100000000内存地址*8 = 位:800000000
转换为10进制/8 :  4294 967 296字节

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

内存如何存值

  • 数据宽度:byte word dword
  • 地址的位置: 0xFFFFFFFF
  • 不是任意的地址都可以写东西的,要申请使用的。所以只有程序申请的内容我们才可以使用

汇编中如何向内存写值

mov  数据宽度   内存地址   1
mov  byte/word/dword  ptr  ds:[0x19FF70],1
传递值的大小一定要和数据宽度相等

内存地址有多种写法

ds:  [0x19FF70 + 4]  内存地址便宜
ds:[eax]   寄存器
ds:[eax + 4] 寄存器偏移
数组[]
ds:[reg + reg*{1,2,3,4}]
ds:[reg + reg*{1,2,3,4} + 4]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值