汇编语言学习

机器语言

机器语言是机器指令的集合,机器指令展开来讲就是一台机器可以正确执行的命令,电子计算机的机器指令是一列二进制数字的。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算,
计算机是指由CPU和其受CPU直接或者间接控制的芯片,器件,设备组成的计算机系统,如PC机。
CPU是一种微型处理器,由于硬件设计和内部结构的不同,就需要用不同的电脉冲来控制,使他工作,每一种微型处理器都有自己的机器指令集,也就是机器语言。

CPU发展: 打孔-继电器-电子管-晶体管-石英振型

---显存(不同于内存,但也是存储器)	

显卡
—GPU(速度比CPU还快得多)

数据–存放–显存–读取–GPU–渲染–显示屏u

汇编语言的主题是汇编指令,汇编指令和机器指令的区别在于指令的表示方法,汇编指令是机器指令便于记忆的书写格式,

寄存器

简单地讲,寄存器是CPU中存储数据的器件,一个CPU中有多个寄存器,AX是其中一个寄存器的代号,BX是另一个寄存器的代号,

程序员用汇编语言写出源程序,再用汇编编译器编译成机器码

汇编语言的组成

汇编语言发展至今,有3类指令组成。

  • 汇编指令:机器码的助记符,有对应的机器码。
  • 伪指令:没有对应的机器码,由编译器执行,计算机并不执行
  • 其它符号:如+ - * /等,由编译器识别

汇编语言的核心是汇编指令,它决定了汇编语言的特性

CPU中有逻辑运算单元

存储器

计算机任何一个部件基本都有存储器 (BIOS,GPU,网卡)
CPU是计算机的核心部件,它控制整个计算机的运作并进行运算,想要让一个CPU工作就必须向他提供指令恶化数据,指令和数据在存储器中存放,也就是我们平时所说的内存,在一台PC机中内存的作用仅次于CPU,离开内存,性能再好的CPU也无法工作

指令和数据

指令和数据是应用上的概念,在内存或者磁盘上,指令和数据没有任何区别,都是二进制信息,CPU在工作的时候把有的信息看作指令,有的信息看作数据。同样的信息赋予了不同的意义,就像围棋的棋子,在棋盒里没有任何区别,在对弈的时候就有了不同的意义。
eg:内存中的二进制信息1000100111011000,计算机可以把它看作大小为89D8H的数据来处理,也可以将其看作指令mov ax,bx来执行

存储单元

存储器被划分为若干存储单元,每个存储单元从0开始顺序编号,如一个存储器有128个存储单元,编号从0~127
我们知道电子计算机的最小单位是bit,也就是一个二进制位。8个bit组成一个byte,也就是字节,微型机存储器的存储单元可以存储一个Byte,即8个二进制位,一个存储器有128个存储单元,可以存储128Byte

一个拥有128个存储单元的存储器,它的容量是128个字节。

CPU对存储器的读写

存储器被划分成多个存储单元。存储单元从零开始顺序编号,这些编号可以看作存储单元在存储器中的地址,就像一条街,每个房子都有门牌号。CPU要从内存中读取数据,首先要指定存储单元的地址,也就是它先要确定读取哪一个内存的单元中的数据。
在一台微机中,不只有存储器一种器件,CPU在读写数据时,还要指明,他要对哪一个器件进行操作,进行那种操作,是从中读出数据还是向里面写入数据。
CPU想要进行数据的读写,必须和外部器件进行下面3类信息的交互

  • 存储单元的地址
  • 器件的选择,读或者取。
  • 读或者写的数据

那么CPU通过什么将地址,数据和控制信息传到存储器芯片中的呢
电子计算机能处理传输的信息都是电信号,电信号当然要用导线传送,在计算机中有专门有链接CPU和其它芯片的导线,通常称为总线。总线在物理上来讲,就是一根根导线的集合。
根据传送信息的不同,总线从逻辑上又分为3类。地址总线,控制总线,数据总线。
eg:读操作

  • CPU通过地址线将地址信息发出
  • CPU通过控制线发出内存读命令,选中存储器芯片,并通知它,将要从中读取
  • 存储器将单元中的数据通过数据线送入CPU

地址总线

CPU是通过地址总线来指定存储单元。地址总线上能传送多是个不同的信息,CPU就可以多少个存储单元进行寻址。
假设一个CPU有10根地址总线,看看寻址情况,一根导线可以传送稳定状态只有两种,高电平和低电平。用二进制表示就是1或者0。10根导线可以传送10位二进制数据,而10位二进制数可以表示多少可以表示210
个不同的数据,最小数是0.最大数是1023。
计算机64位和32位代表的是寻址能力。体现出不同地址总线。一个CPU有N根地址线。则可以说这个CPU的地址总线宽度为N.这样的CPU最多可以寻找2的N次方个内存单元。

数据总线

CPU与内存或者其他器件之间的数据传送是通过数据总线来进行的。数据总线决定了CPU和外界的数据传送速度,8根数据总线一次可以传送一个8位二进制数据,16根数据总线一次可以传送连个字节。
8808CPU的数据总线宽度为8,8086CPU的数据总线宽度为16 、他们向内存中写入数据89D8H时,是如何通过数据总线传送数据。
8088CPU分两次传送传送89D8H,第一次传送D8,第二次89.(一个十六进制刚好16bit)
8086有16根数据线,可以一次传送16位数据。所以可以一次传送数据89D8H

控制总线

CPU对外部器件控制是通过控制总线来进行的,控制总线是一些不同控制线的集合,有多少根控制线就有多少种控制。所以控制宽度决定了CPU对外部器件的控制能力

内存读或者写是由几根控制线综合发出的,其中有一根称为”读信号输出”的控制线负责由CPU向外传送读信号。CPU向该控制线上输出低电平表示将要读取数据。一根称为写信号的控制线则负责传送写信号

小结

  • 汇编指令是机器指令的助记符。同机器指令一一对应

  • 每一种CPU都有自己的汇编指令集

  • CPU可以直接使用的信息在存储器中存放

  • 在存储器中指令和数据没有任何区别,都是二进制信息

  • 存储单元从0开始顺序编号

  • 1个存储单元可以存储8个bit,即8位二进制数

  • 1Byte=8bit

  • 每个CPU芯片都有许多管脚,这些管脚和总线相连,这些管脚引出总线

  • 地址总线的宽度决定了CPU的寻址能力

  • 数据总线的宽度决定了CPU与其它器件进行数据传送时的一次数据传送量

  • 控制总线的宽度决定了CPU系统中其它器件的控制能力

内存地址空间

CPU可以寻址到的内存单元构成内存地址空间

主板

主板上有核心器件,这些器件通过总线相连。这些器件有CPU,存储器,外围芯片组,扩展插槽等,扩展插槽上有RAM内存条和各类接口卡

接口卡

CPU对外部设备不能直接控制,如显示器,音响,打印机等,直接控制这些设备进行工作的是插在扩展插槽上的接口卡,扩展插槽通过总线和CPU相连,所以接口卡通过总线通CPU相连,CPU可以直接控制这些接口卡,从而实现CPU对外部设备的间接控制。

各类存储芯片

PC机中装有多个存储器芯片,存储器芯片从物理连接上看是独立的不同器件,从读写属性上看分为两类。随机存储器RAM和只读存储器ROM,随机存储器可读可写,但是必须带电存储,关机后存储内容丢失,只读存储器只能读取不能写入,关机后其中的内容不丢失

  • 随机存储器用于存放供CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成,装在主板上RAM和插在扩展插槽上的RAM.
  • 装有BIOS(Basic Input/Output Systen)的ROM
    BIOS是由主板和各类接口卡(网卡,显卡等)产商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出,在主板和某些接口卡上插有存储相应BIOS的ROM.主板上的ROM中存着主板的BIOS通常称为系统BIOS,显卡上的ROM存储着显卡的BIOS,如果网卡上装有ROM,就有存储网卡的BIOS
  • 接口卡上的RAM
    某些接口卡需要对大批量输入输出数据进行暂时存储,在其上装有RAM,最典型的是显卡上的RAM,显示卡随时将显存中的数据想显示器上输出,换句话说,我们将需要显示的内容写入显存,就会出现在显示器上
    img-fBXT7xSn-1564630445893

内存地址空间

上面那些存储器,在物理上是独立的器件,但是都有以下两个相同点

  • 都是和CPU总线相连
  • CPU对它们进行读或者写的时候都通过控制线发出内存读写命令

也就是说,CPU在操控他们的时候,把他们当作内存来对待,把他们总的看作一个由若干存储单元组成的逻辑存储器器,这个逻辑存储器就是我们所说的内存地址空间

CPU将系统中个各类存储器看作一个逻辑存储器的情况

所有的物理存储器被看作一个若干存储器的那组成的逻辑存储

器,每个物理存储器在这个逻辑存储器中占有一个地址段,及一段地址空间,CPU在这段空间中读写数据,实际上就是在相对应的物理存储器中读写数据。

内存地址空间的大小受CPU地址总线宽度的限制,8086CPU的地址总线宽度为20,可以传送220 个不同的地址信息(从0到220 -1),即可以定位220个内存单元,则8086CPU的内存地址空间大小为1MB,同理,80386CPU的地址总线宽度为32,则内存地址空间最大为4GB。

在基于一个计算机硬件系统编程的时候,必须要指定这个系统中的内存地址空间分配情况,因为当我们想在某类存储器中读写数据时,必须指定它第一个单元的地址和最后一个单元的地址,才能保证读写操作是在预期的存储器中进行,比如要想显示器输出一段信息,那么必须将这些信息写到显存中,显卡才能将它们输出到显示器上,要想显存中写入数据,必须要知道显存在内存地址空间的地址。

不同的计算机系统的内存地址空间的分配情况不同。如8086PC机 地址 0~9FFFF的内存单元是主存储器地址空间(RAM),A0000~BFFFF是显存地址空间,C0000到FFFFF是各类ROM地址空间

最终运行程序的是CPU,我们用汇编语言编程的时候,必须要从CPU的角度考虑问题,对CPU来讲,系统中的所有存储器中的存储单元都处于一个同一的逻辑存储器中,他的容量受CPU寻址能力地址总线的宽度的限制,这个逻辑存储器即是我们所说的内存地址空间。

寄存器

一个典型的CPU由运算器,控制器,寄存器等器件构成。这些器件靠内部的总线相连,前面提到的地址总线相对于CPU内部来说是外部总线,内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其它器件的联系。
在CPU中:

  • 运算器进行信息处理。
  • 寄存器进行信息存储。
  • 控制器控制各种器件进行工作。
  • 内部总线连接各种器件,在他们之间进行数据的传送。

对程序员来说,CPU中的主要部件是寄存器,寄存器是CPU中程序员可以用指令读写的部件,程序员通过改变各种寄存器中的内容来实现对CPU的控制。

通用寄存器

不同的CPU,寄存器的个数,结构是不同的,8086CPU有14个寄存器,每个寄存器有一个名称,这些寄存器是:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW.

8086CPU的所有寄存器都是16位的,可以存放两个字节。
AX,BX,CX,DX这个4个寄存器通常用来存放一般性数据,被称为通用寄存器。

以AX为例子。
[外链图片转存失败(img-t6Obrlzp-1564631038330)(D:\汇编\王爽版\AX寄存器.png)]

为了保证兼容,因为之前的寄存器是8位的,所以这四个16位寄存器都可以分为来个独立使用的8位寄存器来用。

  • AX可以分为AH和AL;
  • BX可以分为BH和BL;
  • CX可以分为CH和CL;
  • DX可以分为DH和DL;

AH这类可以当8位寄存器使用。

img-aVGSjnxm-1564630445897

补零的地方相当于没有。

字在寄存器中的存储

因为兼容性考虑,8086CPU可以处理两种尺寸的数据。

  • 字节: 记为byte,一个字节由8个bit组成,可以存在8位寄存器中

  • 字: 记为word,一个字由两个字节组成,两个字节分别称为,这个字的高位字节和低位字节。

    高八位地址在低八位之后

img-Whv1BF1E-1564630445898

一个字可以存在一个16寄存器中,这个字的高字节和低字节自然就存在这个寄存器的高8位和低8位寄存器中。
在AH和AL中的数据,既可以看作一个字型数据的高8位和低8位,这个字型数据的大小是20000;又可以看成是两个独立的字型数据。他们的大小分别是78和32.

由于一个内存单元可存放8位数据,CPU中的寄存器又可以存放n个8位的数据,所以计算机的数据大多数是由1~N个8位数据构成。很多时候,需要直观地看出数据的各个字节数据的值。
用16进制表示的时候可以更直观地看出,这个数据由哪两个8位数据构成。
如果AX中存放4E20,则AH里是4E,AL里是20.
为了区分不同进制,在十六进制的后面加H,在二进制数据的后面加B,十进制后面什么都不加。

汇编指令

汇编指令高级语言
mov ax,18AX=18
mov ah,78AH=78
add ax,8AX=AX+8
mov ax,bxAX=BX
add ax,bxAX=AX+BX

汇编指令或者一个寄存器的名称不区分大小写

物理地址

cpu访问内存单元时,要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间,每个内存单元在这个空间中的唯一的地址,我们将唯一的地址称为物理地址。cpu通过地址总线送入存储器的,必须是一个内存单元的地址,在CPU向地址总线上发出地址之前,必须要在内部先形成这个物理地址,不同的CPU可以有不同的形成物理地址的方式。

16位结构CPU

8086是16位结构的CPU,16位结构的含义

  • 运算器依次最多可以处理16位的数据。
  • 寄存器的最大宽度为16位。
  • 寄存器和运算器之间的通路为16位。

8086cpu给出物理地址的方法

8086CPU的20位地址总线,可以传送20位地址,达到1MB的寻址能力,8086CPU是16位结构。内部一次性处理,传输,暂时存储的地址为16位,它只能送出16位的地址,表现出的寻址能力只能有64KB.
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

img-lpdpwQEr-1564630445899

  1. CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址。
  2. 段地址和偏移地址通过内部总线送入一个称为地址加法器的部件
  3. 地址加法器将两个16位地址合成为一个20位的物理地址。
  4. 地址加法器通过内部总线将20位物理地址送入输入输出控制电路
  5. 输入输出控制电路将20位物理地址送上地址总线
  6. 20位物理地址被地址总线传送到存储器

地址加法器采用 物理地址=段地址x16+偏移量 的方法用端地址和偏移地址合成物理地址。
16进制乘16恰好是进位。
img-kVFfOnbM-1564630445903

由段地址x16引发的讨论
段地址x16有一个更常用的说法,就是左移动4位。这里指的位是二进制位。

img-XzQu91dX-1564630445907

img-GQ5cKnsi-1564630445910

段地址x16+偏移地址=物理地址的本质含义

CPU在访问内存地址

寻址空间一般指的是CPU对于内存寻址的能力。通俗地说,就是能最多用到多少内存的一个问题。数据在[存储器](https://baike.baidu.com/item/存储器](RAM)中存放是有规律的 ,CPU在运算的时候需要把数据提取出来就需要知道数据存放在哪里 ,这时候就需要挨家挨户的找,这就叫做寻址,但如果地址太多超出了CPU的能力范围,CPU就无法找到数据了。 CPU最大能查找多大范围的地址叫做寻址能力 ,CPU的寻址能力以字节为单位 ,如32位寻址的CPU可以寻址2的32次方大小的地址也就是4G,这也是为什么32位的CPU最大能搭配4G内存的原因 ,再多的话CPU就找不到了。

课程介绍 第1章 预备知识  1.1 汇编语言的由来及其特点   1 机器语言   2 汇编语言   3 汇编程序   4 汇编语言的主要特点   5 汇编语言的使用领域  1.2 数据的表示和类型   1 数值数据的表示   2 非数值数据的表示   3 基本的数据类型  1.3 习题 第2章 CPU资源和存储器  2.1 寄存器组   1 寄存器组   2 通用寄存器的作用   3 专用寄存器的作用  2.2 存储器的管理模式   1 16位微机的内存管理模式   2 32位微机的内存管理模式  2.3 习题 第3章 操作数的寻址方式  3.1 立即寻址方式  3.2 寄存器寻址方式  3.3 直接寻址方式  3.4 寄存器间接寻址方式  3.5 寄存器相对寻址方式  3.6 基址加变址寻址方式  3.7 相对基址加变址寻址方式  3.8 32位地址的寻址方式  3.9 操作数寻址方式的小结  3.10 习题 第4章 标识符和表达式  4.1 标识符  4.2 简单内存变量的定义   1 内存变量定义的一般形式   2 字节变量   3 字变量   4 双字变量   5 六字节变量   6 八字节变量   7 十字节变量  4.3 调整偏移量伪指令   1 偶对齐伪指令   2 对齐伪指令   3 调整偏移量伪指令   4 偏移量计数器的值  4.4 复合内存变量的定义   1 重复说明符   2 结构类型的定义   3 联合类型的定义   4 记录类型的定义   5 数据类型的自定义  4.5 标号  4.6 内存变量和标号的属性   1 段属性操作符   2 偏移量属性操作符   3 类型属性操作符   4 长度属性操作符   5 容量属性操作符   6 强制属性操作符   7 存储单元别名操作符  4.7 表达式   1 进制伪指令   2 数值表达式   3 地址表达式  4.8 符号定义语句   1 等价语句   2 等号语句   3 符号名定义语句  4.9 习题 第5章 微机CPU的指令系统  5.1 汇编语言指令格式   1 指令格式   2 了解指令的几个方面  5.2 指令系统   1 数据传送指令   2 标志位操作指令   3 算术运算指令   4 逻辑运算指令   5 移位操作指令   6 位操作指令   7 比较运算指令   8 循环指令   9 转移指令   10 条件设置字节指令   11 字符串操作指令   12 ASCII-BCD码调整指令   13 处理器指令  5.3 习题 第6章 程序的基本结构  6.1 程序的基本组成   1 段的定义   2 段寄存器的说明语句   3 堆栈段的说明   4 源程序的结构  6.2 程序的基本结构   1 顺序结构   2 分支结构   3 循环结构  6.3 段的基本属性   1 对齐类型   2 组合类型   3 类别   4 段组  6.4 简化的段定义   1 存储模型说明伪指令   2 简化段定义伪指令   3 简化段段名的引用  6.5 源程序的辅助说明伪指令   1 模块名定义伪指令   2 页面定义伪指令   3 标题定义伪指令   4 子标题定义伪指令  6.6 习题 第7章 子程序和库  7.1 子程序的定义  7.2 子程序的调用和返回指令   1 调用指令   2 返回指令  7.3 子程序的参数传递   1 寄存器传递参数   2 存储单元传递参数   3 堆栈传递参数  7.4 寄存器的保护与恢复  7.5 子程序的完全定义   1 子程序完全定义格式   2 子程序的位距   3 子程序的语言类型   4 子程序的可见性   5 子程序的起始和结束操作   6 寄存器的保护和恢复   7 子程序的参数传递   8 子程序的原型说明   9 子程序的调用伪指令   10 局部变量的定义  7.6 子程序库   1 建立库文件命令   2 建立库文件举例   3 库文件的应用   4 库文件的好处  7.7 习题 第8章 输入输出和中断  8.1 输入输出的基本概念   1 I/O端口地址   2 I/O指令  8.2 中断   1 中断的基本概念   2 中断指令   3 中断返回指令   4 中断和子程序  8.3 中断的分类   1 键盘输入的中断功能   2 屏幕显示的中断功能   3 打印输出的中断功能   4 串行通信口的中断功能   5 鼠标的中断功能   6 目录和文件的中断功能   7 内存管理的中断功能   8 读取和设置中断向量  8.4 习题 第9章 宏  9.1 宏的定义和引用   1 宏的定义   2 宏的引用   3 宏的参数传递方式   4 宏的嵌套定义   5 宏与子程序的区别  9.2 宏参数的特殊运算符   1 连接运算符   2 字符串整体传递运算符   3 字符转义运算符   4 计算表达式运算符  9.3 与宏有关的伪指令   1 局部标号伪指令   2 取消宏定义伪指令   3 中止宏扩展伪指令  9.4 重复汇编伪指令   1 伪指令REPT   2 伪指令IRP   3 伪指令IRPC  9.5 条件汇编伪指令   1 条件汇编伪指令的功能   2 条件汇编伪指令的举例  9.6 宏的扩充   1 宏定义形式   2 重复伪指令REPEAT   3 循环伪指令WHILE   4 循环伪指令FOR   5 循环伪指令FORC   6 转移伪指令GOTO   7 宏扩充的举例   8 系统定义的宏  9.7 习题 第10章 应用程序的设计  10.1 字符串的处理程序  10.2 数据的分类统计程序  10.3 数据转换程序  10.4 文件操作程序  10.5 动态数据的编程  10.6 COM文件的编程  10.7 驻留程序  10.8 程序段前缀及其应用   1 程序段前缀的字段含义   2 程序段前缀的应用  10.9 习题 第11章 数值运算协处理器  11.1 协处理器的数据格式   1 有符号整数   2 BCD码数据   3 浮点数  11.2 协处理器的结构  11.3 协处理器的指令系统   1 操作符的命名规则   2 数据传送指令   3 数学运算指令   4 比较运算指令   5 超越函数运算指令   6 常数操作指令   7 协处理器控制指令  11.4 协处理器的编程举例  11.5 习题 第12章 汇编语言和C语言  12.1 汇编语言的嵌入  12.2 C语言程序的汇编输出  12.3 一个具体的例子  12.4 习题 附录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值