指令系统
8086/8088的指令系统大致可分为以下六种类型:
1,数据传送指令
2,算术运算指令
3,位操作指令
4,串操作指令
5,程序控制指令
6,处理器控制指令
学习指令要掌握三个方面的内容:
1,指令的功能
2,指令的寻址方式
3,指令操作对标志寄存器中状态标志位的影响
汇编语言指令语句格式
由4部分组成:
标号:指令助记符 目的操作数,源操作数 ;注释
1,标号表示该指令在主存中的逻辑地址
2,每个指令助记符就代表一种指令
3,目的和源操作数表示参与操作的对象
4,注释是对该指令或程序段功能的说明
用到的符号意义如下:
- DST:目的操作数
- SRC:源操作数
- OPR:操作数
- MEM:存储器操作数
- REG:寄存器操作数
(16位的AX,BX,CX,DX,BP,SP,SI,DI或
8位的AH,AL,BH,BL,CH,CL,DH,DL) - SEG:段寄存器(16位的CS,DS,ES,SS)
- Data:立即数
- port:8位的端口地址
- DST_ADDR:转移的目标地址
- COUNT:计数器
一,数据传送指令
数据传送类指令将数据、地址或立即数传送到寄存器或存储器单元中。它又可分为通用数据传送指令、累加器专用传送指令、地址传送指令和标志传送指令等四组。
1,通用数据传送指令通用数据类指令都不影响标志位!!!
1)最基本的传送指令MOV
指令格式:
MOV dst,src ;(dst)←(src)
dst 是目的操作数
Src 是源操作数
指令功能:
将源操作数src送给目的操作数dst,本质上是数据的“复制”,源操作数本身不变。
需说明一点,对于代码段寄存器CS和指令指针寄存器IP,通常无需用户利用传送指令改变其中的内容。但是CS可以作为源操作数。
寻址方式:
src可以是data/MEM/REG/SEG
dst可以是MEM/REG/SEG(不能为CS,IP)
说明:
*CS不能做目的操作数;IP不能作为目的寄存器,立即数不能作为目的操作数
*不能MEM<=>MEM,不能SEG<=>SEG,不能SEG<=data
**源操作数和目的操作数类型要一致。
对标志位的影响:
不影响
例:
MOV AL,80H
MOV word ptr [BX],1020H
MOV AX,BX
MOV DH,AL
MOV [BX+10H],DX
MOV DX,[BX+SI]
MOV SS,AX
MOV SS,[1000H]
MOV AX,DS
MOV [3020H],DS
2)堆栈操作指令
堆栈操作指令是用来完成压入和弹出堆栈操作的。
⑴ 压入堆栈指令PUSH(PUSH word onto stack)
指令格式:
PUSH src ;
指令功能:
先将栈顶指针SP减2// (SP) ←(SP)-2
再将源操作数src压入栈中// ((SP)+1:(SP)) ←(src)
⑵ 弹出堆栈指令POP(POP word off stack)
指令格式:
POP dst ;
指令功能:
先将栈顶存储单元内容弹出到操作数dst中// (dst) ←((SP)+1:(SP)),
再将堆栈指针SP加2// (SP) ←(SP)+2
寻址方式:
源操作数src可以是REG/MEM/SEG ,且必须是16位的操作数,但不能是立即数。
目的操作数dst,可以是REG/MEM/SEG(不能是CS) ,且必须是16位的操作数,但不能是立即数。
说明:
*堆栈按后进先出原则组织。
*堆栈操作以字为单位进行。
*目的操作数dst不可以是CS。
*指令中的操作数不能是立即数。
*堆栈指针为SS:SP,SP自动进行+2、-2操作、永远指向栈顶
对标志位的影响:
不影响
例:
PUSH [BX+DI]
PUSH AX
PUSH CS
POP [BX+SI+1020H]
POP BX
POP DS
例:已知(AX)=1020H,(BX)=3040H,分析下面程序段的执行过程。
1
PUSH AX
PUSH BX
POP AX
POP BX
2
PUSH AX
PUSH BX
POP BX
POP AX
3)交换指令XCHG (Exchange)
指令格式:XCHG dst , src
指令功能:
将源操作数和目的操作数进行交换 // dst <=> src
寻址方式:
src和dst均可为REG/MEM,
说明:
* 段寄存器的内容不能参加交换
*不能同时为存储器操作数
*至少有一个是寄存器操作数
*都不能是立即数
对状态位的影响:
不影响
例:
XCHG BX,[BP+SI]
XCHG DL,BL
XCHG BX,CX
XCHG [2000H],AH
XCHG [2000H],BX
错误示例:
XCHG AL,BX //操作数的类型要匹配
XCHG [BX], [1000H] //不能同时为存储器操作数
XCHG AX, SS //不能为段寄存器
XCHG AL, 10H //不能为立即数
2,累加器专用指令
这类指令中的一个操作数必须是累加器。累加器操作数可以是8位的,也可以是16位的
1)输入/输出指令
输入输出指令可以分为两大类:一类是直接端口地址的输入/输出指令:一类是通过DX寄存器间接端口地址的输入/输出指令。
a, 输入指令
①直接寻址的输入指令
指令格式:
IN acc, port ; //port<=0FFH
指令功能:
从端口port中直接读取一个字节或一个字送到acc(AL或AX)中。//(acc) ←(port)
②间接寻址的输入指令
指令格式:
IN acc, DX ;
指令功能:
将DX中内容指定的端口地址中的一个字节或字送入acc(AL或AX)中 /
/(acc) ←( (DX) )
注:执行此指令前应将端口的16位地址放入DX中
b, 输出指令
①直接寻址的输出指令
指令格式:
OUT port, acc ; //port<=FFH
指令功能:
将acc(AL或AX)中的一个字节或字送到port指定的端口中,port<=FFH
//(port) ← (acc)
②间接寻址的输出指令
指令格式:
OUT DX, acc ;
指令功能:
将acc(AL或AX)中的一个字节或一个字送入DX中的内容指定的端口中
//((DX)) ← (acc)
2)字节转换指令XLAT(transLATe)
指令格式及操作:
XLAT src_table ;(AL) ←((BX)+(AL))
XLAT指令是用来将一种字节代码转换成另一种字节代码。常用该指令进行查表操作。
使用前先建立一个字节表格,表格的首址存入BX,要转换的代码(即相对于表格首址的位移量)放入AL,然后执行XLAT,在AL中得到转换以后的代码。
XLAT指令还可以有以下几种表示形式:
XLAT ;不写操作数
XLATB ;有B就不允许再写操作数。
XLAT ES:src_table ;重设段寄存器为ES
[例]在内存的数据段有一张16进制数的ASCII码表,其首地址为Hex_table,如下图所示,欲将十六进制