注:本章节为原书第四章。
计算机指令的格式一般为:
其可以根据操作数的个数分为零地址指令、一地址指令、二地址指令、三地址指令。近代计算机通常使用二地址指令,即两个操作数的指令(当然仍保留有其他操作数的指令,例如 nop
指令就是零地址指令)。对于二地址指令,其可能会隐含部分操作数。
操作数可以根据存放的位置分为如下四种:
寻址方式可以根据操作数的获取方式分为如下四种:
立即寻址的操作数直接存放于代码段中,和指令一同读写,并按照LSB规则存放。例如 MOV AX, 1234H
,则其在内存中的存放结构为:
该操作数读取不需要占用额外的总线周期。
寄存器寻址中,操作数存放于寄存器中,例如 MOV AX, BX
。该操作也不需要额外的总线周期。
存储器寻址中,操作数存放于内存等存储器中。在8086中是指存放到了内存的数据段、附加段或堆栈段中(反正不在代码段)。
先回忆一下基址寄存器和变址寄存器:
基址寄存器有 BX
、 BP
两个,变址寄存器有 SI
、 DI
两个。
第二章 微处理器与总线 > ^91p0lh
在8086 CPU中,存储器寻址可以分为五个小类:
DS
,例如:
MOV AX, [1000H]
MOV AX, ES:[2000H]
BX
、 BP
、 SI
、 DI
之中的一个(不可以为其他寄存器),例如:
MOV AX, [BX/SI/DI]; 将BX中的值作为偏移量,并DS为基址获取操作数
MOV AX, [BP]; 将BP中的值作为偏移量,并从堆栈段为基址获取操作数
BX
、 SI
、 DI
以 DS
为基址; BP
以堆栈为基址。只能以这四个寄存器的值为偏移量,可能会出改错题。MOV AX, [BP]; 将BP中的值作为偏移量,并从堆栈段为基址获取操作数
MOV AX, DS:[BP]; 将BP中的值作为偏移量,并以DS为基址获取操作数
COUNT
,则有:
MOV AX, COUNT[SI]; 以DS为基址,将SI中的值加上COUNT作为偏移量进行寻址
MOV AX, [SI + COUNT]; 与上方代码等价
COUNT
可以是8位也可以是16位的偏移量。MOV AX, [BX][DI]; 以DS为基址,将BX中的值加上DI中的值作为偏移量进行寻址
MOV AX, [BP + DI]; 以堆栈为基址,将BX中的值加上DI中的值作为偏移量进行寻址
BX
时,默认以数据段为基址;使用 BP
时,默认以堆栈为基址。COUNT
。例如:
MOV AX, COUNT[BX][DI]; 以DS为基址,将BX中的值加上DI中的值再加偏移量作为偏移量进行寻址
MOV AX, [BP + DI + COUNT]; 以堆栈为基址,将BX中的值加上DI中的值再加偏移量作为偏移量进行寻址
I/O端口的编址方式有两种:
而I/O端口的寻址方式也有两小类:
IN
、 OUT
指令进行寻址时,直接使用(8位)立即数提供地址的方式就叫做直接端口寻址。该方法可以寻找256个地址。例如:
IN AX, 63H
OUT 64H, AX
IN
、 OUT
指令进行寻址时,使用 DX
寄存器(16位)间接给出地址的方式就叫做间接端口寻址。该方法可以寻找64K个地址。例如:IN AX, DX
OUT DX, AX
IN AX, [DX]
。随堂练习:
[BX][SI]
[BP + DI + 25]
[BX + BP]
[BX + DI]
8086/8088的指令系统按照其功能可以分为六类:
指令学习时应注意:
在哈尔滨工程大学的考试中,着重考察以下四种:
MOV
PUSH
POP
XCHG
XLAT
LEA
IN
OUT
8086/8088 CPU的数据传送指令有:
MOV
,其指令格式为:MOV DST, SRC
,将 SRC
所指数据传送到 DST
。SRC
和 DST
可以是地址、变量、立即数等。五个不允许的原则(通常出改错题):
MOV AH, BX
或 MOV [1200H], 10H
(该指令见注1)。MOV [BX], [SI]
或 MOV [BX], [2000H]
MOV DS, ES
MOV DS, 1000H
,可以改为两句:MOV AX, 1000H
MOV DS, AX
IP
和 CS
不作为目的操作数,例如 MOV CS, AX
或 MOV IP, AX
注:
MOV [1200H], 10H
改为:
MOV BYTE PTR [1200H], 10H
,此时 [1200H]=10H
。MOV WORD PTR [1200H], 10H
,此时 [1200H]=10H
, [1201H]=00H
。SP
,在任何时候均指向栈顶。入栈指令 PUSH
:
PUSH SRC
,将 SRC
所指字(word)存入栈中。SP
出栈指令 POP
:
POP DST
,将栈顶字存入 DST
中。SP
基本原则:
POP
操作的源操作数不能是立即数。XCHG OPR1, OPR2
,其会交换 OPR1
和 OPR2
所指数据。换码指令又称字节翻译指令,是通过查表来完成代码转换的任务,可以用于做数码管的查表等。
XLAT
或 XLAT TABLE
。BX
寄存器或 TABLE
所指顶的表格中查找 AL
寄存器中的 index
对应的值。例如:
1300H
,并连续存放若干数据AL = 0EH
,指定参数 TABLE
或设置 BX = 1300H
XLAT
或 XLAT TABLE
后,该指令会取地址为 [1300H + 0EH]
的字节并放入 AL
寄存器中,随后 AL = 06H
:该指令可以理解为对程序中定义的"变量"(即符号地址)取地址并存放到目标寄存器中。
LEA REG, EA
,指令名中的 EA
表示有效地址。EA
一定是一个存储器操作数。TABLE
指向的地址为 2800H
,则指令 LEA AX, TABLE
运行完毕后,AX = 2800H
哈工程未讲。
输入指令:
IN AL/AX, PORT