计算机是通过执行指令序列来解决问题的
因而每种计算机都有一组指令集提供用户使用,这组指令就称为计算机的指令系统。
计算机中的指令由操作码字段和操作数字段两部分组成。
指令的操作码字段在机器里的表示比较简单,只需对每一种操作指定确定的二进制代码就可以了。指令的操作数字段的情况就比较复杂,如果操作数存放在寄存器中,则由于寄存器的数量较少,因而需要指定的操作数地址的位数就较少。
但如果操作数存放在存储器里,那么一个存储单元的地址就需要20位,怎样设法使它在指令的操作数字段的表示中减少位数呢?
为了便于人们使用而采用汇编语言来编写程序。
汇编语言是一种符号语言,它用助记符表示操作码,用符号或地址来表示操作或操作数地址。它与机器指令一一对应的。
寻址方式:表示指令中用于说明操作数所在的地址的方法
8086/8088有七种基本的寻址方式:
1,立即数寻址方式
操作数就包含在指令中,它作为指令的一部分,跟在操作码后存放在代码段。这种操作数称为立即数。立即数可以是8位的可以是16位的。
如果立即数是16位的按‘高高低低’的原则。
例如:MOV AL,5 则指令执行后,(AL) =05H
MOV BC,3064H 则指令执行后,(BX) = 3064H
2,寄存器寻址方式
操作数在CPU内部的寄存器中,指令指定寄存器号。
对于16位操作数,寄存器可以是:
AX、BX、CX、DX、SI、DI、SP、BP等;
对于8位操作,寄存器可以是:
AL、AH、BL、BH、CL、CH、DL、DH。
这种寻址方式由于操作灵敏就在寄存器中,不需要访问储存器来取得操作数,因而可以取得较高的运算速度。
例如:MOV AX,BX
如指令执行前(AX) = 3064h,(BX) = 1234H;则指令执行后,
(AX) = 1234H, (BX)保持不变
例如:MOV SL,AX
MOV AL,DH
3,直接寻址方式
操作数在寄存器中,指令直接包含有操作数的有效地址(偏移地址)。所以操作数地地址由DS加上指令中直接给出的16位偏移地址。如果采用段超越前段,则操作也可含在数据段外的其它段中。
例如:MOV AX,[8054] 如 (DS) = 2000H (28054) = 3050
则物理地址= 20000 + 8054 = 28054
在汇编语言指令中,可以用符号地址代替值地址,
如:MOV AX, VALUE
此时VALUE为存放操作单元的符号地址。
如写成:MOV AX,[VALUE]
也是可以的,两者是等效的。如VALUE在附加段中,则应指定超越前缀如下:
MOV AX, ES:VALUE
或MOV AX,ES:[VALUE]
直接地址方式常用处理单个存储变量的情况。直接寻址的操作通常是程序使用的变量。
4,寄存器间接寻址方式
操作数在存储器中,操作数有效地址在SI、DI、BX、BP
这四个寄存器之一中。在一般情况下,
如果有效地址在SI、DX和BX中,则DS段寄存器之内容为段值。
如果有效地址在BP中,则以SS段寄存器之内容为段值。
例如:MOV AX,[SI]
如果(DS) =5000H (SI) = 1234H
则物理地址= 50000 + 1234 = 51234H
5,寄存器相对寻址方式
操作数在存储器中,操作数的有效地址是一个基址寄存器(BX,BP)或变址寄存器的(SI,DI)内容加上指令中给定的8位或16位位移量之和。
即
EA(有效地址) = BX|BP|SI|DI +8|16位位移量
在一般情况下,如果SI、DI或BX之内容作为有效地址的一部分,那么引用的段寄存器是DS;
如果BP之内容作为有效地址的一部分,那么引用的段寄存器是SS。
物理地址= 16D * (DS)+ (BX|SI|DI)+ 8|16位位移量
物理地址= 16D * (DS)+ (BP)+ 8|16位位移量
在指令中给定的8位或16位移量采用补码形式表示。在计算机有效地址时,如位移量是8位,则被符号扩展16位。