汇编语言是除了机器语言我们能操纵的最底层的语言了,汇编语言是所有语言中效率最高的一种语言,很多的驱动,很多的嵌入式的都是用汇编语言写的,当然也有用C语言那写的,C语言是比汇编语言高级,学会了汇编语言,对底层有一个大概的了解,知道CPU和内存和各种各样的硬件他是如何的配合的,如何地读取信息的,在学习高级语言的话会更加的得心应手,用机器的思维去操作计算机,这是编程里面一个非常高的进阶,反编译破解一下,在破解的过程中涉及的就是汇编语言,他把C语音变成汇编语言,再变成机器语言,在把他的机器语言发布出来,然后机器与语言和机器语言是一一对应的,直接通过机器语言把他翻译成它对应的机器语言
汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程,CPU 和 内存 显卡 声卡 都是有内存的。
1.1机器语言
机器语言是机器指令的集合,CPU 电脑大脑唯一认可,就是0和1的集合,机器指令展开来讲就是一台机器可以正确执行的命令。
指令:01010000 (PUSH AH)
电平脉冲
早期程序员们将0,1数字编程的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。后来逐渐使用高科技..........但打洞洞是始祖 用了继电器,电子管,晶体管 进制转换 补码
1.2汇编语言的产生
汇编语言的主体是汇编指令
汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式(因为他便于记忆所以产生了汇编语言)
汇编指令是机器指令的助记符
机器指令:1000100111011000
操作:寄存器BX的内容送到AX中
汇编指令:MOV AX,BX 汇编语言移动方法
这样的写法与人类语言接近,便于阅读和记忆
寄存器:简单的讲是CPU中可以存储数据的器件,一个CPU中有多个寄存器。
AX是其中一个寄存器的代号
BX是另一个寄存器的代号
计算机能读懂的只有机器指令,那么如何让计算机执行程序员用汇编指令编写的程序呢
1.程序
2.汇编指令
mov ax ,bx
3.编译器
4.机器码
100001000111011000
5.计算机
1.3汇编语言的组成
1.汇编指令(机器码的助记符)
mov ax,bx
2.伪指令(由编译器执行)
3.其它符号(由编译器识别)
汇编语言的核心是汇编指令,它决定了汇编语言的特性
计算机CPU连加减乘除都不会, 只认识1和0,认识的运算符就是逻辑运算符(推荐一本书编码的奥秘)就是CUP是怎么样实现的,继电器的逻辑线路
1.4存储器
CPU是计算机的核心部件,他控制整个计算机的运作并进行运算,要想让一个CPU工作,就必须向他提供指令和数据
CPU是计算机的大脑,核心,心脏
指令是告诉CPU要怎么做
数据告诉CPU哪些是被做的,那些是做别人的
指令和数据在存储器中存放,也就是平时所说的内存
任何部件都有他的存储器,包括显卡,网卡
在一台PC机中内存的作用仅次于于CPU
离开了内存,性能再好的CPU也无法工作 通篇讲CPU怎么样跟内存打交道,怎么样控制内存 CUP读内存比较快,内存读数据比较慢
磁盘不同于内存,磁盘上的数据或程序,如果不读到内存中,就无法被CPU使用
1.5指令和数据
指令和数据是应用上的概念 在内存或磁盘上,指令和数据没有任何区别,都是二进制信息
二进制信息:
1000100111011000
——》89D8H(数据)
1000100111011000
——》MOV AX,BX(程序)
CPU处理的是二进制代码,这些也是指令,也是数据,就是根据我们程序员怎么样对他进行运用的
1.6存储单元
存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号
例如:
一个存储器有128个存储单元
编号从0~127
如右图示:
其实GPU的速度笔CPU快多了,三D游戏的要求都很高了
*不管是什么编程,只要是编号一定是从0开始
对于大容量的存储器一般还用以下单位来计量容器(以下用B来代表byte)
1kb=1024b
1mb=1024kb
1gb=1024mb
1tb=1024gb
磁盘的容量单位同内存的一样,实际上以上单位是微机中常用的计量单位
1.7CPU对存储器的读和写
CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行三类信息交互,
1.存储单元的地址(地址信息)
2.器件的选择,读或写命令(控制信息)
3.读或写的数据(数据信息)
那CPU是通过什么将地址、数据和控制信息传到存储芯片中的呢
电子计算机能处理、传输信息都是电信号,电信号当然用导线传送
在计算机中专门有连接CPU和其它芯片的导线,通常为总线
物理上:一根根导线的集合;
逻辑上划分为:
地址总线
数据中线
控制总线
1.8地址总线
CPU通过地址总线来指定存储单元的
地址总线上能传送多少个不同的信息,CPU就可以对多少个存储单元进行寻址
达到64位:你需要64位的CPU, 也需要64位的操作系统,要有64位的操作软件,缺一不可
一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N。
这样的CPU最多可以寻找2的N次方个存单元。
64位CUP一次可以走八个字节
一个字节可以存放多少个位,也就是2的8次方
1.9数据总线
CPU与内存或其它器件之间的数据传输是通过数据总线来进行
数据总线额宽度决定了CUP和外界的数据传送速度
数据总线就是一头高速公路,高速公路越大,每次来来回回的车辆越多,你运送的货物越快,这不决定于车的速度,而决定于车的大小
它们向内存中写入数据89D8H时,是如何通过数据总线传送数据的:
8088CPU数据总线上的数据传送情况
每次是传送8位的
8086CPU数据总线上的数据传送情况
16位数据总线上传送信息
1.10控制总线
CPU对外部器件的控制是通过控制总线来进行的。在这里控制总线是一个总称,控制总线是一些不同控制线的集合
宏观上来讲:有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制
所以控制总线的宽度决定了CPU对外部器件的控制能力,宽度越大越多条控制线,就对越多的端口进行控制
控制总线发送的控制信息
前面所讲的内存读或写命令是由几根控制线综合发出来的:
其中有一根名为读信号输出控制线负责由CPU向外传送读信号,CPU向该控制线上输入低电平表示将要读取数据
有一根名为写信号输出控制线负责由CPU向外传送写信号
小结
1.汇编指令是机器指令的助记符,同机器指令一一对应
用底层的思维来指导自己写出高级优秀的程序
2.每一种CPU都有自己的汇编指令集
酷睿 帮助处理图像 处理
3.CPU可以直接使用的信息在存储器中存放
CPU要运行必须要有数据交换的场所,就是存储器
CPU的缓存
4.在存储器中指令和数据没有任何区别,都是二进制信息
*主题
5.存储单元从0开始顺序编号
6.一个存储单元可以存储8个bit(用作单位写成“b”),即8位二进制数
7.1B=8bit 1KB=1024B 1MB=1024KB 1GB=1024MB
8.每一个CPU芯片都有许多管脚,这些管脚和总线相连。也可以说,这些管脚引出总线。一个CP可以引出三种总线的宽度标志了这个CPU不同的性能
地址总线的宽度决定了CPU的寻址能力
数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量
控制总线宽度决定了CPU对系统中其它器件的控制能力
在汇编过程中,我们从功能的角度介绍了这三类总线,对实际连接情况不做讨论
CPU在内存中读和写的过程
读
写
我们知道CPU是如何进行数据读写的。可是我们如何命令计算机进行数据的读写呢?
对于8086CPU,下面的机器码能够完成从3号单元读数据
机器码
好像在分析老爷车
含义:从3号单元读取数据送入寄存器AX
CPU接受这条机器码后将完成上面所述的读写工作
1.11内存地址空间(概述)
什么是内存地址空间呢?
一个CPU的地址宽度为10,那么可以寻址1024个内存单元,这1024个可寻到的内存单元就构成这个CPU的内存地址空间。下面深入讨论
首先需要介绍两部分基础知识,主板和接口卡
1.12主板
在每一台PC机中,都有一个主板,主板上有核心器件和一些主要器件
这些器件通过总线(地址总线,数据总线,控制总线)相连
1.13接口卡
计算机系统中,所有可用程序控制其工作的设备,必须受到CPU的控制
CPU对外部设备不能直接控制,如显示器,音响,打印机等。直接控制这些设备进行工作的是插在控制槽上的接口卡
网卡
接口与网络连接
显卡
进口有显示器连接
1.14各类存储器芯片
从读写属性上看分为两类
随机存储器RAM
只读存储器ROM
永远只能读,但是数据中
装有BIOS的ROM
BIOS:Basic Input/Output System,基本输入输出系统 主板的BIOS
BIOS是由主板和各类接口卡(如:显卡、网卡等)厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。在主板和某些接口卡上插有存储相应BIOS的ROM。
一个病毒能够杀入BIOS里面去,杀毒软件杀不了了
从功能和连接上分类
随机存储器RAM
装有BIOS的ROM
接口卡上的RAM
PC机中各类存储器的逻辑连接情况
CPU是大脑,存储器是*
上述的那些存储器在物理上是独立的器件
但是它们在以下两点上相同
1.都和CPU的总线相连
2.CPU对它们进行读和写的时候都通过控制线发出内存读写命令
CUP只能看到主存储器地址空间
将各类存储器看做一个逻辑存储器
假设内存地址分配如下
地址0~7FFFHd的32kb空间为主随机存储器的地址空间;
地址8000H~9FFFH的8kb空间为显存地址空间
地址A000H~FFFFH的24kb空间位各个ROM的地址空间
不同的计算机系统的内存地址空间分配情况是不同的
8086PC机内存地址空间分配的基本情况
英特尔 CPU IBM pore CPU 中国 龙 芯的CUP
8086PC机的内存地址空间分配
内存地址空间
最终运行程序的是CPU,我们用汇编编程的时候,必须要从CPU角度考虑清楚
我们学习这门课程的核心思维
C++的一个问题
q=(++j)(++j)(++j);
先优化一下
把前面两个当成系数
先放到DS寄存器,再把它递增一,再把他放回去,递增了两次之后他才来进行相加
7+7+8
对于CUP来讲,系统中的所有存储器中的存储单元都处于一个统一的逻辑存储器中,他的容量受CPU寻址能力的限制。这个逻辑存储器即是我们所说的内存地址空间
目标