概述
指令格式
操作码|地址码
前缀 | 操作码 | 寻址方式 | 位移量 | 立即数 |
寻址方式
指令的寻址方式
顺序寻址
顺序结构的程序,执行时按照其代码编写的顺序(内存储顺序)执行。CPU根据IP指针指向的地址取出指令,分析该指令的长度,将IP的值加上指令的长度,形成下一条指令的地址,这种寻找下一条指令的方法称为顺序寻址。
转移寻址
遇到除顺序结构外的其他结构时,下一条指令的地址有本条指令给出。本条指令执行时,由CPU将下一条指令的地址传送到CS和IP中,实现程序的转移,这种寻找下一条指令的方法称为转移寻址。
操作数的寻址方式
操作数的分类
源操作数在指令中只参与运算,指令执行后源操作数不发生改变;
指令执行后目的操作数的值一般会发生变化。
操作数寻址方式
立即寻址:
操作数存放在指令的地址码字段,即操作数是指令的一部分,操作数存放在存储器的代码段,取指令的同时连同操作数一起取到CPU中,操作数可以时8位,16位。存放高位时存放在高地址单元,存放地位时存放在低地址单元。
寄存器寻址
操作数存放在CPU内部的寄存器中
8位寄存器:AL,AH,BL,CL,CH,DL,DH
16位通用寄存器:AX,BX,CX,DX,SI,DI,SP,BP
16位段寄存器:CS,SS,DS,ES
MOV AX,BX
表示把BX中的值直接放到AX中
直接寻址
指令的地址码字段给出直接的是操作数在存储器中的16位偏移地址EA,
段地址
如果指令前没有加操作数限制前缀,则操作数默认存放在存储器的数据段,操作数的段地址为DS的值。
如果指令前有操作数限制前缀,则操作数的段地址由操作数限制前缀中给定的段寄存器确定。
例如:
MOV AX,[2000H]
假设指令执行前DS = 1000H,(12000H)=12H,(12001H)= 34H
源操作数的物理地址为:1000Hx10H+2000H
MOV BX,ES:[1000H]
已知ES=1200H
则源操作数的物理地址为:
1200HX10H+1000H
=13000H
寄存器间接寻址
操作数存放在存储器中,其偏移地址存放在16位寄存器中,可以存放操作数偏移地址的寄存器由4个,BX,BP,SI,DI.
偏移地址 | 段地址 |
BX | DS |
SI | DS |
DI | DS |
BP | SS |
MOV [BX],AX
假设DS = 1000H,BX = 1100H
目的操作数的物理地址为:
1000HX10H+1100H
=111000H
MOV [BP],AX
假设SS=2000H,BP=6100H
目的操作数的偏移地址为6100H,段地址为2000H,则源操作数的物理地址为:
2000HX10H+6100H
=261000H
寄存器相对寻址方式
操作数放在存储器中,操作数的偏移地址是基址寄存器或者变址寄存器的内容加上8位或者16位的位移量。即操作数的有效地址为:
例如
MOV [BX+100H],AX;DS = 1000H,BX = 1100H
目的操作数的寻址方式:寄存器相对寻址方式
目的操作数的偏移地址:BX+100H=1200H
目的操作数的物理地址:DS X10H+1200H
=11200H
MOV AX,[BP+10H],SS=2000H,BP=6100H
源操作数:寄存器相对寻址方式
源操作数的偏移地址:BP+10H=6110H
源操作数的物理地址:SS X 10H+6110H。
=26110H
基址变址寻址
操作数存放在存储器中,操作数的偏移地址,是一个基址寄存器的内容和一个变址寄存器的内容之和。
例如;
MOV AX,[BX+SI],DS = 1000H,BX = 1100H,SI = 1200H
源操作数:基址变址寻址
源操作数的偏移地址:BX+SI = 1300H
源操作数的物理地址:DS X 10H+1300H
=12300H
MOV [BP+DI] , AX SS = 2000H, BP = 6100H, DI = 1300H
目的操作数的寻址方式:基址变址寻址
目的操作数的偏移地址:BP+DI = 7400H
目的操作数的物理地址:SS X 10H +7400H=27400H
相对基址变址寻址
操作数存放在存储器中,操作数的偏移地址是一个基址寄存器的内容加上一个变址寄存器的内容再加上一个8位或16位移量组成。
例如:
MOV AX,[BX+SI +10H] DS = 1000H,BX = 1100H,SI = 1200H
源操作数:相对基址变址寻址方式
源操作数的偏移地址:BX+SI+10H = 1100H + 1200H +10H = 2310H
源操作数的物理地址:DS X 10H + 2310H = 12310H
MOV [BP+DI+100H] ,AX
假设:SS = 2000H,BP = 6100H, DI = 1300H
目的操作数的寻址方式:相对基址变址寻址
目的操作数的偏移地址:BP+DI+100H = 7500H
目的操作数的物理地址:SS X10H + 7500H = 27500H
总结
按照操作数的存放位置,操作数可以分为立即数操作数,寄存器操作数和存储器操作数 3类
立即数操作数:立即数存放在存储器的代码段,是指令的一部分。立即数操作数只能作为源操作数,不能作为目的操作数。
寄存器操作数:寄存器操作数存放在CPU内部的寄存器中,指令执行时无需访问存储器,指令的执行速度快,寄存器操作数在指令中既可以作为源操作数,也可以作为目的操作数。
存储器操作数:直接寻址,寄存器间接寻址,寄存器相对寻址,基址变址寻址和相对基址变址寻址五种寻址方式对应的操作数位存储器操作数,存储器操作数存放在存储器中,其偏移地址通过寻址给出,其段地址在指令中隐含给出,或通过段超越前缀给出,存储器操作数在指令中可以作为源操作数或者目的操作数。
8086指令系统
指令的共性
1,可以实现字节操作,也可以实现子操作。
2,可以使用前面的各种寻址方式,源操作数可以为立即数操作数,存储器操作数和立即数操作数;目的操作数可以为寄存器操作数和存储器操作数。
3,两个操作数的长度必须相同,
4,当两个操作数为存储器操作数和立即数操作数时,必须指明内存单元的类型属性,内存单元的类型有三种:
DWORD PTR------双子类型
WORD PTR-------子类型
BYTE PTR--------字节类型
5,两个操作数不能同时为存储器操作数,
6,IP不能作为操作数,CS不能作为目的操作数
数据传送指令
1,通用数据传送指令
1),基本传送指令
指令的一般形式:MOV DST,SRC(SRC :源操作数,DST:目的操作数)
功能:将源操作数的字节或字送到目的操作数中.
MOV指令可以实现如下操作指令:
1,MOV指令不能完成立即数到段存储器的数据传送。
MOV DS,1500H 这样是错误的
立即数操作数到存储器的传送
不能实现段寄存器到段寄存器的传送
存储器到存储器之间的传送
MOV AL,[BX]
MOV [1000H],AL
例题:用一条指令完成一下问题
1,给AL赋初值69H
MOV AL,69H
2,把内存2100H子单元清零。
MOV WORD PTR [2100H],00H
3,把内存以BX间接寻址的字节单元内容传送到CL中
MOV CL,[BX]
数据交换指令
格式:XCHG OPRD1 OPRD2
功能:将OPRD1和OPRD2中的之惊醒交换。可以实现子数据和字节数据的交换
注意:
操作数OPRD1和OPRD2不能同时为存储器操作数
立即操作数不能参与交换
段寄存器的内容不能参与交换。
堆栈操作指令
入栈指令
格式:PUSH SRC
功能将源操作数压入堆栈,不影响标志位。
注意:源操作数必须为子数据。源操作数可以为寄存器操作数或存储器操作数,即源操作数可以是16位的通用寄存器,段寄存器或者是16位的存储器操作数。
指令执行的过程:
修改堆栈指针SP-2-SP,形成新的堆栈栈顶
将源操作数送至新的堆栈栈顶存放。即源操作数的地8位送至SP指向的存储单元,高八位送至SP+1指向的存储单元。
出栈指令
格式:POP DST
功能:将当前堆栈栈顶的子数据弹出到目的操作数,不影响标志位。
注意:目的操作数的类型必须位子类型。目的操作数可以是寄存器操作数也可以是存储器操作数,即源操作数可以是16位的通用寄存器,段寄存器或16位存储器操作数。
POP CS X
指令执行的过程:
将退栈栈顶的子数据弹出到目的操作数给定的存储单元,或者寄存器,即SP指向存储单元的内容送至操作数低8位,(SP)+1指向的存储单元的内容送到目的操作数的高八位。
修改堆栈指针SP,SP+2——SP,形成新的栈顶。
地址传送指令
去有效地址指令:LEA
格式:LEA REG 16,MEM
功能:将源操作数的16位偏移地址送到目的操作数。指令中要求源操作数是存储器操作数,目的操作数必须是一个16位的寄存器操作数。
例如:已知 DI = 0500H,(DS:0610H) = 75H,(DS:0611H) = 12H
LEA BX,[DI+110H] ;指令执行后BX=0610H
MOV BX,[DI+110H] ;指令执行后BX=1275H
地址指针装入DS指令
格式:LDS REG 16,MEM32
将源操作数地址所对应的32位存储器操作数,送入到DS和指令中指定的寄储器中。32位的存储器是一个逻辑地址,其稿子部分为段地址,底子部分为偏移地址,指令执行时,将32位存储器操作数的高字送到附加段寄存器DS,底字送到目的操作数给出的16位寄存器。
例如:LDS BX,[1000H],已知DS = 1200H
指令执行的结果:DS = 2000H, BX=5018H
地址指针装入ES指令
格式:LES REG 16,MEM32
功能;将源操作数地址所对应的32位存储器操作数送入到ES和指令中指定的寄存器。32位存储器时一个逻辑地址,其高字部分是个段地址,底字部分时偏移地址,指令执行时将32位存储器操作数高字部分送入到附加段寄存器ES,低字送到目的操作数给出的16位寄存器。
例:LES SI,[BX] ;将BX指向的存储单元中的字数据送入BX中,将BX+2指向的存储单元中的字数据送到ES中。
已知:DS = 2000H,BX = 2000H,存储单元(22000H) = 0A0H,(22001H) = 10H,(22002H) = 00H,(22003H) = 18H
指令执行的结果:ES = 1800H,BX = 10A0H
输入输出指令
输入输出指令实现的是CPU与I/O端口之间的数据传送。
输入指令:IN:I/O端口---------累加器(AL / AX)
输出指令:OUT : 累加器AL / AX---------I/O端口
I/O端口的寻址方式:(I/O端口的地址范围:0000H~FFFFH)
直接寻址:在指令中直接给出I/O端口的地址对I/O端口进行访问,其地址范围:00H~FFH
间接寻址:在访问I/O端口时,不直接给出I/O端口的地址,而是将I/O端口的地址送入到DX寄存器中,通过DX寄存器间接访问I/O端口。所有的I/O端口都可以采用间接寻址的方式访问。
输入指令IN
格式:
IN ACC PORT
IN ACC DX
功能:将端口中的8位或16位数据送到累加器AL或AX中
例:IN AL,80H
MOV DX,2100H
IN AL,DX
输出指令
格式:OUT ACC PORT
OUT ACC DX
功能:累加器AX,AL中的8位或16位数据送至I/O端口
例如:OUT 78H,AL
MOV DX ,183H
OUT DX,AL
例题:编写程序段
将内存1000H的一个字数据送到外设端口62CH中
MOV AL,1000H
MOV DX,62CH
OUT DX,AL
编写程序段,将外设端口地址为62CH中的一个字数据传送到内存1000H中,
MOV DX,62CH
IN AL,DX
MOV [1000H],AL
查表指令XLAT
格式:XLAT ;BX + AL -----AL
功能:完成一个字节的查表转换,要求表格的长度小于256B
例如,利用查表指令查找数字0~9的共阴极七段数码管的码值。TABEL DB 3FH ,06H ,5BH, 4FH, 66H, 6DH, 7DH,07H, 7FH,6FH,TABEL表中存放了共阴极数码管数字0~9,使用查表指令查找数字7的段码值并送到累加器AL中。
LEA BX,LABEL
MOV AL,7
XLAT
算数运算指令
加法运算指令
不带进位的加法指令
格式:ADD DST,SRC
功能:DST+SRC--------DST按照执行结果影响全部的状态标志位,CF,,PF,ZF,AF,SF,OF
带进位的加法指令
格式:ADC DST,SRC
功能:DST+SRC+CF-----DST,按照运算结果影响全部标志位。,ADC适用于多子数据的加法
加1指令INC
格式:INC DST
功能:DST+1-------DST,INC不影响标志位CF,但按照运算结果影响其他标志位。
注意:INC指令中的目的操作数可以是8位或16位的寄存器操作数或存储器操作数,但不能为立即数操作数,并且当操作数位1为存储器操作数是要指出存储器操作数的类型。
减法运算指令
不带借位的减法指令
格式:SUB DST,SRC
功能:DST-SRC ------ DST
按照操作结果影响标志位
带借位的减法指令
格式:SBB DST,SRC
功能:DST-SRC-CF---------DST中
同时按照运行结果影响标志位..SBB一般用在多字节的减法运算中。
减1指令
格式:DEC DST
功能:DST-1----DST,不影响标志位CF,但运算结果影响其他标志位。
DEC,INC,指令在循环程序中一般用于修改地址指针或循环次数。
求补指令
格式:NEG DST
功能:0 - DST ----- DST
一般对负数进行取绝对值
比较指令
格式:CMP DST,SRC
功能:DST - SRC,按照差值影响标志位,CF,SF,OF,ZF,PF,AF,利用标志位可以比较两个操作数的大小。
乘法运算指令
无符号数乘法指令格式:
MUL SRC
SRC X AL --------AX ;字节乘法
SRC X AX -------DX : AX ;字乘法
带符号数乘法运算
IMUL SRC
SRC X AL --------AX ;字节乘法
SRC X AX -------DX : AX ;字乘法
除法运算指令
无符号:
DIV SRC
带符号
IDIV SRC
逻辑运算与移位指令
逻辑运算指令
1,逻辑非指令NOT
格式:NOT SRC
功能:将目的操作数的每一位按位取反后将结果送到目的操作数。
2,逻辑与指令AND
格式:ADD,DST,SRC
功能按位逻辑与操作。按照源算结果影响标志位,但对AF标志位没有影响,逻辑与与运算通常对目的操作数的莫一位或多位进行清零。其他位保持不变,对需要清零的位和0进行逻辑与操作,需要保留的位于1进行与操作。
3,逻辑或运算OR
格式:OR DST,SRC
按位进行或运算,运算结果影响标志位,但对AF标志位没有影响。
逻辑或运算通常对一位或多位进行置位操作
,其他位保持不变,对需要置为的位与1进行逻辑1或运算保留位与0进行或运算
4,逻辑异或指令XOR
格式:XOR DST,SRC
进行的操作,按位异或。逻辑异或是对一位或多位进行取反操作,进行取反的位于1进行异或,保留位与0异或。
与NOT的不彤是异或不会影响标志位,而XOR会影响标志位。
5,逻辑测试指令
结果不送回,但会影响标志位。
通常用于测试目的操作数的那一位为0,测试方法是,将被测试位与1进行逻辑测试运算,其余位与0进行逻辑测试运算。根据标志位ZF,PF判定被测试位的值
ZF = 1 ;被测试位为0
ZF = 0 ;被测试位为1
移位指令
注意:
源操作数必须为1或CL,用于指明移位的位数
左移相当于乘法运算,左移1位相当于乘以2;右移一位相当于除以2,算术移位操作对象是带符号数,逻辑操作对象是无符号数。
对标志位的影响,按照结果影响SF,PF,ZF,对CF的印象,总是等于最后植入的CF的值。
对OF的影响移一位时有影响,
编写程序段:
已知内存数据区自2000H开始存放着10个带符号的字节数据,统计其中的正数,负数,和0的个数分别放到BL,DL,DH中
MOV SI,2000H
MOV DX,0
MOV BL,0
MOV DH,0
CHECK: MOV AL,[SI]
AND AL,AL
JS NEG
JZ ZERO
INC BL
JMP NEXT
NEG: INC DL
JMP NEXT
ZERO INC DH
NEXT INC SI
DEC CX
JNZ CHECK
HLT