汇编语言-王爽程序员
汇编语言是和具体的微处理器相联系的,每一种微处理器的汇编语言都不同,只能经过一种经常使用的、结构简洁的微处理器的汇编语言进行学习,从而达到学习汇编语言的两个根本目的:
(1)充分得到底层编程的体验
(2)深入理解机器运行程序的机理编程
使用的以8086CPU为中央处理器的PC机进行学习,由于:经常使用并且结构简洁学习
汇编语言的主体是汇编指令,汇编指令和机器指令的差异在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式。spa
寄存器,简单讲是CPU中能够存储数据的器件,一个CPU中包含多个寄存器3d
计算机如何执行程序员用汇编指令编写的程序呢?
(1)程序员用汇编语言写出源程序;
(2)使用汇编编译器将源程序编译为机器码
(3)计算机执行机器码指针
汇编语言由三种指令组成:code
+,-,*,/
等,由编译器识别,没有对应的机器码CPU是计算机的核心部件,控制着整个计算机的运做、进行计算,CPU工做须要提供指令和数据(指令和数据保存在内存中,CPU能够读取和写入)blog
指令和数据是应用上的概念,在内存和磁盘中,指令和数据没有任何区别(都是二进制信息),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向该控制线上输出低电平表示将要读取数据;
有一根称为“写信号输出”的控制线负责传送写信号。
主板:每一个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,通常称为显存,显示卡随时将显存中的数据向显示器上输出
各类存储器是独立的器件,可是:
(1)都与CPU的总线相连;
(2)CPU对其进行读或者写都经过控制总线发出内存读写命令
CPU在操控这些存储器时候,都把它们看成内存对待,当作是一个由若干个存储单元组成的逻辑存储器,即称为内存地址空间
每一个物理存储器在这个逻辑存储器中占有一个地址段(一段地址空间),CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
内存地址空间的大小受CPU地址总线宽度的限制,
8086CPU地址总线宽度是20,即拥有2**20 1M
的内存地址空间
80386CPU地址总线宽度是32,即拥有2**32 4G
的内存地址空间
由图可得,在8086PC机器中,
最初的640KB内存中读取数据,实际上就是在读取主随机存储器中的数据,
向随后的128KB内存中写入数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上;向最后的256KB内存中写入数据的操做是无效的,由于这等于要修改只读存储器的内容。
最终运行程序的是CPU,对于CPU来讲,系统的全部存储器的存储单元都处于一个统一的逻辑存储器中,其容量受到CPU寻址能力的限制,这个统一的逻辑存储器,称为内存地址空间。
一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件使用内部总线链接。
运算器:进行信息处理
寄存器:进行信息存储
控制器:控制各类器件进行工做;
对于程序员,CPU的主要部件是寄存器,寄存器是CPU中程序员能够用指令读写的部件,程序员经过改变各类寄存器中的内容实现对CPU的控制
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个字节,称为高位字节、低位字节
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
对于8086PC机,能够根据须要,将一组内存单元定义为一个段,段的长度小于等于64KB, 存在一组地址连续、起始地址为16的倍数的内存单元中
问:如何使得代码段中的指令被执行呢?
答:将一段内存看成代码段,仅仅是编程时候的一种方法,CPU只会认为CS:IP指向所定义的内容为指令,因此,若是让CPU执行放在代码段中的指令,须要将CS:IP指向所定义的代码段中的第一条指令的首地址。