汇编语言

汇编语言是直接作用在硬件上的编程语言,汇编语言是最接近底层的语言,可以让我们更好的理解计算机底层的实现。学习汇编语言对学习操作系统,c++\c有很好的帮助。所以对于学习编程的同学来说,学习汇编语言是必不可少的。

汇编语言的产生是因为使用机器语言很麻烦,而且难以辨别和记忆,所以汇编语言便诞生了。汇编语言的主体是汇编指令。

由于学习汇编语言的缘故,简单的学习了一些机组的知识,所以就想总结一下。多总结知识,也有助于对知识的汲取。

  • 存储器:计算机指令和数据存储的地方,相当于内存。CPU也相当于一块内存。存储器在物理上彼此是独立的。按读写属性存储器可分为3类:随机存储器,装有BIOS的ROM,接口卡上的RAM。
  • 指令和数据:在不同的情况下,指令于数据是有区别(只是所处的环境不同,其实质是一样的)。
  • 存储器被划分为多个存储单元,每个存储单元为一个字节,每个存储单元都有所谓的编号,也就是我们常说的地址。
  • CPU对数据进行读写,必须和外部器件进行3类信息的交互。

              存储单元的地址。

              器件的选择,读或写的命令。

              读或写的数据。

  • 那么怎么让CPU把上述三类信息存储到存储器中呢?CPU通过总线对信息进行传输。总线在逻辑上分为地址总线,控制总线,数据总线。

地址总线

  • CPU通过地址总线来指定存储器单元的,也就是地址总线传输存储单元的地址。
  • 一个CPU有N根地址线,则可以说这个CPU的地址线的宽度为N。这样的CPU最多可以寻找2的N次方的内存单元。
  • 地址总线的宽度决定了CPU的寻址能力。

数据总线

  • CPU与内存进行数据交互时,需要使用数据总线。数据总线的宽度决定了CPU与外界进行数据传输的速率。

控制总线

  • CPU通过控制总线对外部器件进行控制,控制总线的宽度决定CPU对外部器件的控制能力。

 

  • 主板:主板上有核心器件和一些主要器件,通过总线相连。
  • 接口卡:CPU要对计算机中所有可用的程序或者设备进行控制,有些可以直接进行控制,有些必须借助接口卡间接的进行控制。
  • 系统中的所有的存储器中的存储单元都处于一个统一的逻辑存储单元中,它的容量受CPU寻址能力的限制。
  • 一个典型的CPU是由寄存器,运算器,控制器组成的。

               运算器进行信息处理。

               寄存器进行信息的存储。

               控制器控制各种器件进行工作。

               内部总线连接各种器件,在他们之间进行数据传送。

  • 通用寄存器(存放一般的数据): AX,BX,CX,DX
  • 字节:记为Byte,一个字节由8个bit组成,可以存在8位寄存器中。
  • 字:一个字由2个字节组成,这两个字节分别称为该字的高位字节和低位字节。
  • 现在让我们了解一下常用的汇编指令: mov,add, sub.其实就是英文字母的略写。指令的操作含义也顾名思义。在进行数据运算或者数据传输时,要注意指令的两个操作对象的位数应当是一致的。
  • CPU通过地址总线获取到存储单元的物理地址,那么怎么获取存储单元的物理地址呢?简单来说,就是CPU中特定的寄存器为我们提供物理地址。物理地址是由段地址和偏移地址组成的。物理地址=段地址*16+偏移地址。具体来讲,就是段寄存器为我们提供段地址,偏移地址也由相应的寄存器提供,传输到地址加法器,地址加法器为我们合成出物理地址,然后传输到IO设备接口,最后通过地址总线传出,并指向特定的存储单元的物理地址。
  • 物理地址=段地址*16+偏移地址 这到底是什么意思呢?他的实质是什么呢?其实很简单的。段地址可以等效成我们访问内存的起始地址,也就是基础地址。而偏移地址可以理解为在基础地址的前提下,偏移的地址。这时有人就会产生疑问?段地址是什么来的呢?怎么获取呢?
  • 段寄存器为我们提供段地址。一般的段寄存器有CS,SS,DS,ES。现在就让我们详细的了解段寄存器吧。
  • CS为代码段寄存器,IP为指令指针寄存器。CPU对内存进行访问的过程如下:

              从CS:IP指向的内存单元获取指令,读取的指令进入指令缓存器。

              IP=IP+所读取指令的长度,从而指向下一条指令。

              重复。

  • CPU将CS:IP指向的内存单元看作指令,所以CS:IP指向指令区(指令段)。
  • CPU中可以修改CS,IP内容的指令称为转移指令。转移指令:jmp。
  • jmp 段地址:偏移地址        jmp 某一合法寄存器(用寄存器中的值修改IP).
  • CUP中使用16bit寄存器来存储一个字。高8位存放高位字节,低8位存放低8位字节。
  • 内存地址由段地址和偏移地址组成。段寄存器:DS。CPU不支持将数据直接送入段寄存器中。
  • 用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,段地址默认在段寄存器DS中。
  • [address]表示一个偏移地址为address的内存单元。
  • CPU中段寄存器SS和一般寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。
  • pop和push指令是可以在寄存器和内存(栈也是内存)之间传送数据的。

                push 寄存器   将一个寄存器中的数据入栈

                pop   寄存器   用一个寄存器接受出栈的数据

  • 对于数据段,将它的段地址放在DS中,用mov,add,sub等访问内存单元的指令时,CPU就将我们定义的数据段的内容当作数据来访问。
  • 对于代码段,将它的段地址放在CS中,将段中的第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令。
  • 对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候。
  • 汇编程序执行的完整过程:源程序——编译源程序——目标文件——连接目标文件——可执行文件(机器码和数据)——加载——内存中的程序——运行。
  • 一个汇编程序是由多个段组成的,这些段被用来存放代码,数据或当作栈空间来使用,所以就存在代码区,数据区,栈区。
  • 汇编语言写的源程序,包括伪指令和汇编指令。
  • 汇编源程序中,标号指代了一个地址。
  • 一个程序结束后,将CPU的控制权交还给使它运行的程序,此过程为:程序返回。
  • 完整描述内存单元时,需要两种信息。1,内存单元的地址(段地址和偏移地址) 2,内存单元的长度。内存单元的默认段地址在DS中。
  • 描述性的符号:“()”表示一个寄存器或一个内存单元的内容。 约定符号idata表示常量。
  • 汇编源程序中,数据不能以字母开头。
  • 在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用“[ ]”来表示内存单元,如果在“[ ]”里用一个常量idata直接给出内存单元的偏移地址,就要在“[ ]”的前面显示地给出段地址所在的段寄存器。
  • 用于显示地只指明内存单元的段地址的“ds” “cs” “ss” “es”,在汇编语言中称为段地址。
  • 如果我们需要向内存存入空间写入数据的话,要使用操作系统给我们分配的空间,而不应直接用地址任意指定内存单元,向里面写入。
  • 程序取得所需空间的方法有两种,一是在加载程序的时候为程序分配,二是程序在执行的过程中向系统申请。
  • 可执行文件的程序执行过程如下:

               由其他程序将可执行文件加载如内存。

               设置CS:IP指向程序的第一条要执行的指令,从而使程序得以运行。

  • CPU不允许将一个数值直接送入段寄存器。
  • CPU根据程序中具体的汇编指令和汇编指令对CS:IP,SS:SP,DS等寄存器的设置来决定内存的属性(代码区,栈区,数据区)。
  • and指令:逻辑与指令,按位进行与运算。将操作对象的相应位设为0,其他位不变。
  • or指令:逻辑或指令,按位进行运算。可将操作对象的相应位设为1,其他位不变。
  • 计算机中,要对存储的信息进行编码,而要对显示的信息进行解码。
  • 汇编程序中,用‘......’的方式指明数据是以字符的形式给出的,编译器将把它们转化为相对应的ACSII码。
  • [bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上iata)。
  • 一般来说,在需要暂存数据时候,我们都应该使用栈。
  • 定义的描述性符号:reg和sreg;
  • 绝大部分的机器指令都是进行数据处理的指令,处理指令大致可分为:读取,写入,运算。在机器指令这一层来将,并不关系心数据的值是多少,而关心指令执行前一刻,它将要处理的数据所在的位置,指令在执行前,所要处理的数据:CPU内部,内存,端口。   
  • 汇编语言中用三个概念来表示数据的位置:立即数,寄存器,段地址和偏移地址。
  • 寻址方式包括:寄存器间接寻址,寄存器相对寻址,基址变址寻址,相对基址变址寻址。
  • CPU中可以提供寄存器名指明要处理的数据的尺寸。
  • CPU中可以用X ptr指明内存单元的长度。 X word ,byte。
  • CPU中有些指令默认了访问时字单元还是字节单元。比如 push pop 是字单元。

              div 除法指令 。

              db和dw定义字节型数据的字型数据。

              dup是一个操作符。

  • 可以修改IP,或同时修改CS和IP的指令统称为转移指令。转移指令便可以控制CPU执行内存中某处代码的指令。
  • 只修改IP时,称为段内转移,比如:jmp ax.
  • 同时修改CS和IP,段间转移,比如:jmp 1000:0.
  • 操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。
  • jmp short(转到标号处执行指令) 段内短转移 。    
  • jmp near ptr 标号,实现的是段内近转移。
  • jmp far ptr 标号 实现的是段间转移,又称远转移。
  • jmp word ptr 内存单元地址(段内转移)。 功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
  • jmp dword ptr 内存单元地址(段间转移) 功能:从内存单元地址处开始存放两个字,高地址的字是转移的目的段地址,低地址处是转移的目的偏移地址。
  • jcxz指令为有条件转移指令,所有的有条件转移指令都是段转移。
  • loop循环指令。
  • call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。ret指令用栈中的数据,修改IP的内容,实现近转移。retf指令用栈中的中的数据,修改CS和IP的内容,实现远转移。call指令的实现方法和jmp指令的原理相同。
  • mul是乘法指令。
  • CPU内部的寄存器中,有一种特殊的寄存器:flag寄存器,具有以下三中作用。

              用来存储相关指令的某些执行结果。

              用来为CPU执行相关指令提供行为依据。

              用来控制CPU的相关工作方式。

  • flag的第六位是ZF,零标志位。
  • flag的第二位是PF,奇偶标志位。
  • flag的第七位是SF,符号标志位。
  • flag的第零位是CF,进位标志位。
  • flag的第十一位是OF,溢出标志位。
  • flag的第十位是DF,方向标志位。
  • sbb是带借位减法指令。
  • cmp是比较指令,功能相当于减法指令。
  • pushf的功能是将标志寄存器的值压栈,popf是从栈中弹出数据,送入标志寄存器中。
  • 任何CPU都具有一种能力,可以执行完当前正在执行的指令之后,检测到从CPU外部发送过来的或内部产生的一种特殊的信息,并且可以立即对所接受到的信息进行处理。这种特殊的信息,我们可以称其为:中断信息。中断信息要求CPU马上进行某种处理,并向所要进行的该中处理提供必备的参数的通知信息。中断信息可以来在内部和外部。
  • 中断处理程序:CPU收到中断信息后,需要编写程序对中断信息的处理。
  • CPU使用中断类型码,通过查找中断向量表就可以定位中断处理程序。
  • 中断过程:使用中断类型码找到中断处理程序的入口地址,CS:IP指向入口地址,使CPU执行中断处理程序。
  • 执行中断处理程序之前,CPU通过栈保存原先的数据。
  • CPU在执行完一条指令后,如果监测到标志寄存器的TF为1,则产生单步中断,引发中断过程。
  • CPU在执行程序的时候是从CS:IP指向的某个地址开始,自动向下读取指令执行。
  • CPU在执行完当前指令后,如果检测到中断信息,就响应中断,引发中断过程。
  • int 指令的格式为:int n,n为中断类型码,它的功能是引发中断过程。
  • CPU可以直接读写3个地方的数据。 CPU内部的寄存器   内存单元   端口。
  • CPU在访问端口的时候,CPU通过端口地址来定位端口。因为端口所在的芯片和CPU通过总线相连,所以,端口地址和内存地址一样,通过地址总线来传送。对端口的读写不能用mov,push,pop等内存读写指令。端口的读写指令只有两条:in 和out,分别用于从端口读取数据和往端口写入数据。
  • shl和shr是逻辑移位指令。shl是逻辑左移指令。shr是逻辑右移指令。
  • PCx系统的接口卡和主板卡,装有各种接口芯片。这种外设接口芯片片的内部有若干寄存器,CPU将这些寄存器当作端口来访问。

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值