第4章 指令系统二Word格式文档下载.docx
《第4章 指令系统二Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第4章 指令系统二Word格式文档下载.docx(30页珍藏版)》请在冰豆网上搜索。
![第4章 指令系统二Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/24/fbba1fbb-dc1c-435f-966b-86bd81dc4b3f/fbba1fbb-dc1c-435f-966b-86bd81dc4b3f1.gif)
”之前的段寄存器指明了操作数所在段。
例4.2.1:
有指令如下:
(1)MOVAX,DS:
[BP]
(2)MOVBX,ES:
[BX]
(3)MOVCX,SS:
[SI](4)MOVDX,SS:
[DI]
则,它们所对应的物理地址为:
(1)PA=16D*(DS)+(BP)
(2)PA=16D*(ES)+(BX)
(3)PA=16D*(SS)+(SI)(4)PA=16D*(SS)+(DI)
如没有段前缀(DS:
、ES:
、SS:
),则它们所对应的默认的物理地址为:
(1)PA=16D*(SS)+(BP)
(2)PA=16D*(DS)+(BX)
(3)PA=16D*(DS)+(SI)(4)PA=16D*(DS)+(DI)
最后需要说明的是:
无论是段默认状态,还是跨段情况,操作数的物理地址PA均由系统自动计算。
所以,在实际应用中,当要访问某段之中某一存储单元时,着重考虑的不是其物理地址的计算方法及结果,而是其类型及偏移地址的表示形式。
因此,从本章之后,我们谈到的存储单元地址均是指偏移地址。
4.2.2寻址的综合举例
例4.2.2:
请回答如下程序执行到EXIT时,字节单元A、B、C、C+1、C+2中的内容各是什么?
STACKSEGMENTSTACK
DB200DUP(0)
STACKENDS
DATASEGMENT
ADB0
BDB0
CDB30,40,50
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOV
AL,C
A,
AL
AL,C+1
AL,C+2
B,
ADD
C,
10
C+1,20
C+2,30
EXIT:
MOV
AH,
4CH
INT
21H
CODE
ENDS
END
START
说明:
DB为数据定义伪指令。
其使用格式为:
[变量名]DB表达式[…]
定义一个以变量名为首地址的字节数据存储区,所含数据存储单元的个数由其后表达式的个数决定,并为各数据存储单元提供一个由其对应表达式得出的初值。
图4-10数据段中的数据
图4-11程序运行到EXIT时,运行结果
在主存中的存放形式示意图
在主存中的存放形式示意图
在本程序数据段中,三次利用伪指令DB定义了三个字节数据存储区,第一个首地址为变量A,它只包含一个字节单元,初值为0;
第二个首地址为变量B,它只包含一个初值为0的字节单元;
第三个首地址为变量C,包含三个字节单元,其初值分别为30、40、50。
它们在主存中存放的形式如图4-10所示。
当程序从START执行到EXIT时,各字节变量的内容和存放形式如图4-11所示。
即(A)=70,(B)=90,(C)=40,(C+1)=60,(C+2)=80
4.38086/8088指令系统
4.3.1数据传送指令
我们已经知道计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令集提供给用户使用,这组指令集就称为计算机的指令系统。
目前,一般小型或微型计算机的指令系统可以包括几十种或百余种指令。
我们已经知道,计算机只能识别二进制代码,所以机器指令是由二进制代码组成的。
为便于人们使用而采用汇编语言来编写程序。
汇编语言是一种符号语言,它的助记符来表示操作码,用符号或符号地址来表示操作数或操作数地址,它与机器语言是一一对应的。
8086的指令系统可以分为6组:
(1)数据传送指令;
(2)串处理指令;
(3)算术指令;
(4)控制转移指令;
(5)逻辑指令;
(6)处理机控制指令。
下面分别加以说明。
数据传送指令负责把数据、地址或立即数传送到寄存器或存储单元中。
它可以分为四种,分别说明如下:
1.通用数据传送指令
(1)MOV(Move)传送指令
格式为:
MOVDST,SRC
执行操作:
(DST)(SRC)
其中DST表示目的操作数,SRC表示源操作数。
MOV指令的机器语言可以有如下7种格式:
1)MOVmem/reg1,mem/reg2
当然,双操作数指令不允许两个操作数多使用寄存器,因而两个操作数中必须有一个是寄存器。
这种方式不允许指定段寄存器。
2)MOVreg,data
当然,这种方式也不允许指定段寄存器。
3)MOVac,mem
其中ac为累加器,D给出存储单元的偏移地址。
4)MOVmem,ac
5)MOVsegreg,mem/reg
其中reg指定段寄存器,但不允许使用CS寄存器。
此外,这条指令执行完后不影响中断,要等下一条指令执行完后才可能响应中断。
6)MOVmem/reg,segreg
7)MOVmem/reg,data
这种方式的目的操作数只用存储器寻址方式而不用寄存器方式。
以上七种方式说明MOV命令可以在CPU和存储器之间传送字或字节,它传送的信息可以从寄存器到寄存器,立即数到寄存器,立即数到存储单元,从存储单元到寄存器,从寄存器到存储单元,从寄存器或存储单元到除CS外的段寄存器(注意,立即数不能直接送段寄存器),从段寄存器到寄存器或存储单元。
但是MOV指令的目的操作数不允许用立即数方式,也不允许用CS寄存器,而且除源操作数为立即数的情况外,两个操作数中必须有一个是寄存器。
也就是说,不允许用MOV指令在两个存储单元之间直接传送数据。
此外,也不允许在两个段寄存器之间直接传送信息。
还应该注意的是MOV指令不影响标志位。
(2)PUSH(Popontothestack)进栈指令
PUSHSRC
(SP)<
--(SP)-2
((SP)+1,(SP))<
--(SRC)
(3)POP(Popfromthestack)出栈指令
POPDST
(DST)<
--((SP)+1,(SP))
(SP)<
--(SP)+2
这两条堆栈的进栈和出栈指令。
堆栈是以“后进先出”方式工作的一个存储区,它必须存在于堆栈段中,因而此段地址存放于SS寄存器中。
它只有一个出入口,所以只有一个堆栈指针寄存器SP,SP的内容在任何时候都指向当前的栈顶,所以PUSH和POP指令都必须根据当前SP的内容来确定进栈或是出栈的存储单元,而且必须及时修改指针,以保证(SP)指向当前的栈顶。
堆栈的存取必须以字为单位,所以PUSH和POP指令只能作字操作。
它们可以使用除立即数以外的其他寻址方式。
指令也可以指定段寄存器作为操作数,但POP指令不允许用CS寄存器。
这两条堆栈指令不影响标志位。
例4.3.3:
PUSHAX
堆栈在计算机工作中起着重要的作用,如果在程序中要用到某些寄存器,但它的内容却在将来还有用,这时就可以用堆栈把它们保下来,然后到必要时再恢复其原来的内容。
例如:
PUSHAX
PUSHBX
…
其间程序用到AX和BX寄存器
…
POPBX
POPAX
堆栈在子程序结构的程序及中断程序中也很有用,这将在以后加以说明。
(4)XCHG(Exchange)交换指令
格式为:
XCHGOPR1,OPR2
(OPR1)<
-->
(OPR2)
其中OPR表示操作数。
该指令的两个操作数中必须有一个在寄存器中,因而它可以在寄存器之间或者在寄存器和存储器之间交换信息,但不允许使用段寄存器。
指令允许字或字节操作,且不影响标志位。
2.累加器专用传送指令
这组指令只限于使用累加器AX或AL传送信息,不影响标志位。
(1)IN(Input)输入指令
长格式为:
INAL,PORT(字节操作)
INAX,PORT(字操作)
执行的操作:
(AL)<
--(PORT)(字节操作)
(AX)<
--(PORT+1,PORT)(字操作)
短格式为:
INAL,DX(字节操作)
INAX,DX(字操作)
--((DX))(字节操作)
--((DX)+1,(DX))(字操作)
(2)OUT(Output)输出指令
OUTPORT,AL(字节操作)
OUTPORT,AX(字操作)
(POTR)<
--AL(字节操作)
(PORT+1,PORT)<
--(AX)(字操作)
OUTDX,AL(字节操作)
OUTDX,AX(字操作)
((DX))<
((DX)+1,(DX))<
在IBMPC机里,所有I/O端口与CPU之间的通信都由IN和OUT指令来完成。
其中IN完成从I/O到CPU的信息传送,而OUT完成从CPU到I/O的信息传送。
CPU只能用累加器(AL或AX)接收或发送信息。
外部设备最多可有65536个I/O端口,端口号(即外设的端口地址)为0000~FFFFH。
其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号。
所以用长格式时可以在指令中直接指定端口号,但只限于外设的前256个端口。
当端口号≥256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000~FFFFH),然后再用IN或OUT指令来传送信息,必须注意。
这里的端口号或DX的内容均为地址,而传送的是端口中的信息,而且在用短格式时DX的内容就是端口号本身,不需要由任何段寄存器来修改它的值。
输入,输出指令不影响标志位。
(3)XLAT(Translate)换码指令
XLATOPR
或XLAT
--((BX)+(AL))
3.地址传送指令
(1)LEA(Loadeffectiveaddres)有效地址送寄存器指令
LEAREG,SRC
(REG)<
--SRC
指令把源操作数的有效地址送到指定的寄存器中。
(2)LDS(LoadDSwithPointer)指针送寄存器和DS指令
LDSREG,SRC
(REG)<
(DS)<
--(SRC+2)
把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中。
该指令常指定SI寄存器。
(3)LES(LoadESwithPointer)指针送寄存器和ES指令
LESREG,SRC
--(SRC)
(ES)<
--(SRC+2)
把源操作数指定的4个相继字节送到由指令指定寄存器及ES寄存器中。
该指令常指定DI寄存器。
以上三条指令指定的寄存器不能使用段寄存器,且源操作数必须使用除立即数方式及寄存器方式以外的其它寻址方式。
这些指令不影响标志位。
本组指令把变量的偏移地址(LEA)或段地址和偏移地址(LDS和LES)送给寄存器,以提供访问变量的工具。
例4.3.7:
LEABX,[BX+SI+0F62H]
如指令执行前:
(BX)=0400H,(SI)=003CH
则指令执行后:
(BX)=0400+003C+0F62=139EH
必须注意。
在这里BX寄存器得到的是偏移地址而不是该存储单元的内容
4.3.2算术运算指令
1.加法指令
(1)ADD(add)加法
格式:
ADDDST,SRC
--(SRC)+(DST)
(2)ADC(addwithcarry)带进位加法
ADCDST,SRC
--(SRC)+(DST)+CF
其中CF为进位位的值
(3)INC(increment)加1
INCOPR
执行的操作:
(OPR)<
--(OPR)+1
2.减法指令
(1)SUB(subtract)减法
格式:
SUBDST,SRC
(DST)ß
(DST)-(SRC)
(2)SBB(subtractwithborrow)带借位减法
SBBDST,SRC
(DST)-(SRC)-CF
(3)DEC(decrement)减1
DECOPR
(OPR)ß
(OPR)-1
(4)NEG(negate)求补
NEGOPR
-(OPR)
(5)CMP(compare)比较
CMPOPR1,OPR2
(OPR1)-(OPR2)
3.乘法指令
(1)MUL(UnsignedMultiple)无符号数乘法指令
MULSRC
字节操作数:
(AX)ß
(AL)×
(SRC)
字操作数:
(DX,AX)ß
(AX)×
(2)IMUL(SignedMultiple)带符号数乘法指令
IMULSRC
与MUL相同,但必须是带符号数,而MUL是无符号数。
在乘法指令里,目的操作数必须是累加器,字运算为AX,字节运算为AL。
两个8位数相乘得到的是16位乘积存放在AX中,两个16位数相乘得到的是32位乘积,存放在DX,AX中,其中DX存放高位字,AX存放低位字。
指令中的源操作数可以使用除立即数方式以外的任何一种寻址方式。
乘法指令对除CF和OF以外的条件码位无定义(注意:
无定义的意义和不影响不同,无定义是指指令执行后这些条件码位的状态不定,而不影响则是指该指令的结果并不影响条件码,因而条件码应保持原状态不变。
),对于MUL指令,如果乘积的高一半为0,即字节操作的(AH)或字操作的(DX)为0,则CF和OF均为0;
否则(即字节操作时的(AH)≠0或字操作时的(DX)≠0)CF和OF均为1。
这样的条件码设置可以检查字节相乘的结果是字节还是字,或者可以检查字相乘的结果是字还是双字。
对于IMUL指令,如果乘积的高一半是低一半的符号扩展则CF和OF均为0,否则就均为1。
例4.3.11:
如(AL)=0B4H,(BL)=11H求执行指令
IMULBL和MULBL后的乘积值。
(AL)=0B4H为无符号数的180D,带符号数的-76D,(BL)=11H为无符号数的17D,执行IMULBL的结果为:
(AX)=0FAF4H=-1292D;
CF=OF=1
执行的MULBL的结果为:
(AX)=0BF4H=3060D;
4.除法指令
(1)DIV(Unsigneddivide)无符号数除法指令
格式为:
DIVSRC
1)字节操作:
16位被除数在AX中,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中。
表示为:
(AL)ß
(AX)/(SRC)的商;
(AH)ß
(AX)/(SRC)的余数
2)字操作:
32位被除数在DX,AX中,其中DX为高位字;
16位除数为源操作数,结果的16位商在AX中,16位余数在DX中。
(AX)ß
(DX,AX)/(SRC)的商;
(DX)ß
(DX,AX)/(SRC)的余数
商和余数均为无符号数。
(2)IDIV(Signeddivide)带符号除法指令
IDIVSRC
与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号和被除数的符号相同。
除法指令的寻址方式和乘法指令相同。
其目的操作数必须存放在AX或DX,AX中。
而其源操作数可以用除立即数以外的任何一种寻址方式。
除法指令对所有条件码位均无定义。
由于除法指令的字节操作要求被除数为16位,字操作要求被除数为32位,因而往往需要用符号扩展的方法取得除法指令所需要的被除数格式,为此我们介绍两条符号扩展指令如下:
(3)CBW(Convertbytetoword)字节转换为字指令
CWB
AL的内容符号扩展到AH。
即如(AL)的最高有效位为0,则(AH)=00;
如(AL)的最高有效位为1,则(AH)=0FFH。
(4)CWD(Convertwordtodoubleword)字转换为字节指令
CWD
AX的内容符号扩展到DX。
即如(AX)的最高有效位为0,则(DX)=0000;
如(AX)的最高有效位为1,则(DX)=0FFFFH。
这两条指令都不影响条件码。
5.十进制调整指令
前面提到的所有算术运算指令都是二进制数的运算指令,但是人们最常用的是十进制数,这样,当用计算机进行计算时,必须先把十进制数转换成二进制数,然后再进行二进制数的计算,计算结果又转换成十进制数输出。
为了便于十进制数的计算,计算机还提供了一组十进制数调整指令,这组指令在二进制计算的基础上,给予十进制调整,可以直接得到十进制的结果。
在说明这组指令之前,我们首先介绍计算机中常用的表示十进制数的BCD码。
在IBMPC机里,表示十进制数的BCD码可以用压缩的BCD码和非压缩的BCD码两种格式来表示。
压缩的BCD码(packedBCDformat)用4位二进制数表示一个十进制数位,整个十进制数形式为一个顺序的以4位为一组的数串。
例如,9503d应表示为:
1001010100000010。
非压缩的BCD码(unpackedBCDformat)则以8位为一组表示一个十进制数位,8位中的低4位表示8421的BCD码,而高4位则没有意义。
例如,9502d则表示为:
uuuu1001uuuu0101uuuu0000uuuu0010。
可以看出数字的ASCII码是一种非压缩的BCD码。
因为数字的ACSII的高4位值为0011而低4位是以8421码表示的十进制数位,这符合非压缩BCD码高4位无意义的规定。
IBMPC机的十进制调整指令分为两组,下面分别加以说明:
(1)压缩的BCD码调整指令
1)DAA(decimaladjustforaddifion)加法的十进制调整指令
--把AL中的和调整到压缩的BCD码格式,这条指令之前必须执行ADD或ADC指令,加法指令必须把两个压缩的BCD码相加,并把结果保存AL寄存器中。
本指令的调整方法是:
如果AF标志(辅助进位位)为1,或者AL寄存器的低4位是十六进制的A~F,则AL寄存器内容加06H,且将AF置1;
如果CF标志为1,或者AL寄存器的高4位是十六进制的A~F,则AL寄存器内容加60H,并将CF位置1。
DAA指令对标志无定义,但影响所有其它条件标志。
2)DAS(decimaladjustforsubtraction)减法的十进制调整指令
(AL)把AL中的差调整到压缩的BCD格式。
这条指令之前必须执行SUB和SBB指令,减法指令必须把两个BCD码相减,并把结果存放在AL寄存器中。
如果AF标志为1,或者AL寄存器的低4位是十六进制的A~F,则使AL寄存器的内容减去06H,且将AF置1;
如果CF标志为1,或者AL寄存器的高4位是十六进制的A~F,则AL寄存器的内容减去60H,并将CF位置1。
DAS指令对OF标志无定义,但影响所有其它条件标志。
(2)非压缩的BCD码调整指令
1)AAA(ASCIIadjustforaddition)加法的ASCII调整指令
2)AAS(ASCIIadjustforsubtraction)减法的ASCII调整指令
3)AAM(ASCIIadjustformultiplication)乘法的ASCII调整指令
4)AAD(ASCIIadjustfordivision)除法的ASCII调整指令
这里我们不再详细叙述。
4.3.3逻辑指令
1.逻辑运算指令
逻辑运算指令可以对字或字节执行逻辑运算。
由于逻辑运算是按位操作的,因此一般说来,其操作数应该是位串而不是数。
(1)AND(and)逻辑与指令
ORDST,SRC
(DST)←(DST)∧(SRC)