汇编语言阅读笔记【基础知识】

一、参考

汇编语言-王爽

二、概要

汇编语言是和具体的微处理器相联系的,每一种微处理器的汇编语言都不一样,只能通过一种常用的、结构简洁的微处理器的汇编语言进行学习,从而达到学习汇编语言的两个根本目的:
(1)充分获得底层编程的体验
(2)深刻理解机器运行程序的机理

使用的以8086CPU为中央处理器的PC机进行学习,因为:常用而且结构简洁

三、基本知识

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

寄存器,简单讲是CPU中可以存储数据的器件,一个CPU中包含多个寄存器

计算机如何执行程序员用汇编指令编写的程序呢?
(1)程序员用汇编语言写出源程序;
(2)使用汇编编译器将源程序编译为机器码
(3)计算机执行机器码

汇编语言阅读笔记【基础知识】_第1张图片

3.1 汇编语言的组成

汇编语言由三种指令组成:

  1. 汇编指令:机器码的助记符,有对应的机器码;
  2. 伪指令:没有对应的机器码,由编译器执行,计算机并不执行;
  3. 其他符号,例如:+,-,*,/ 等,由编译器识别,没有对应的机器码

3.2 指令和数据

CPU是计算机的核心部件,控制着整个计算机的运作、进行计算,CPU工作需要提供指令和数据(指令和数据保存在内存中,CPU可以读取和写入)

指令和数据是应用上的概念,在内存和磁盘中,指令和数据没有任何区别(都是二进制信息),CPU根据不同需求,把二进制信息解析为指令和数据,赋予其不同意义。

内存被划分为若干个存储单元,一个存储单元可以存储一个Byte(字节)

CPU要想进行数据的读写,需要和外部器件(芯片)进行3类信息的交互:

(1)存储单元的地址(地址信息);
(2)芯片的选择,读或者写的命令(控制信息);
(3)读或者写的数据(数据信息)

计算机CPU和其他芯片连接的导线称为总线(一根根导线的集合),根据传送信息的不同,总线从逻辑上分为3类:地址总线、控制总线、数据总线

地址总线:通过地址总线来指定存储器单元
数据总线:CPU与内存或者其他器件之间的数据传送是通过数据总线进行的
控制总线:对外部器件的控制是通过控制总线进行的

CPU从3号单元读取数据过程?

(1)CPU通过地址总线将地址信息(3单元)发出;
(2)CPU通过控制线发出内存读命令,选中存储器芯片,通知它,从中读取数据;
(3)存储器将(3单元)数据(8)通过数据线送入CPU中

CPU向3号单元写入数据过程?

(1)CPU通过地址线将地址信息(单元3)发出;
(2)CPU通过控制线发出内存写入命令,选中存储器芯片,通知它,向其中写入数据;
(3)CPU通过数据线将数据(26)写入到内存的3单元中

一个CPU如果有n根地址线,则这个CPU的地址总线宽度为n,最多可以寻找2的n次方的内存单元(即2**n Byte)

数据总线的宽度决定了CPU和外界的数据传送速度,8根数据总线一次可以传送一个8位二进制数据(1Byte),16根数据总线一次可以传送两个字节(2Byte)

控制总线的宽度决定了CPU对外部器件的控制能力
内存读或者写命令是由几根控制线综合发出的,其中一根称为“读信号输出”的控制线负责由CPU向外传送读信号,CPU向该控制线上输出低电平表示将要读取数据;
有一根称为“写信号输出”的控制线负责传送写信号。

3.3 硬件描述

主板:每个PC机中,都有一个主板,主板上有核心器件和一些主要器件,通过总线(3种)相连接,这些器件有CPU,存储器,外围芯片组,扩展插槽等等,扩展插槽中一般插有RAM内存条和各类接口卡

接口卡:直接控制外部设备(显示器、音箱、打印机等)进行工作的是插在扩展插槽上的接口卡,CPU通过控制接口卡,实现CPU对外设的间接控制,即CPU通过总线向接口卡发送命令,接口卡根据CPU的命令控制外设进行工作。

存储器芯片:一个PC机中,装有多个存储器芯片,从物理连接上,这些芯片是独立的,不同的器件。从读写属性,可以分为RAM(随机存储器)和ROM(只读存储器),从功能和连接上可以分为:
(1)随机存储器:存放CPU使用的绝大部分程序和数据,主随机存储器一般由两个位置上的RAM组成,装在主板上的RAM和插在扩展插槽上的RAM
(2)装有BIOS (basic input/output system)的ROM
BIOS是由主板和各类接口卡(显卡、网卡等)厂商提供的软件系统,可以通过它利用该硬件设备进行最基本的输入输出。
主板和某些接口卡上插有存储对应的BIOS的ROM,例如:主板上的ROM中保存着主板的BIOS(系统BIOS),显卡ROM上存储着显卡的BIOS,网卡ROM(如果安装)存储着网卡的BIOS

(3)接口卡的RAM,某些接口卡需要对大批量的输入、输出数据进行暂时存储,在其上装有RAM,最典型的是显示卡上的RAM,一般称为显存,显示卡随时将显存中的数据向显示器上输出

汇编语言阅读笔记【基础知识】_第2张图片

3.4 内存地址空间

各种存储器是独立的器件,但是:
(1)都与CPU的总线相连;
(2)CPU对其进行读或者写都通过控制总线发出内存读写命令
CPU在操控这些存储器时候,都把它们当作内存对待,看成是一个由若干个存储单元组成的逻辑存储器,即称为内存地址空间

汇编语言阅读笔记【基础知识】_第3张图片

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

内存地址空间的大小受CPU地址总线宽度的限制,

汇编语言阅读笔记【基础知识】_第4张图片

8086CPU地址总线宽度是20,即拥有2**20 1M的内存地址空间
80386CPU地址总线宽度是32,即拥有2**32 4G的内存地址空间

汇编语言阅读笔记【基础知识】_第5张图片
由图可得,在8086PC机器中,
最初的640KB内存中读取数据,实际上就是在读取主随机存储器中的数据,
向随后的128KB内存中写入数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上;向最后的256KB内存中写入数据的操作是无效的,因为这等于要修改只读存储器的内容。

最终运行程序的是CPU,对于CPU来说,系统的所有存储器的存储单元都处于一个统一的逻辑存储器中,其容量受到CPU寻址能力的限制,这个统一的逻辑存储器,称为内存地址空间。

四、寄存器

一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件使用内部总线连接。
运算器:进行信息处理
寄存器:进行信息存储
控制器:控制各种器件进行工作;

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

4.1 通用寄存器

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

为了保持兼容,8086CPU的4个通用寄存器可以独立使用8个8位寄存器表示

AX分为AH AL
BX分为BH BL
CX分为CH CL
DX分为DH DL
其中,AX的低8位构成了AL寄存器,高8位构成了AH寄存器

出于对兼容性的考虑,8086CPU可以一次性处理两种尺寸的数据
(1)字节,byte, 8bit, 保存在8位寄存器中
(2)字,word, 16bit, 保存为2个字节,称为高位字节、低位字节

汇编语言阅读笔记【基础知识】_第6张图片

4.2 段寄存器CS

CS和IP是8086CPU中两个最关键的寄存器,指示了CPU当前要读取指令的地址,CS为代码段寄存器,IP为指令指针寄存器,假设:任意时刻,CS中的内容为M,IP中的内容是N,则CPU将从内存M*16 +N单元开始,读取一条指令并且执行

在任意时刻,CPU将CS:IP指向的内容当作指令执行,工作过程简单描述如下:
(1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP=IP+所读取指令的长度,从而指向下一条指令;
(3)执行指令,转到(1)重复

在8086CPU加电或者复位后(即CPU刚开始工作时候)CS和IP被设置为CS=FFFFH, IP=0000H,即在机器刚刚启动时候,CPU从内存FFFF0H单元中读取指令执行,该指令为开机后执行的第一条指令。

问:第三章中说到,在内存中,指令和数据没有任何区别,都是二进制信息,CPU在工作时候如何判断指令和数据呢?
答:CPU将CS:IP指向的内存单元中的内容当作指令,因为,在任何时候,CS:IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。如果,内存中的一段信息被CPU执行过,则其所在的内存单元必然被CS:IP指向过。

问:如何修改CS,IP指令的值?
答:能够修改CS,IP的内容的指令被统称为转移指令,例如:jmp指令

形式如下:
(1)jmp 段地址:偏移地址
用指令中给出的段地址修改CS,偏移地址修改IP

jmp 2AE3:3 执行后,CS=2AE3H, IP=0003H, CPU从2AE33H处读取指令;
jmp 3:0B16 执行后,CS=0003H, IP=0B16H, CPU从00B46H处读取指令

(2)jmp 某个合法寄存器
用寄存器中的值修改IP
jmp ax, 类似于 mov IP, ax 将ax寄存器中的值赋予IP

4.3 代码段

对于8086PC机,可以根据需要,将一组内存单元定义为一个段,段的长度小于等于64KB, 存在一组地址连续、起始地址为16的倍数的内存单元中

问:如何使得代码段中的指令被执行呢?
答:将一段内存当作代码段,仅仅是编程时候的一种方法,CPU只会认为CS:IP指向所定义的内容为指令,所以,如果让CPU执行放在代码段中的指令,需要将CS:IP指向所定义的代码段中的第一条指令的首地址。

4.4 段寄存器DS

4.5 段寄存器SS

你可能感兴趣的:(asm,cpu,cpu架构,指令)