指令系统基本知识

本文围绕8086汇编展开,介绍了指令和操作数的寻址方式,如顺序寻址、转移寻址、立即寻址等。还详细阐述了8086指令系统,包括数据传送、交换、堆栈操作等指令,以及算数运算、逻辑运算与移位指令,并给出了相关指令的格式、功能及示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

指令格式

操作码|地址码

前缀操作码寻址方式位移量立即数

寻址方式

指令的寻址方式

顺序寻址

顺序结构的程序,执行时按照其代码编写的顺序(内存储顺序)执行。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.

偏移地址段地址
BXDS

SI

DS
DIDS
BPSS

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        ;字乘法

注意:
1指令中的源操作数只能是寄存器操作数或者存储器操作数,不能为立即
数操作数,当操作数为存储器操作数时,需要规定存储单元的属性。
2乘法指令影响标志位CFOF
无符号乘法MULCFOF的影响
乘积的高半部分(字节乘法时为AH,字乘法时为DX)0,则CF=OF=0
乘积的高半部分(字节乘法时为AH,字乘法时为DX)不为0CF=OF=1
带符号乘法IMULCFOF的影响:乘积的高半部分仅仅是符号位的扩展,
AH=00FFHDX=00FFFFH,则CF=OF=0
如果乘积的高半部分不仅仅是符号位的扩展,包含有效数字,即𝐀𝐇 ≠ 𝟎
𝐀𝐇 ≠ 𝟎𝐅𝐅𝐇𝐃𝐗 ≠ 𝟎𝐃𝐗 ≠ 𝟎𝐅𝐅𝐅𝐅𝐇,则CF=OF=1

除法运算指令

无符号:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值