第三章80868088指令系统.docx

上传人:b****5 文档编号:6659181 上传时间:2023-01-08 格式:DOCX 页数:46 大小:395.05KB
下载 相关 举报
第三章80868088指令系统.docx_第1页
第1页 / 共46页
第三章80868088指令系统.docx_第2页
第2页 / 共46页
第三章80868088指令系统.docx_第3页
第3页 / 共46页
第三章80868088指令系统.docx_第4页
第4页 / 共46页
第三章80868088指令系统.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

第三章80868088指令系统.docx

《第三章80868088指令系统.docx》由会员分享,可在线阅读,更多相关《第三章80868088指令系统.docx(46页珍藏版)》请在冰豆网上搜索。

第三章80868088指令系统.docx

第三章80868088指令系统

第三章8086/8088指令系统

3.1指令格式

机器语言指令由二进制代码组成。

一条指令一般包含操作码(OP)和操作数两部分,操作码指明指令所完成的操作,操作数指出该指令在执行规定操作时所需的信息。

8086/8088指令有1-6个字节构成(按一定的编码格式)

3.28086/8088寻址方式P51

指令中用于说明操作数(一般指源操作数)所在地址的方式被称为寻址方式。

(8086的寻址方式分两类:

数据寻址方式和转移地址的寻址方式)

3.2.1数据寻址方式P51

1.立即寻址:

数据是8位或16位,直接放在指令的最后一个(8位)或两个字节(16位)中,这样的数据称为立即数。

MOVAL,80HADDAX,0F000H

MOVAX,1234HADDAL,10H

2.寄存器寻址:

数据存放在指令规定的寄存器中。

MOVCL,DL

MOVAX,BX

注意:

在双操作数指令中源操作数寻址方式和目的操作数寻址方式。

3.直接寻址:

操作数在存储器中,其16位有效地址,即段内偏移地址在指令码中,占两个字节。

MOVAL,[1064H];设(DS)=2000H

ADDAX,[2000H]

4.寄存器间接寻址:

操作数在存储器中,其16位有效地址EA在指令指定的基址寄存器BX或变址寄存器SI、DI中。

BX

EA=SI

DI注意:

新教材中有BP

【例】MOVAX,[SI]

MOV[BX],AL

如果:

(DS)=3000H,(SI)=2000H,(BX)=1000H,(AL)=64H

注意:

默认段地址寄存器为DS

以上为二字节指令;

MOVAX,[BP]为三字节指令;实为指令MOVAX,[BP+0]的简写!

5.寄存器相对寻址:

操作数在存储器中,其效地址是一个8位或16位的位移量与一个基址寄存器或变址寄存器的内容之和。

BX

EA=BP+8disp

SI16disp

DI

【例】MOVAX,[SI+10H];可写为MOVAX,10H[SI]

MOVCX,[BX+COUNT]

如果:

(DS)=3000H,(SI)=2000H,(BX)=1000H,COUNT=1050H

(AX)=4050H

注意:

8disp和16disp为带符号的整数,前者范围为-128到+127后者为

在计算有效地址时超过16时则进位丢失

寄存器BP的默认段地址寄存器为SS(见P43表2.2)

6.基址变址寻址:

操作数在存储器中,其效地址是一个基址寄存器和一个变址寄存器的内容之和。

EA=BX+SI

BPDI

【例】MOV[BX+DX],AX

MOVCX,[BP][SI]

如果:

(DS)=3000H,(SS)=4000H,(BX)=1000H,(DI)=1100H

(AX)=0050H,(BP)=2000H,(SI)=1200H

注意:

一般情况下,基址寄存器决定操作数在那个段中

7.基址变址相对寻址:

操作数在存储器中,其效地址是一个8位或16位位移量、一个基址寄存器和一个变址寄存器内容三部分之和。

EA=BX+SI+8disp

BPDI16disp

【例】MOVAX,[BX+DI+1200H]

MOV[BP+SI+200H],CX

如果:

(DS)=8000H,(SS)=6000H,(BX)=1000H,(DI)=1500H

(BP)=1000H,(SI)=1600H,(CX)=7856H

8.隐含寻址:

指令操作码本身隐含地指明了操作数地址;有些指令没有操作数。

【例】字符串操作指令:

MOVSB,该指令为单字节指令

该指令的功能是:

((ES:

DI))←((DS:

SI))

(DI)=(DI)±1,(SI)=(SI)±1

源地址为DS:

SI,目的地址为ES:

DI

方向标志DF决定地址指针的加或减操作

一些特殊指令则无操作数:

如NOP(空操作),HLT(停机)等。

 

【例】

若(BX)=1200H,(SI)=0A00H,位移量=0710H,(DS)=3200H,

(SS)=5000H,(BP)=2200H,段寄存器按默认段寄存器,则相对于各种寻址方式的有效地址和物理地址将是:

(1)直接寻址:

EA=0710H

物理地址=32000H+0710H=32710H

(2)寄存器间接寻址(假设寄存器为BP):

EA=2200H

物理地址=50000H+2200H=52200H

(3)寄存器相对寻址(假设寄存器为BX):

EA=1200H+0710H=1910H

物理地址=32000H+1910H=33910H

(4)基址变址寻址(假设寄存器为BP和SI):

EA=2200H+0A00H=2C00H

物理地址=50000H+2C00H=52C00H

(5)基址变址且相对寻址(假设寄存器为BX和SI):

EA=1200H+0A00H+0710H=2310H

物理地址=32000H+2310H=34310H

 

3.2.2转移地址寻址方式P56

8086CPU以CS:

IP的现行值取指并执行(即顺序执行程序);

程序转移是在程序转移指令的控制下实现;

程序转移指令通过改变CS和IP的内容,即改变了程序的正常执行顺序;

子程序调用(返回)、中断(返回)等也会改变CS、IP。

转移地址的寻址方式有4种

1.段内直接寻址

指令码中包括一个位移量disp,转移的有效地址为(IP)+disp

disp在指令码中都是用补码表示的有正负符号的数。

当位移量是8位时,称为短转移,转移范围为−128~+127;

位移量是16位时,称为近转移,转移范围为−32768~+32767;

位移量是相对于当前IP的内容来计算的,所以又称为相对寻址。

JMPNEARPTRPROGIAJMPSHORTQUEST

其中,PROGIA和QUEST均为转向的目标地址(一般为标号),在机器指令中,用位移量来表示(由汇编器自动计算)。

2.段内间接寻址

在同一代码段内,要转移到的地址的16位段内偏移地址(即有效地址)在一个16位寄存器中或在存储器相邻两个单元中。

存放转移地址的寄存器或相邻两个单元的第一个单元的地址,在指令中以前面讨论的数据的寻址方式给出。

JMPBXJMPWORDPTR[BP+10H]

其中WORDPTR为操作符,用以指出其后的寻址方式所取得的目标地址是一个字的有效地址。

3.段间直接寻址

令码中直接给出16位的段地址和16位的有效地址。

JMPFARPTRLABEL_NAME

其中,LABEL_NAME是一个在另外的代码段内已定义的远标号。

 

4.段间间接寻址

与段内间接寻址相似,转移地址为32位(16位段地址和16位有效地址)

指令中一定给出某种访问内存单元的寻址方式。

用这种寻址方式计算出的存储单元地址开始的连续4个单元的内容就是要转移的地址,其中前两个单元内的16位值为有效地址,后两个单元内的16位值为段地址

JMPVAR_DOUBLEWORDJMPDWORDPTR[BX]

第一条指令:

VAR_DOUBLEWORD是一个已定义为32位的存储器变量;

第二条指令:

用操作符PTR将存储器操作数类型定义为DWORD(双字)。

 

3.38086/8088指令系统P57

⑴数据传送(DataTransfer)指令;

⑵算术运算(Arithmetic)指令;

⑶逻辑运算(Logic)指令;

⑷控制转移(ControlTransfer)指令;

⑸串操作(StringManipulation)指令;

⑹处理器控制(ProcessorControl)指令。

 

3.3.1数据传送指令

通用数据传送指令;

地址传送指令;

累加器专用传送(输入/输出指令);

标志传送指令。

1.通用数据传送指令;

传送指令MOV

数据交换指令XCHG

堆栈指令PUSH和POP

⑴通用数据传送指令MOV

格式:

MOVDST,SRC;(DST)

←(SRC)

DST:

目的操作数,SRC:

源操作数。

功能:

把一个字节或字从源操作数SRC传送至目的操作数DST

源和目的操作数不允许同时为存储器操作数;

源和目的操作数数据类型必须一致;

源和目的操作数不允许同时为段寄存器;

目的操作数不允许为CS和立即数;

当源操作数为立即数时,目的操作数不允许为段寄存器;

传送操作不影响标志位。

【例】

MOVAL,DH;(AL)←(DH)

MOVDS,AX;(DS)←(AX)

MOV[BX],AX;((BX))←(AX)

MOVAL,BLOCK;BLOCK为字节型变量名

MOVBLOCK,12H;(BLOCK)←12H

MOVAX,1234H;(AX)←1234H

交换指令XCHG(Exchange)

格式:

XCHGDST,SRC;(DST)←→(SRC)

功能:

交换操作数DST和SRC的值,操作数数据类型为字节或字。

允许通用寄存器之间,通用寄存器和存储器之间交换数据。

操作数DST和SRC不允许同为存储器操作数;

操作数数据类型必须一致;

交换指令不影响标志位。

【例】XCHGAX,BX;通用寄存器之间交换数据

XCHGBX,[SI];通用寄存器和存储器之间交换数据

XCHGAL,[BX];通用寄存器和存储器之间交换数据

如要实现存储器操作数交换,若BLOCK1和BLOCK2为已定义字变量,可用如下指令实现:

MOVAX,BLOCK1

XCHGAX,BLOCK2

MOVBLOCK1,AX

堆栈操作指令

堆栈是以后进先出(LIFO)的规则存取信息的一种存储机构

堆栈通常是存储器的一部分

为了保证堆栈区的存储器能按后进先出的规则存取信息,用堆栈指针SP来管理该存储区的存取地址

在信息的存与取的过程中,栈顶是不断移动的,也称它为堆栈区的动端,而堆栈区的另端则是固定不变的,这端又称其为栈底

堆栈操作指令不影响标志位

压栈指令PUSH(Pushontothestack)

格式:

PUSHSRC

功能:

(SP)←(SP)-2,((SP)+1,(SP))←(SRC)

将源操作数SRC压入堆栈,源操作数允许为16位通用寄存器、存储器和段寄存器,但不允许是立即数。

操作数数据类型为字类型,压栈操作使SP值减2。

【例】PUSHAX;通用寄存器操作数入栈

PUSH[SI];存储器操作数入栈

PUSHCS;段寄存器入栈

出栈指令POP(Popfromthestack)

格式:

POPDST

功能:

(DST)←((SP+1),(SP)),(SP)←(SP)+2

从栈顶弹出操作数送入目的操作数。

目的操作数允许为16位通用寄存器、存储器和段寄存器,但不允许是CS和立即数。

操作数数据类型为字类型,出栈操作使SP加2

【例】POPAX;操作数出栈送寄存器

POP[BX];操作数出栈送存储器

POPDS;操作数出栈送段寄存器

子程序调用(返回)、中断(返回)等必须用到堆栈。

2.地址传送指令;

地址传送指令对标志位无影响

取有效地址指令LEA(Loadeffectiveaddress)

格式:

LEAREG,SRC

功能:

(REG)←SRC的有效地址

将源操作数SRC的有效地址传送到通用寄存器,操作数REG为16位通用寄存器,源操作数为存储器操作数

指针送寄存器DS指令LDS(LoadDSwithpointer)

格式:

LDSREG,SRC

功能:

(REG)←(SRC),(DS)←(SRC+2)

根据源操作数SRC指定的偏移地址,在数据段中取出段地址和偏移地址分别送指定的段寄存器DS和指定的通用寄存器。

【例】LDSBX,[SI];将32位地址指针分别送DS和BX

……

DATADD40003500H;定义双字变量

……

LDSBX,DATA;(DS)←4000H,(BX)←3500H

指针送寄存器ES指令(LoadESwithpointer)

同上指令。

3.累加器专用传送(专用输入/输出指令)

输入/输出指令(IN/OUT)

查表指令XLAT(Translate)

输入/输出指令(IN/OUT)

输入/输出指令可以分为两大类:

一类是直接端口(Port)寻址的输入/输出指令;另一类是通过DX寄存器间接寻址的输入/输出指令。

在直接寻址的指令中只能寻址0~255个端口,而间接寻址的指令中可寻址整个64K(0000~FFFFH)个端口。

输入IN指令是将数据(字节/字数据)从一个输入端口传送到累加器(AL或AX)中。

输出OUT指令是将数据(字节/字数据)从累加器(AL或AX)传送到一个输出端口中。

输入/输出指令不影响标志位。

①输入指令IN(Input)

直接寻址格式:

INAcc,Port。

此指令是将8/16位数据经输入端口Port(地址号0~255)送入AL/AX累加器中;

间接寻址格式:

INAcc,DX。

此指令是从DX寄存器内容指定的端口中将8/16位数据送入AL/AX寄存器中。

这种寻址方式端口地址可由16位地址号表示,执行此指令前应将16位地址号存入DX寄存器中

②输出指令OUT(Output)

直接寻址格式:

OUTPort,Acc。

此指令是从AL或AX累加器输出8/16位数据到指令直接指定的I/O端口Port中;

间接寻址格式:

OUTDX,Acc。

此指令是从AL或AX累加器中输出8/16位数据到由DX寄存器内容指定的I/O端口中。

【例】INAL,10H;从输入端口10H输入一字节数据

OUT20H,AX;将AX中数据输出到20H输出端口

INAL,DX

OUTDX,AL

 

查表指令XLAT(Translate)

格式:

XLAT;(AL)←((BX)+(AL))

功能:

将寄存器AL中的内容转换成存储器表格中的对应值。

实现直接查表功能。

查表指令不影响标志位

【例3-1】内存中有一起始地址为TABLE的编码表,试编程将表中顺序号为3的存储单元内容送寄存器AL。

TABLEDB10H,20H,30H,40H,50H,60H 编码表

……

MOVAL,3;(AL)←3

LEABX,TABLE;BX←TABLE表首地址

XLAT;结果在AL中,(AL)=40H

4.标志寄存器传送指令

标志送AH指令LAHF(LoadAHwithflags)

格式:

LAHF

功能:

(AH)←(PSW)低8位;将标志寄存器中低8位送AH中,不影响标志位。

AH送标志寄存器指令SAHF(StoreAHintoflags)

格式:

SAHF

功能:

(PSW)低8位←(AH),将AH中内容送标志寄存器中低8位,影响标志位。

标志寄存器(FLAGS)进栈指令:

PUSHF;(Pushtheflags)

标志寄存器出栈指令:

POPF;(Poptheflags)

3.3.2算术运算指令P62

含加、减、乘、除四种基本算术运算及符号扩展和十进制算术运算调整指令。

加、减指令适用于无符号数和带符号数,带符号数采用补码表示。

注意:

二进制乘、除法指令分带符号数和无符号数运算指令

1.加法指令P62

加法指令ADD(Add)

带进位加法指令ADC(Addwithcarry)

加法指令ADD(Add)

格式:

ADDDST,SRC;(DST)←(DST)+(SRC)

功能:

ADD将源操作数与目的操作数相加,结果传送到目的操作数。

源操作数SRC可以是通用寄存器、存储器或立即数。

目的操作数DST可以是通用寄存器或存储器操作数。

SRC和DST都不能为段寄存器

带进位加法指令ADC(Addwithcarry)

格式:

ADCDST,SRC;(DST)←(DST)+(SRC)+CF

功能:

ADC是将源操作数与目的操作数以及CF(低位进位)值相加,结果传送到目的操作数。

ADD,ADC指令影响标志位为OF,SF,ZF,AF,PF,CF

【例】

MOVAX,9876H

ADDAH,AL;(AX)=0E76H,CF=1,SF=0,

;OF=0,ZF=0,AF=0,PF=0。

ADCAH,AL;(AX)=8576H,CF=0,SF=1,

;OF=1,ZF=0,AF=1,PF=0。

2.减法指令P62

减法指令SUB(Subtract)

带借位减法指令SBB(Subtractwithborrow)

减法指令SUB(Subtract)

格式:

SUBDST,SRC;(DST)←(DST)-(SRC)

功能:

SUB将目的操作数减源操作数,结果送目的操作数。

源操作数SRC是通用寄存器、存储器或立即数。

目的操作数DST可以是通用寄存器或存储器操作数。

SRC和DST不能为段寄存器。

带借位减法指令SBB(Subtractwithborrow)

格式:

SBBDST,SRC;(DST)←(DST)-(SRC)-CF

功能:

SBB将目的操作数DST减源操作数SRC,还要减CF(低位借位)值,结果送目的操作数。

SUB,SBB指令影响标志位为OF,SF,ZF,AF,PF,CF

【例】

MOVAX,9966H;(AX)=9966H

SUBAL,80H;(AL)=0E6H,CF=1,SF=1,OF=1,

;ZF=0,AF=0,PF=0。

SBBAH,80H;(AH)=18H,CF=0,SF=0,OF=0,

;ZF=0,AF=0,PF=1。

3.增量和减量指令P63

增量指令INC(Increment)

减量指令DEC(Decrement)

 

增量指令INC(Increment)

格式:

INCDST;(DST)←(DST)+1

功能:

INC指令将目的操作数加1,结果送目的操作数DST。

目的操作数为通用寄存器或存储器操作数。

DST不能为立即数和段寄存器

减量指令DEC(Decrement)

格式:

DECDST;(DST)←(DST)-1

功能:

DEC指令将目的操作数DST减1,结果送目的操作数。

INC,DEC指令影响标志位OF,SF,ZF,AF,PF;不影响CF标志。

【例】

INCBL;(BL)←(BL)+1

DECAX;(AX)←(AX)-1

INCWORDPTR[BX];((BX))←((BX))+1

4.比较指令CMP(Compare)P63

格式:

CMPDST,SRC;(DST)-(SRC)只影响标志位

功能:

目的操作数DST减源操作数SRC,结果不回送,影响标志位。

源操作数为通用寄存器、存储器和立即数。

目的操作数为通用寄存器、存储器操作数。

CMP指令影响标志位为OF,SF,ZF,AF,PF,CF

【例】

CMPCX,DX

CMPWORDPTR[SI],3

CMPAX,BLOCK;BLOCK为已定义字变量

【应用】

若(AX)和(BX)中已存储有数,执行比较指令CMPAX,BX后,对于两个数的比较(AX)-(BX)有以下2种情况:

两个无符号数比较,使用CF标志位判断。

当CF=0:

则(AX)≥(BX),若ZF=1,则(AX)=(BX)

当CF=1:

则(AX)<(BX)

两个带符号数比较,使用OF标志位判断。

若ZF=1:

则(AX)=(BX)

当OF=0:

SF=0,则(AX)>(BX);SF=1,则(AX)<(BX)

当OF=1:

SF=0,则(AX)<(BX);SF=1,则(AX)>(BX)

5.求补指令NEG(Negate)P63

格式:

NEGDST;(DST)←0-(DST)

功能:

对目的操作数DST求补,用零减去目的操作数,结果送目的操作数。

目的操作数为通用寄存器、存储器操作数。

NEG指令影响标志位为OF,SF,ZF,AF,PF,CF

6.乘法指令P64

无符号数乘法指令MUL(Unsignedmultiple)

带符号数乘法指令IMUL(Signedmultiple)

无符号数乘法指令MUL(Unsignedmultiple)

格式:

MULSRC;字节操作数:

(AX)←(AL)×(SRC)

字操作数:

(DX:

AX)←(AX)×(SRC)

功能:

MUL为无符号数乘法指令。

源操作数为通用寄存器或存储器操作数。

目的操作数为AL或AX,乘积存AX或DX:

AX中

带符号数乘法指令IMUL(Signedmultiple)

格式:

IMULSRC;字节操作数:

(AX)←(AL)×(SRC)

字操作数:

(DX:

AX)←(AX)×(SRC)

功能:

IMUL为带符号数乘法指令,与MUL相同,但必须是带符号数。

积采用补码形式表示。

MUL,IMUL指令执行后,CF=OF=0,表示乘积高位无有效数据;CF=OF=1表示乘积高位含有效数据,对其它标志位无定义

【例】

MULBL;(AX)←(AL)×(SRC)不带符号

MULWORDPTR[SI]

IMULBYTEPTR[DI]

7.除法指令P64

无符号数除法指令DIV(Unsigneddivide)

带符号数除法指令IDIV(Signeddivide)

 

无符号数除法指令DIV(Unsigneddivide)

格式:

DIVSRC;

字节除法:

(AL)←(AX)/(SRC)商,(AH)←余数

字除法:

(AX)←(DX:

AX)/(SRC)商,(DX)←余数

功能:

DIV为无符号数除法。

源操作数作为除数,为通用寄存器或存储器操作数。

被除数为AX或(DX:

AX)

带符号数除法指令IDIV(Signeddivide)

格式:

IDIVSRC;

字节除法:

(AL)←(AX)/(SRC)商,(AH)←余数

字除法:

(AX)←(DX:

AX)/(SRC)商,(DX)←余数

功能:

IDIV为带符号数除法,与DIV相同,但必须是带符号数。

商和余数采用补码形

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1