编程语言
首页 > 编程语言> > 二进制到汇编

二进制到汇编

作者:互联网

二进制到汇编:

学习视频-狂神说二进制到汇编:视频链接

二进制到汇编

概述

学习汇编语言是你的必经之路

机器语言

人与人沟通?语言! 老外! 计算机! 学习计算机的语言!

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

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

汇编语言
 加 INC  -编译器-> 0100 0000
 减 DEC           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

计算机

程序员的鄙视链

暴破

底层:VC6 OD

进制

二进制?0 1

学习进制的障碍?

二进制

进制?

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 7 8 9 a b c d e f

进制远远没有大家想的那么复杂。查数

测试

 # 一进制   1~20
 1
 1 1
 1 1 1
 1 1 1 1
 ....
 
 # 三进制  1~20
 十进制:0  1   2  3    4    5   6  7   8   9    10
 三进制: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

 # 七进制  1~20
 0   1   2   3   4   5   6   
 10  11  12  13  14  15  16
 20  21  22  23  24  25  26  
 
 #一组符号,逢几进几

问题:你真的理解进制了吗?1+1=3对吗?!如果你可以使用进制来解答这个问题,那么你就学会了!

进制怎么计算

 # 八进制计算下面的结果
 2+3=5
 2*3=6
 4+5=11 #就是从4往后面数数+5所以就往后数5个就是11
 4*5=24 # *5就是从4往后面数5组即为24,从4开始每组4个5组
 
 # 运算的本质就是查数
 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27
 
 # 八进制计算下面的结果  九九乘法表=加法表!
 277+333 =
 276*54 = 
 237-54 =
 234/4 =

八进制的乘法表

1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7
2*2=4 2*3=6 2*4=10 2*5=12 2*6=14 2*7=16
3*3=11 3*4=14 3*5=17 3*6=22 3*7=25
4*4=20 4*5=24 4*6=30 4*7=34
5*5=31 5*6=36 5*7=43
6*6=44 6*7=52
7*7=61

八进制的加法表

1+1=2
1+2=3 2+2=4
1+3=4 2+3=5 3+3=6
1+4=5 2+4=6 3+4=7 4+4=10
1+5=6 2+5=7 3+5=10 4+5=11 5+5=12
1+6=7 2+6=10 3+6=11 4+6=12 5+6=13 6+6=14
1+7=10 2+7=11 3+7=12 4+7=13 5+7=14 6+7=15 7+7=16
 # 运算的本质就是查数
 
 277
 333     +
 ----------
 632
 
 
       276
        54  *
 ------------
      1370
     1666   +
 ------------
     20250
 
 # 减法的本质其实就是加法!  237-54 = 237 +(-54)
 --------
 # 除法的本质,除数乘以那个数最接近结果即可!
 234             #思路:这里先使用2除以4发现除不懂然后看23除4去乘法表查看
   4                   看看哪两个数相乘最接近23,这里发现4*4=20,然后等
 ------                于4在看34除以4,看看哪两个数相乘接近发现4*7=34,
  47                   所以等于47.

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

二进制

计算机使用二进制 0 1! 状态!电子! 物理极限:摩尔定律!硬操作!追求语言的极致!并发语言!软操作 !

传统的计算机:继承电路! 0 1 。硅晶片!

量子计算机:(传道)

回到我们的电子计算机! 0 1!

 二进制: 0   1111
  0   1  10  11  100  101 111  1000   1001  1010  1110  1111  

二进制这么去写很麻烦!二进制能否简写!

  0   1  2  3  4  5   6  7  8  9   10  a  b  c  d  e  f

这就是我们的16进制!(计算机操作系统原理:可以听听)

课程上的教学!2进制转换为10进制。然后计算!

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

寄存器、内存、位!底层的每一个位都是有含义的。汇编入门理解的基础!

汇编高级:了解程序的深层!操作系统的内核?

数据宽度

计算机:内存!给数据增加数据宽度。

数据宽度

C 和 C++ Java都需要定义数据的类型。计算机底层需要我们给这些数据定义宽度。

位 0 1

字节 0-0xFF

字 0-0xFFFF

双字 0-0xFFFFFFFF

在计算机中,每一个数据都需要给它定义类型。给它定义宽度。在内存中的宽度。

有符号数无符号数

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

 0 1 0 1 0 1 0 1

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

无符号数规则

你这数字是什么,那就是什么。

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

有符号数规则

最高位是符号位:1(负数) 0(正数)

 1 0 0 1  1 0 1 0 如何转换?

原码反码补码

之后要用它来计算。

编码规则

有符号数的编码规则

测试

 # 现在我说的这些都是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

如果看到一个数字,二进制的,需要了解他是有符号数还是无符号数。

寄存器:

寄存器存1

寄存器存-1

学习通过直接操作来查看是最有效的。

位运算

计算机现在可以存储所有的数字(整数,浮点数,字符),运算!

0 1

位运算?
与运算(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,取反!

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

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

位运算(移动位)
(有符号)左移:(shl <<)
0000 0001  @ 所有的二进制位全部左移若干位,高位就丢弃了,低位补0
0000 0010
(有符号)右移:(shr >>)
0000 0001  @所有二进制位全部右移若干位,低位就丢弃了,高位就需要补0,1(符号位决定。)
0000 0000

int a = 10;
printf("%d\n,a>>2");

二进制、位运算=>加减乘除

位运算的加减乘除

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

0000 0100
1111 1011
---------- 异或(如果不考虑进位,异或就可以直接出结果)
1111 1111

0000 0100
1111 1011
---------- 与(判断进位,如果与运算结果为0,没有进位)
0000 0000

# 最终结果 
1111 1111  16 ff  10  -1
计算机只会做加法!

(现在应该可以:从零自己设计一套进制规则,自己设计电路,来实现加减乘除 手动转换这个结果和值10进制和2进制转换!现在看:大学的计算机组成原理,可能就不是那么难理解了)

汇编语言环境说明

通过指令来代替我们的二进制编码!

汇编指令代替二进制编码

学汇编不是为了写代码

程序的本质

汇编入门:了解汇编和程序的对应关系,程序的本质即可!

学汇编的工具OD

寄存器(多,学习通用即可)、内存(简单)、汇编指令(多)

通用寄存器

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

32位 CPU 8 16 32

64位 CPU 8 16 32 64

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

8个通用寄存器

存值的范围:0 - FFFFFFFF

对于二进制来说,直接修改值

计算机如何向寄存器存值?

mov指令
mov 存的地址,存的数
mov 存的地址A,存的地址B # B的数据存入A中

mov指令

可以将数字写入到寄存器,可以将寄存器中的值写到寄存器。

计算机:计算力。

不同的寄存器
FFFFFFFF     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的内存空间。虚拟内存,空头支票。

内存空间

程序真正运行的时候,才会用到物理内存

4G的内存,4096M => 最终计算为位,就是这个可以存储的最大容量。

计算机中内存地址很多,空间很大。

内存地址

存一个数:占用的大小,数据宽度!存在哪里?

计算机中内存地址很多,空间很大,每个空间分配一个地址,名字。

内存地址

这些给内存起的编号,就是我们的内存地址。32位 8个 16进制的值

32位:寻址能力!4GB。推导

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

编号

内存如何存值?

不是任意的地址都可以写东西的,申请使用的。只有程序申请过的内存才能使用。

汇编如何向内存中写值:
    数据宽度:
    QWORD  DWORD  WORD  BYTE
     64位   32位   16位   8位
mov 数据宽度 内存地址,值
mov byte/word/dword/qword 内存地址,值

mov byte ptr ds:[0x19ff70],1

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

内存中写值

内存地址有多种写法

数组[]

为什么32位系统最大只支持4G内存

寻址空间一般指的是CPU对于内存寻址的能力。CPU最大能查找多大范围的地址叫做寻址能力。CPU的寻址能力以字节为单位 (字节是最小可寻址单位)

  1. 内存把8个比特(8bit)排成一组,每一组为一个单位,大小记为一个字节(Byte),CPU每次只能访问去访问一个字节(Byte),不能去访问每一个比特。一个字节就是最小的内存IO单位

  2. 计算机系统会给内存中的每一个 *字节* 分配一个内存地址,CPU只要知道某个数据类型的地址,就可以到地址所指向的内存去读取数据

  3. 在32位系统中,内存地址就是32位的二进制数,所以32位地址范围就是从0x0——0xFFFFFFFF,即一共有232个地址,每个地址对应一个字节

  4. 232 = 410241024*1024=4G,如上,每一个地址对应一个字节,所以232个地址就对应着这232个字节(Byte),即对应着4GB(B即Byte)的内存容量
    如果你给32系统配上了8G内存,操作系统最多只能给其中的4GB分配地址,其他4GB是没有地址的。

  5. 指针

    • 我们都知道指针在32位系统上(用sizeof可以得出其)大小为4个字节,之前就一直很奇怪,为什么无论是int型还是char型,其大小都是4个字节。

    • 首先,指针是用来保存地址的,因此无论是什么类型,其大小应该都是一样的。

    • 第二,指针是用来保存地址的,而对于32位系统,内存地址是1个32位长度的二进制数,因此,为4个字节;而对于64位系统,则会返回8个字节

标签:汇编,运算,0000,进制,10,二进制,0100,1000
来源: https://www.cnblogs.com/ZhaiTangGuo/p/16366000.html