指令格式与寻址方式

时间:2022-10-15 22:42:23

1、汇编语言指令的一般格式为:
指令助记符 操作数列表 ;注释

2、操作数类型和有效地址
(1)操作数包含在指令中,指令的操作数就是操作数本身(立即数),这种操作数成为立即寻址。而且立即数只能作为源操作数。
(2)操作数包含在CPU的某个内部寄存器中。这时指令的操作数是CPU内部寄存器的一个编码,这种操作数寻址方式称为寄存器寻址。
(3)操作数在内存的数据区中。这是指令的操作数部分包含着此操作数所在的内存地址,这种操作数寻址方式称为存储器寻址。
(4)操作数在外部设备端口中。这种情况只适用于输入输出指令,根据外部设备的端口号完成数据的输入输出,称为端口寻址。

对于立即数寻址和寄存器寻址,由于操作数已经在CPU内部了,无须再访问内存,所以指令执行周期相对较短。对于存储器寻址,操作数所在的内存地址的给出形式多种多样。对于端口寻址,由于要访问外部IO设备,一般来说指令执行周期相对较长。

3、任何内存单元的地址都是由两部分组成:段基地址和段内偏移地址
段内偏移量称为有效地址EA
有效地址的4个分量具体包括
(1)基址寄存器内容
(2)变址寄存器内容
(3)比例因子
(4)位移量
EA=【基址寄存器】+(【变址寄存器】×比例因子)+位移量

4、立即寻址
MOV AX,1020H
把立即数1020H传送到寄存器AX

5、寄存器寻址
MOV DS,AX

4、存储器寻址
对各种存储器寻址方式而言,操作数都是在存储区中,指令的操作数部分指出此操作数的有效地址EA
(1)直接寻址
指令中的操作数部分直接给出操作数的有效地址EA,操作数一般在数据段DS中,这是一种默认方式,否则要加前缀。
MOV AX,[2000H];将DS段中2000H和2001H单元内容分别送AL和AH
MOV AX,ES:[2000H]
直接寻址中的存储器操作数的有效地址EA也可以用变量名的形式给出
VALUE DB 10H
MOV AL,VALUE
(2)寄存器间接寻址
操作数在寄存器中,操作数的有效地址EA在指定的寄存器中。
若以SI、DI、BX间接寻址,则默认操作数在DS段中。
MOV AX,[SI];默认DS为段基地址
若以寄存器BP间接寻址,则默认操作数在堆栈段中。
MOV AX,[BP];默认SS为段基地址
如果不在上述规定段中,则要加段超越前缀
(3)寄存器相对寻址
EA=[基址寄存器或变址寄存器]+位移量
BP和BX作为基址或变址寄存器,默认情况下,BX以DS作为段寄存器,BP以SS作为段寄存器;SI(源变址)和DI(目的变址)作为变址寄存器,默认DS作为段基址寄存器。
MOV AX,[SI+24];也可以写成MOV AX,24[SI]
DS寄存器寻址的段的“SI中的内容+24”单元的数据传送给AX
(4)基址加变址寻址
EA=【基址寄存器】+【变址寄存器】
当两者默认的段不同时,以基址寄存器为准
MOV AX,[BX+SI];或写成MOV AX,[BX][SI]
基址寄存器:BX或BP
变址寄存器:SI或DI
(5)带位移的基址加变址寻址
EA=【基址寄存器】+【变址寄存器】+位移量
MOV AX,[BX+SI+SOME];或MOV AX,MASK[BX][SI]`