8086汇编语言-指令参考手册

微处理器硬件基础

微处理器外部结构

8086汇编语言-指令参考手册_第1张图片

微处理器内部结构

8086汇编语言-指令参考手册_第2张图片

微处理器功能结构

8086汇编语言-指令参考手册_第3张图片

指令默认地址

8086汇编语言-指令参考手册_第4张图片

微处理器状态字PSW

8086汇编语言-指令参考手册_第5张图片

附:ASCII码表

8086汇编语言-指令参考手册_第6张图片

数据传送类指令

通用传送指令

MOV  DST,SRC

将某寻址方式指定的源操作数传送到某寻址方式指定的目的操作数中去。

注意:

  • 立即数不能送给段SEG;
  • 两个存储单元之间不能直接操作;
  • 两个段REG之间不能互传数据;
  • 双操作数指令类型必须匹配(立即数【由属性操作符得到的属性算立即数】、不含变量名的寻址是无类型的);
  • 如果使用的段REG不是默认的DS,则需要加前缀;
MOV  BL,BYTE PTR VAR1+5 ;如果var1不是字节类型则需要强制转型
MOV  SI,OFFSET VAR2 ;属性操作符得到EA
MOV  AX,ES:[SI] ;段前缀

取有效地址指令

LEA  REG16,MEM
//将存储器某变量MEM的EA送入16位寄存器REG16中
LDS  REG16,MEM
//将存储器某双字变量MEM的低16位送入位寄存器REG16中,高8位送入DS;
LES  REG16,MEM
//将存储器某双字变量MEM的低16位送入位寄存器REG16中,高8位送入ES;
  • 取段内偏移地址EA除了使用属性操作符之外还可以使用LEA;
  • LDS和LES将改变数据段和扩展段在存储器中的位置。

标志传送指令

LAHF
;将PSW的低八位送入AH中
SAHF
;将AH内容送入PSW的低八位中
  • 该指令源操作数和目的操作数均为隐含寻址

数据交换指令

XCHG  DST,SRC
;交换源和目的操作数的内容,可以是REG或者寻址方式指明的某存储单元
  • 源和目的不能同时为某存储单元;
  • 寄存器不能使段REG;

字节转换指令

MOV  AL,3
MOV  BX,TABLE
XLAT
;将EA为(BX)+(AL)的存储器单元的内容送入AL

该指令经常用于查表。表中每一项对应的内容按顺序存在内存某单元,BX放表头EA,AL里放待查找的序号,XLAT即可查找出对应内容放入AL中。

堆栈操作指令

PUSH  SRC
;将SRC压栈
PUSHF
;将PSW压栈
POP  DET 
;出栈,送入DST
POPF
  • 堆栈必须按字操作;
  • SRC或者DST都可以REG或者存储器某单元;
  • 开辟堆栈是,必须先将段地址放入SS,再将SP指向栈底。

算术运算类指令

运算类指令会对PSW中的6个状态标志位产生影响

加、减类指令

ADD  DST,SRC
ADC  DST,SRC
;ADD指令是直接加,ADC是带CF的加法,利用好ADC可以实现大于16位的加法
SUB  DST,SRC
SBB  DST,SRC
;基本同加法,SBB是带借位的减法
NEG  DST
;取负数,即被减数为0,结果放在DST中
INC  DST
DEC  DST 
;增量减量指令,将DST的内容增1或减1。DST可取通用REG或者存储单元;指令影响PSW中除CF外的五个标志位

比较指令

CMP  DST,SRC
;完成DST的内容减去SRC的内容,只设置PSW标志位而减法结果舍弃

一般使用CMP是为了比较两个数的大小、高低,并根据PSW结果跳转(条件跳转)

  • 若运算完ZF=0,则两数相等;
  • SF和最高位等同于最高位;
  • 无符号数运算时若运算完CF=0且ZF=0,则DST>SRC;若CF=0且ZF=1,则DST
  • 有符号数还得看OF;

乘法指令

MUL  SRC
;无符号数相乘
IMUL  SRC
;有符号数相乘

SRC可取通用REG或者存储单元,可以是字节或者字(这决定了该乘法的类型):

  • 若SRC为字节时,取AL内容与SRC内容相乘,结果放入AX中(8位*8位,结果是16位;
  • 若SRC为字,取AX内容与SRC内容相乘,结果的低十六位放入AX,高十六位放入DX(16位*16位,结果是32位)

MUL和IMUL只对PSW的CF位和OF位产生影响:

  • 当采用MUL运算时,若两个字节相乘任为一个字节(即高八位为0)或者两个字相乘任为一个字,则CF=0,OF=0;否则CF=1,OF=1;
  • 当采用IMUL运算时,若字节运算时AH为符号扩展,字运算时DX为符号扩展,则CF=0,OF=0;否则CF=1,OF=1;

除法指令

DIV  SRC
;无符号数的除法
IDIV  SRC
;有符号数的除法

SRC可取通用REG或者存储单元,可以是字节或者字(这决定了除法的类型):

  • 当SRC为字节时,取AX内容除以SRC内容,结果的商保存在AL中,余数保存在AH中(16位÷8位,商为8位余数为8位);
  • 当SRC为字时,取DX和AX联合构成的32位数除以SRC的内容,结果的商保存在AX中,余数保存在DX中(32位÷16位,商为16位余数为16位);

有符号数的除法的商和余数也有符号:

  • 被除数为正,除数为正,则商为正,余数为正;
  • 被除数为正,除数为负,则商为负,余数为正;
  • 被除数为负,除数为正,则商为负,余数为负;
  • 被除数为负,除数为负,则商为正,余数为负;

除法指令不影响PSW中的标志位。

符号扩展指令

CBW
;将AL中的有符号数扩展到AX
CWD
;将AX中的有符号数扩展到DX、AX组合数

BCD数运算调整指令

AAA
;加法分离BCD码调整
DAA
;加法组合BCD码调整
AAS
;减法分离BCD码调整
DAS
;减法组合BCD码调整
AAM
;乘法分离BCD码调整
AAD
;除法分离BCD码调整

逻辑运算类指令

AND  DST,SRC
;逻辑与
TEST  DST,SRC
;逻辑测试,完成逻辑与操作设置标志位但结果舍弃
OR  DST,SRC
;逻辑或
XOR  DST,SCR
;逻辑异或
NOT  DST
;逻辑非
  • 逻辑操作均为按位操作,无视符号位;
  • 逻辑操作可以按字节或者字;
  • NOT不影响PSW标志位;其余指令执行完之后CF、AF、OF清零,SF、ZF、PF根据执行结果设置。

移位类指令

8086汇编语言-指令参考手册_第7张图片

  • 在移位类指令中,DST可以取通用REG或者某存储单元,CNT为移位位数,只能取1或者CL(CL里保存移位次数)
  • 右移一位相当于把DST除二(最低位移到小数点后面),左移一位相当于把DST乘二(最高位不考虑溢出的保留)

标志位操作指令

8086汇编语言-指令参考手册_第8张图片

转移指令

无条件转移指令

JMP  LABEL
;转移到标号LABEL处执行程序
JMP  REG16
;转移到由通用寄存器REG指定的位置执行程序
JMP  MEM
;转移到由存储单元MEM指定的位置执行程序

在三种无条件转移指令中,根据LABEL位置、REG16和MEM内容的不同,有以下情况:

  • 当LABEL与还转移指令位于同一个段时,则为段内直接转移(近程转移),否则为远程转移
  • JMP REG16 指令中REG保存的是目的位置的EA,故为段内直接转移(近程转移)
  • JMP MEM 指令中,若MEM为字型,则表示目的位置的EA,为段内直接转移;若MEM为双字型,则高字作为CS,低字作为EA,进行远程转移

段内直接转移(近程转移)的实现方式:(CS)不变,(IP)=(IP)+ DISP,[IP 称为“当前IP”,指如果不转移,该转移指令的下一条指令的IP]

  • 若DISP可以用8位有符号数表示,该转移称为短转移,汇编之后的机器码为一个字节操作码一个字节的DISP(即双字节机器码)
  • 若DISP不能用8位,而需要用16位有符号数表示,则为长转移,汇编之后产生三字节机器码
  • 汇编后生成机器码的长度由汇编程序决定,但是如果肯定了是短转移,可以写成:JMP SHORT LABEL,以生成双字节机器码以节省空间

有条件转移指令

8086汇编语言-指令参考手册_第9张图片

  • 有条件转移一定是段内短转移(即CS不能变且DISP在-128~127之间),若要实现更远的转移,需要和JMP指令结合
  • 对有符号数和无符号数进行CMP之后,应对应采用不同的转移指令
  • 完成同一种功能可能有多种不同形式

循环控制指令

LOOP指令

MOV  CX,0010H ;在CX里存上循环次数
;这里写循环准备
标号:
;这里写循环体
LOOP  标号
  • CX的内容为设定的循环次数,每循环一次(CX)减一,直到(CX)=0时退出循环
  • 循环控制指令只能是段内短转移,故标号和LOOP指令之间的循环体不能超过128B

LOOPZ/LOOPE指令

MOV  CX,10
;循环准备
L1:
;循环体
CMP  AX,BX
LOOPZ  L1;一旦AX!=BX,退出循环

LOOPZ指令只有当(CX)!= 0 且 ZF=1 时进行循环。

适用于在指定区域找不同,一旦找到一个不同就退出循环

LOOPNZ/LOOPNE指令

和LOOPZ指令相反,该指令只有在(CX)!= 0 且 ZF=0 时进行循环。

适用于在指定区域查找指定量,一旦找到就退出循环

JCXZ指令

MOV  CX,VAR1
JCXZ  DONE
;循环准备
L1:
;循环体
LOOP  L1
;循环后的处理
DONE:
;其他内容

当循环前给CX赋值时(CX)有为0的可能的时候,为避免(CX)=0而出现65536次循环,需要利用JCXZ在循环前检查CX是否为0,如果为0则跳到标号DONE的位置(即跳过循环)。

子程序调用返回指令

子程序调用指令call

CALL  LABEL
//调用入口地址标号为LABEL的子程序
CALL FAR PTR LABEL
//段间调用(段内调用时NEAR PTR可以省略)
CALL  OPR
//调用入口地址为(OPR)的子程序

当使用第一种格式时,有三种情况:

  • 当LABEL标号与CALL指令不在同一段时,子程序调用在段间进行,CS、IP入栈,IP赋LABEL的EA,CS赋LABEL的段地址;寻址方式:段间直接寻址
  • 当LABEL标号与CALL指令在同一段时,子程序调用在段内进行,IP入栈,(IP)=(IP)+DISP,寻址方式:段内直接寻址/相对寻址;根据DISP,又可分:
    • 若DISP可用8位有符号数表示
    • 若DISP可用16位有符号数表示

当使用第二种格式时,根据OPR的不同,可分为:

  • 当OPR为REG16或者16位MEM时,子程序调用在段内进行,IP入栈,(IP)=(OPR);寻址方式:段内间接寻址
  • 当OPR为32位MEM时,子程序调用在段间进行,S、IP入栈,IP赋OPR的低16位,CS赋OPR的高16位;寻址方式:段间间接寻址

子程序返回指令RET

RET
;用于段内子程序的返回,完成IP出栈
RETF
;用于段间子程序的返回,完成IP出栈,CS出栈
RET  n
;完成前两项的功能后,(SP)=(SP)+n

过程的定义

过程名  PROC [类型]
;过程的内容
RET
过程名  ENDP
  • 过程名可以看做标号,具有段地址、偏移地址、类型三个属性
  • 子程序类型可取(缺省为NEAR):
    • NEAR:近程过程,段内调用
    • FAR:远程过程,段间调用
  • 子程序开始时,需要将需要用到的REG的内容入栈保护;在return之前需要将对应REG的值弹出;
  • 如果子程序中用到堆栈,要特别注意在返回语句之前的SP一定要指向入栈时的位置;
  • 主程序和子程序之间的参数传递:
    • REG参数传递(个数有限)
    • MEM参数传递
    • 堆栈参数传递

中断调用与返回指令

INT  n

调用第n号中断,n为中断类型号,其值可以为0~255。执行该指令时,会:

  • PSW、CS、IP入栈
  • 清除IF、TF标志
  • 从中断向量表中取出中断向量(中断服务子程序的入口地址)并转到中断服务子程序执行
  • 中断服务子程序的最后一条指令应该是中断返回指令
IRET

该指令写在中断服务子程序中,用于返回主程序:IP、CS、PSW出栈

字符串操作指令

字符串传送指令

重复前缀

字符串比较指令

字符串扫描指令

字符串装入指令

字符串存储指令

输入输出指令

IN  DST,SRC
//DST为指定读取数据的寄存器,SRC用于指定端口地址
OUT  DST,SRC
//同上
  • 与IO端口交互的寄存器只能是AL或者AX,8位端口采用AL,16位端口采用AX
  • SRC为端口地址,当端口地址可以用8位地址值表示时,可以采用直接寻址;否则SRC只能是DX,为寄存器间接寻址

其他指令

NOP
;空操作指令:什么也不做,但要占用三个时钟周期
HLT
;暂停指令:是CPU进入暂停状态,某些条件时退出
WAIT
;等待指令:使CPU进入等待状态,某些条件时退出
LOCK <其他指令>
;总线锁定指令,保持总线的使用权
ESC
;换码指令:完成多处理器间指令和数据交换

宏指令

宏定义指令

<宏指令名> MACRO [<形式参数>]
 //这里写宏体
ENDM
  • 调用宏时实际参数的个数和类型必须和形式参数一致
  • 宏体里可以使用连接符&,后跟某个参数,表示宏展开时字符串直接相连

你可能感兴趣的:(8086CPU和汇编语言)