声明:博主原创,禁止转载。邮箱:qxlxi@qq.com
8086指令系统
传送寻址方式
寻址特点:
计算机的指令通常包含操作码和操作数部分。
立即寻址方式
Mov al,32
立即数只能作源操作数,不能作目的操作数。(遇到A-F开头的数字出现在指令中时,要加上一个数字0 Mov AX,0FF00H)
寄存器寻址方式
在寄存器寻址方式下,操作数包含在寄存器中,
对于16位操作数,AX.BX CX DX SI DI SP BP
对于8位操作数,则用寄存器AH AL BH BL CH CL DH DL
MOV DX,AX
注意:源操作数的长度必须与目的操作数一致
直接寻址方式
默认使用的段寄存器为数据段寄存器DS
MOV AX,[2000]
寄存器间接寻址方式
基址寄存器BX BP 变址寄存器SI DI
BX、SI、DI 默认数据段中
BP 默认堆栈段中
MOV BX,[SI]
寄存器相对寻址方式
MOV COUNT[SI]
基址变址寻址方式
机制寄存器(BX、BP)和变址寄存器(SI、DI)
MOV AX,[BX][SI]
相对基址变址寻址方式
Bx为寄存器时,使用DS做段寄存器
BP为寄存器时,使用SS做段寄存器
有关[]需要注意的就是
- 立即数可以出现在方括号中,表示直接地址。例如[2000]
- 只有Bx,Bp SI Di这个四个寄存器可以出现在[]内,他们可以单出现,也可以由几个寄存器组合起来。但Bx和bp寄存器不允许出现在同一个[]内,Si和di也不能同时出现。
数据传送指令
通用数据传送指令
MOV 传送指令
指令格式 MOV 目的、源
指令功能:将源操作数(一个字节或一个字)传送到目的操作数
例如:mov al,10
Cs不能做目的操作数
Mov指令允许在cpu的寄存器之间、存储器和寄存器之间。也可以将立即数送到寄存器或存储器中,Ip寄存器不能做源操作数或目的操作数。目的操作数也不允许用cs寄存器 另外,除了源操作数外,两个操作数中必须有一个是寄存器。但不能都是段寄存器。Mov指令不能再两个存储单元之间直接传送数据。也不能在两个段寄存器之间直接传送数据。
push进栈指令
指令格式:push 源
指令功能:将源操作数推入堆栈
源操作数可以是16位通用寄存器,端寄存器或存储器中的数据字,但不能是立即数。堆栈区的段地址由SS段寄存器的内容确定,堆栈的最大容量为64K,既一个段的最大容量。堆栈指针SP始终指向栈顶。
执行push sp>sp-2
pop出现指令
指令格式:pop 目的
指令功能:把当前sp所指向的堆栈顶部的一个字送到指定的目的操作数中。
目的操作数可以是16位通用寄存器 段寄存器 或存储单元 但cs不能做目的操作数,每执行一次出现操作,sp>sp+2
XCHG交换指令
指令格式:XCHG 目的 源
指令功能:把一个字或字节的源操作数和目的操作数相互交换。
交换可以在寄存器之间,寄存器与存储器之间进行,但段寄存器不能作为操作数,也不能直接交换两个存储单元中的内容。
XCHG AX,[BX+200H]
XLAT表转换指令
指令格式 XLAT 转换表
输入输出指令
输入输出指令用来完成i/o端口与累加器之间的数据传送,指令中给出io端口地址值。当执行输入指令时,把指定端口中的数据读入累加器中,当执行输出指令时,则把累加器中的数据写入指定的端口中。
IN输入指令
IN AL,端口地址
8位-Al 16位AX.
IN指令有两种格式,第一种格式 端口地址00-FF直接包含在IN指令里寻址256个端口,由于8086cpu可以直接访问地址0000-FFFFH的64k个i/o端口,当端口地址大于FFH,必须使用第二种寻址方式,先将端口号送入DX寄存器执行输入操作。
OUT 输出指令
OUT 端口地址,al
指令功能:将AL中的一个字节写到一个8位端口,或把AX中的一个字写到一个16位端口。
地址目标传送指令
这是一类用于传送地址码的指令,用来传送操作数的段地址和偏移地址。
LEA取有效地址指令
指令格式:LEA 目的,源
指令功能:取源操作数地址的偏移量,并把她传送到目的操作数所在的单元
LEA指令要求源操作数必须要是存储单元,目的操作数必须是一个除段寄存器之外的16位寄存器。
LEA BX,[SI]
LDS将双字指针送到寄存器和DS指令
指令格式:LDS 目的,源
指令功能:从源操作数指定的存储单元中,取出一个变量的4个字节地址指针,送进一对目的寄存器,其中 前两个字节送到指令中指定的目的寄存器中,后两个字节送到DS寄存器。目的操作是16位寄存器,通常使用SI寄存器,但是不能使用段寄存器。
LES将双字指针送到寄存机和ES指令
指令格式:LES 目的,源
指令功能:这指令与LDS指令的操作接本相同,所不同的是要将源操作数地址指针中的段地址部分送到ES寄存器中,而不是DS寄存器,目的操作数常用DI寄存器。
标志传送指令
LAHF标志位到AH指令
格式指令:LAHF
指令功能:把寄存器SF ZF AF PF CF分别传送到AH寄存器对应位置上
执行这条指令后,标志位本身不受影响。AH相同于8080的标志寄存器,从而对8080程序进行切换
SAHF AH送到标志寄存器
指令格式:SAHF
指令功能:把AH内存存入标志寄存器,这条指令与LAHF的操作相反,它把寄存器AH中的送入标志寄存器。高位标志OF DF TF不受影响
PUSHF 标志入栈指令
指令格式:PUSHF
指令功能:把整个标志寄存器的内容推入堆栈,同时修改堆栈指针,使Sp<-sp-2
注意:这条指令执行后对标志位无影响。
POPF 标志出现指令
指令格式:POPF
指令功能:把当前堆栈指针Sp所指的一个字,传送给标志寄存器FLAGS并修改堆栈指针 Sp<-sp+2
注意点:成对的使用pushf和popf这两条指令,可对标志寄存器进行保护和恢复常用在过程(子过程)调用和中断程序的开头与结尾处,对进行过程调用或发生中断时主程序的状态进行保护。
算数运算指令
算数运算指令可处理4种类型的数,无符号二进制整数,带符号二进制整数、无符号压缩十进制整数和无符号非压缩十进制整数。
例如:
非压缩十进制数58
压缩十进制数0101 1000B
非压缩十进制数 0000 0101B 和 0000 1000B
加法
ADD加法指令
指令格式:ADD 目的,源
指令功能:将源操作数和目的操作数相加,结果送回到目的操作数中
既 目的ß- 源+ 目的
ADC带进位的加法指令
指令格式:ADC 目的,源
指令功能:目的ß- 源+目的+CF
注意:这两条指令的源操作数可以是寄存器 存储器或立即数
目的操作数只能用寄存器和存储单元
Add 和 Adc指令影响的标志位Cf Of Pf Sf Zf Af
INC增量指令
指令格式:INC 目的
指令功能:对目的操作数加1 结果送回到操作数
目的ß- 目的+1
该指令主要用在循环程序中,对地址指和循环计数器等进行修改。指令执行后影响AF OF PF SF ZF 但进位标志CF 不影响
注意:由于该指令只有一个操作数,如果要是内存单元的内容增1 则程序中必须要说明存储单元是字还是字节的符号
INC BYTE PTR[BX]
BYTE à说明是字节
WORD à说明是字
AAA加法的ASCLL调整指令
指令格式:AAA
指令功能:运算结果以存在AL的情况下,用此指令将AL寄存器中的运算结构调整为1位非压缩十进制数,仍保留在AL中,AF=1表示有进位
DAA加法的十进制数调整指令
指令格式:DAA
指令功能:将两个压缩BCD数相加后的结果调整为正确的压缩BCD数。相加后的数必须在AL中,才能使用DAA指令。
减法
SUB减法指令
指令格式:SUB 目的 源
指令功能:将目的操作数减去源操作数,结果送回到目的操作数
目的ß- 目的-源
SUB AX,BX
SBB带借位的减法指令
指令格式:SBB 目的 源
指令功能:与SBB类似,只是在两个操作数相减后,还要减去进位/借位CF的值
SBB AL,CL Alß- AL-CL-CF
DEC减量指令
指令格式:DEC 目的
指令功能:对指定的目的操作数减1 结果送回到此操作数。
DEC BX; BXß- Bx-1
NEG取负指令
指令格式:NEG 目的
指令功能:对目的操作数取负,既用零减去操作数,在把结果送回到目的操作数
NEG AX; 将Ax中的数取负(正数变负数,负数变整数)
CMP比较指令
指令格式:CMP 目的,源
指令功能:将目的操作数减去源操作数,但结果不给目的操作数。仅将结果反映在标志位上。
AAS减法的ASCLL调整指令
DAS减法的十进制调整指令
乘法
MUL无符号数乘法指令
指令格式:MUL 源
指令功能:把源操作数和累加器中的数都当成无符号数 然后将两数相乘,源操作数可以是字节或字
字节 AXß-- AL*源
字 DX AXß- AX*源
当源操作数是存储单元时,必须在操作数前加BYTE或WORD说明是字还是字节
字节
字
IMUL整数乘法指令
指令格式:IMUL 源
指令功能:把源操作数和累加器中的数都作为带符号数,进行相乘
字节: AXß- AL*源
字: DX AXß- AX*源
AAM乘法的ASCLL调整指令
指令格式:AAM
指令功能:对已存在AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整,使得在AX中得到的正确的非压缩十进制数的乘积。
调整过程:把AL寄存器内容除以10,商放在AH中,余数在AL中
AHß-AL/10所得的数
ALß-AL/10所得的余数
指令执行后 将影响ZF SF PF 但AF CF OF无定义
除法
DIV无符号数除法指令
指令格式:DIV 源
指令功能:对两个无符号二进制数进行除法操作。
ALß-AX/源的商
AHß-AX/源/的余数
IDIV整数除法指令
指令格式:IDIV 源
指令功能:该指令执行的操作与DIV相同,单操作数必须带符号数的商和余数也都是带符号数的。
CBW把字节转换成字指令
指令格式:CBW
指令功能:把寄存器AL中的字节的符号位扩充到AH的所有位
AL D7=0 就将这个0拓展到AH中
AL D7=1 1拓展到AH中
CWB执行后不影响标志位
CWD把字转换成双字指令
指令格式:CWD
指令功能:把AX中的字的符号扩充到DX中
AX D15 = 0 则DX = 0000H
AX D15 = 1 则DX = 1111H
CWD执行后不影响标志位
AAD除法的ASCLL调整指令
指令格式:AAD
指令功能:在做除法前,把BCD码转换成二进制数
逻辑运算和移位指令
逻辑运算指令
NOT取反指令
指令格式:NOT 目的
指令功能:将目的操作数求反,结果送回到目的操作数
目的ß- 目的
存储器数要说明是什么类型字节还是字
执行后,均将CF和OF清零。SF和PF反映操作结果。AF未定义 源操作数不变
AND逻辑与指令
指令格式:AND 目的,源
指令功能:对两个操作数进行按位逻辑与操作,结果送回到目的操作数
目的ß- 目的∧源
主要用于使操作数的某些位保留 和1 相与
OR逻辑或指令
指令格式:OR 目的,源
指令功能:对两个操作数进行按位逻辑或操作,结果送回到目的操作数
目的ß-目的∨源
XOR异或操作指令
指令格式:XOR 目的,源
指令功能:对两个操作数进行按位逻辑异或运算,结果送回到目的操作数
目的ß-目的^源
TEST测试指令
指令格式: TEST 目的,源
指令功能:对两个操作数进行逻辑与操作,并修改标志位 但不会送结果。
算数逻辑移位指令
SAL算数左移指令(Shift Arithmetic Left)
指令格式: SAL 目的,计数值
SHL逻辑左移指令(Shift Logic Left)
指令格式:SHL 目的,计数值
左移 最低位补0 最高位进入CF
若只需要移动一位,可直接将指令中的计数值置1 要是移位次数大于1
应该先将移位次数送入CL寄存器,再把CL放在指令的计数值位置上
SHR逻辑右移指令(Shift Logic Right)
指令格式:SHR 目的,计数值
指令功能:对目的操作数中各个进行右移,最低位进入CF 最高位补0
SAR算术右移指令(Shift Arithmetic Right)
指令格式:SAR 目的,计数值
指令功能:其他和SHR相同 最低位进入CF 但是最高位保持不变 而不是补0
循环移位指令
ROL循环左移指令(Rotote Left)
指令格式:ROL 目的,计数值
ROR循环右移指令(Rotate Right)
指令格式:ROR 目的,计数值
RCL通过进位位循环左移(Rotate through Carray Left)
指令格式:RCL 目的,计数值
RCR 通过进位位循环右移(Rotate througt Carray Right)
指令格式:RCR 目的,计数值
字符串处理指令
MOV字符传送指令
CMPS字符串比较指令
SCAS字符串扫描指令
LODS数据串转入指令
STOS数据串存储指令
控制转移指令
无条件转移和过程调用指令
1 JMP无条件转移指令
过程调用和返回指令
条件转移指令
循环控制指令
中断指令
处理器控制指令
标志操作指令
指令助记符 |
操作 |
指令名称 |
CLC |
CFß-0 |
进位标志清0(Clear Carray) |
CMC |
CFßCF |
进位标志求反(Complement Carray) |
STC |
CFß1 |
进位标志置1 (Set Carray) |
CLD |
DFß0 |
方向标志位清0(Clear Direction) |
STD |
DFß1 |
方向标志位置1(Set Direction) |
CLl |
IFß0 |
中断标志位清0(Clear interrupt) |
STI |
IFß1 |
中断标志位置1(Set Interrupt) |
外部同步指令
ESC换码指令
Wait等待指令
LOCK封锁总线指令
停机指令和空操作语句
HLT停机指令
NOP空操作和无操作指令