《汇编语言》学习笔记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.基址变址寻址和相对机制变址寻址用于数组和二维表的处理