《汇编语言》学习笔记4——指令系统和寻址方式

1.汇编指令:汇编指令、伪指令、宏指令(用分号表示注释)

    1.汇编指令:由操作码字段和操作数字段组成

      1.格式:操作码    操作数

      2.操作数段:单操作数指令、双操作数指令、三操作数指令。(由于执行时要指出操作数的地址,则又称为一地址指令、二地址指令、三地址指令。若只有操作码,则为零地址指令)

          对于双操作数指令,第一个为目的操作数(表示操作后的结果),第二个为源操作数(表示来源操作数),两者用逗号隔开。

          即:操作码  目的操作数,源操作数

    2.指令属性

      1.指令长度:分为:单字节、双字节、三字节、四字节、多字节。指令 长度会影响存储空间(成正比),多种类型的指令可完同一任务时,选用较短的指令可有效压缩程序占用的存储空间。

      2.指令的执行时间:以CPU时钟周期为单位。影响程序的执行速度采用执行时间较少的指令可提高运行速度。

2.指令系统:所有计算机能执行的代码指令集合

    8086指令分为:数据传送指令、算术运算指令、逻辑运算指令、串处理指令、控制与转移指令、处理机控制指令

3.指令的寻址方式

    1.寻址方式就是指令中提供操作数或操作数地址的方式,即寻找操作数地址的方法。

    2.操作数类型分为数据操作数、转移操作数。

        按照操作数类型的不同,寻址方式分为:与数据有关的寻址方式、与转移地址有关的寻址方式。

         除了转移指令、循环指令、子程序调用指令等与转移地址有关外,其他指令的寻址方式都与数据有关。

    3.数据有关的寻址方式:立即寻址、寄存器寻址、存储器寻址(直接寻址、寄存器间接寻址、寄存器相对寻址方式、基址变址寻址、相对基址变址寻址)。

      1.立即寻址:有立即数的寻址(所要找的操作数直接写在指令中,这种操作数叫立即数)就叫做立即寻址(速度最快)

          注意:1.立即寻址只能用于源操作数字段

             2.立即数的类型必须与目的操作数的类型一致

      2.寄存器寻址:操作数在寄存器中、在指令中指定寄存器名即可(寄存器可以是8位或16位)

          8位寄存器:AH、AL、BH、BL、CH、CL、DH、DL(即16位的高八位、低八位)

          16位寄存器:AX、BX、CX、DX、SI、DI、BP、SP

      3.存储器寻址:这一类寻址方式在指令中要表示出有效地址EA。

          对于双操作数指令,两个操作数不允许同时使用存储器寻址方式,即两个操作数都是存储单元。

        1.直接寻址:CPU在取指令阶段可直接取得操作数的EA,称为直接寻址方式

          1.形式:MOV AX,DS:[2000H]

          2.操作数的有效地址EA直接写在指令中,用[]里的数值作为操作数的偏移地址(有效地址)。操作数的段地址为数据段,由DS指出,即操作数本身存放在数据段中。

          3.CPU根据EA和段地址DS计算出物理地址,在访问存储器取出的操作数的值:操作数的物理地址 = (DS)*10H+EA

          4.对于直接寻址必须加前缀DS:,指出该单元在数据段。用debug的A命令输入指令则不加,系统默认为数据段。

          5.直接寻址适用于处理单变量。(在汇编中变量的名为地址,变量值为变量内容)

          6.存储器读写操作:

                1.MOV指令可以实现CPU对存储器的读写:

                  读:目的操作数是CPU的寄存器,源操作数是存储单元

                  写:目的操作室是存储单元,源操作数是CPU的寄存器

          7.符号地址:为存储单元定义一个名字,该名字就是地址,若吧该单元看成变量,则该名字为变量名

              1.若用伪指令DB、DW定义存储单元名,默认的段为数据段。若用EQU符号定义伪操作来定义符号地址,则要加DS:

          8.段超越:有内存有关的寻址方式中,操作数的段地址默认为数据段

              1.8086规定数据处理存放在数据段中还可以存放在其他三种段中,若操作数在其他段中存放称为段超越。需要在指令中用段超越前缀指出,即用操作数前加上段寄存器名和冒号表示。

          9.在debug下用A命令输入寻址方式指令时,不能用符号地址,要改为具体的偏移地址值,用段超越指令时,需要将段超越前缀单独在一行输入,不要写在MOV指令中。debug也不识别伪指令。

        2.寄存器间接寻址(EA间接从寄存器中得到,则成为寄存器间接寻址)

           1.形式:MOV AX,[BX]

           2.操作数的EA在基址寄存器BX、BP或变址寄存器SI、DI中,操作数的段地址在数据段DS或堆栈段SS中。

           3.有效地址由BX、SI、DI指出,则对应数据段。用BP指出则对应堆栈段

              1.操作数的物理地址  =  (DS)*10H+(BX)/(SI)/(DI)

              2.操作数的物理地址  =  (SS)*10H+(BP)

           4.EA(有效地址)只能是BX、BP或变址SI、DI。【如:MOV AX,[BX]】。操作数也课可用段超越前缀

        3.寄存器相对寻址

          1.操作数的EA是一个基址或变址寄存器的内容加8位或16位位移量之和

            操作数的物理地址 = (DS)*10H+(BX)/(SI)/(DI)+8位(16位)位移量

            形式:MOV  AX,VALUE+[SI]  或  MOV  AX,[VALUE+SI]

                其中VALUE为位移量

          2.此方法常用用于查表操作:用寄存器做首地址,用位移量做指针寻找表中特定的单元。或用位移量做表格的首地址,用寄存器做指针,来连续查表。

        4.基址变址寻址

          1.操作数的EA为一个基址寄存器和一个变址寄存器的内容之和。

              操作数的物理地址 = (DS)*10H+(BX)+(DI)/(SI)

              操作数的物理地址 = (SS)*10H+(BP)+(DI)/(SI)

          2.该方法用于二维表的处理

        5.相对基址变址寻址

          1.操作数的EA为一个基址寄存器加上一个变址寄存器在加一个位移量。

              操作数的物理地址 = (DS)*10H+(BX)+(SI)/DI+8位(16位)位移量

              操作数的物理地址 = (BP)*10H+(BX)+(SI)/DI+8位(16位)位移量

            形式:MOV AX,[BX+SI+VALUE]  或  MOV  AX,VALUE[BX][SI]  或  MOV  AX,[BX+SI].VALUE  VALUE  为位移量

            有效地址 EA =VALUE +(BX)+(SI)  物理地址 = (DS)*10H+EA

          2.方便在二维表中查找某个元素,可令VALUE作为表首地址,BX代表行,SI代表列

4.寻址方式的选择

  1.立即寻址用于寄存器、存储单元赋值,而且立即数在运算指令中作为源操作数使用

  2.寄存器寻址可用在源操作数、也可用在目的操作数。

  3.直接寻址可方便的访问某存储单元

  4.寄存器间接寻址和寄存器相对寻址相当于C中的指针。只要改变寄存器的值,同一条访问存储单元的指令就可以访问不同的单元。

  5.基址变址寻址和相对机制变址寻址用于数组和二维表的处理

 

posted @ 2016-04-09 15:15  Sayer  阅读(1386)  评论(0编辑  收藏  举报