微机原理与接口技术-第2章(2)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第2章微型计算机指令系统2.1指令的基本格式2.28086的寻址方式2.3指令执行时间2.48086指令系统2.5中断类指令及IBMPCDOS系统功能调用一、IBMPC(8086/8088)指令系统8086/8088指令系统可分为六组:数据传送指令(Datatransfar);算术指令(Arithmetic);逻辑指令(Logic);串处理指令(Stringmanipulation);控制转移指令(Controltransfar);处理机控制指令(Processorcontrol);二、数据传送指令分类名称格式功能OSZAPC基本传送指令MOVDST,SRC字、字节传送不影响进栈指令PUSHOPRD字压入堆栈不影响出栈指令POPOPRD字弹出堆栈不影响交换指令XCHGDST,SRC字、字节交换不影响有效地址送寄存器指令LEAREG,SRC有效地址寄存器不影响指针送寄存器及DS指令LDSREG,SRC地址指针寄存器,DS不影响指针送寄存器及ES指令LESREG,SRC地址指针寄存器,ES不影响输入指令INAL,PORT外设数据AL不影响输出指令OUTPORT,ALAL外设数据不影响换码指令XLATAL中数据转换不影响读取标志指令LAHFFlag低字节AH不影响设置标志指令SAHFAHFlag低字节ZAPC标志寄存器入栈指令PUSHF把Flag内容压入堆栈不影响标志寄存器出栈指令POPF把Flag内容弹出堆栈OSZAPC通用数据传送指令地址传送指令累加器专用指令标志寄存器传送指令1.通用数据传送指令(1)基本传送指令MOVDST,SRC源操作数——寄存器、存储器、立即数目的操作数——寄存器、存储器执行的操作:DSTSRC功能:将一个字节或一个字的操作数从源操作数复制至目的操作数。MOV指令最简单、最常用,用来赋初值,或传送数据,或对数据进行暂存等。rSSDIBPICPUINSTmCSr/segESAXDSImmr/rSPIMCXDXr/mSIseg/mmBX其中源操作数(src)和目的操作数(dst)均可采用多种寻址方式,其传送关系如图所示:SRMIMCS:IP不能直接改变由图可知MOV指令有6种格式:(1)CPU通用寄存器之间传送(r/r)MOVCL,AL;将AL中的8位数据传到CL(2)通用寄存器和段寄存器之间(r/SEG)MOVDS,AX;将AX中的16位数据传到DS(3)用寄存器和存储单元之间(r/M)MOVAL,[BX];将[BX]所指存储单元内容传到AL(4)段寄存器和存储单元之间(seg/M)MOVDS,[2000H];将2000H和2001H两存储单元内容传到DS(5)立即数到通用寄存器(r/Imm)MOVSP,2000H;将2000H送SP(6)立即数到存储单元(M/Imm)MOVWORDPTR[SI],4501H;将立即数4501H送(SI)所指的字单元注意:①MOV指令即可传送字节也可传送字,但应注意源操作数和目的操作数之间的类型匹配。例如:MOVAL,’E’;把立即数45H(字符E的ASCII码)送到AL寄存器。MOVAL,BL;8位寄存器BL中的数据传送给8位寄存器AL。MOVDS,BX;16位寄存器BX中的数据传送给16位寄存器DS。例:MOVES,AL;错MOVCL,4321H;错不匹配,源和目的操作数必须同为8位或是16位。②MOV指令的操作数中必用一个寄存器,不允许两存储单元之间传送数据MOV[2000H],[3000H];错例:MOVSI,3000HMOVAL,[SI]MOV[2000H],AL③在MOV指令当中,寄存器既可以作为源操作数,也可以作为目的操作数,但CS和IP这两个寄存器不能作为目的操作数,换句话说,这两个寄存器的值不能随意修改。例如:MOVCS,AX以及MOVIP,1000H是错误的。④立即数不能直接送段寄存器。另外也不允许在两个段寄存器之间直接传送信息。例如:MOVAX,1000HMOVDS,AX段地址必须通过寄存器如AX寄存器送到DS寄存器。例:MOVDS,ES;错应该这样:MOVAX,ESMOVDS,AX⑤不允许用立即数作目的操作数MOV2000H,AL;错⑥用BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时,默认的段寄存器为SS。比如:MOVWORDPTR[BP],1000H;WORDPTR为伪指令意指字单元。MOVWORDPTR[BX],2000H;设(DS)=3000H,(SS)=4000H,(BX)=5000H,(BP)=6000H,则前一条指令将立即数1000H送到物理地址为46000H和46001H的两单元中,后一条指令将立即数2000H送到物理地址为35000H和35001H的两单元中。⑦所有的MOV传送指令都不能改变标志。例1:把地址为AREA1(段内偏移量)的存储单元的内容,传送至同一段内的地址为AREA2的存储单元中。AREA1AREA265F3020024E00500MovAREA2,AREA1MovAL,AREA1MovAREA2,AL例2:若要传送的不是一个字节,而是一个数据块,(例如内有100个字节),如何实现?movsi,offsetarea1movdi,offsetarea2movcx,100Again:moval,[si];mov[di],alincsiincdideccxjnzagainint3AREA1AREA265F302……0500100=Leasi,area2堆栈堆栈是一个按照后进先出(LIFO—LastInFirstOut)原则组织的一段内存区域。在子程序调用和中断处理时,分别要保存返回地址和断点地址,在进入子程序和中断服务程序后,还通常需要保护通用寄存器原先的内容,子程序返回或中断处理返回主程序前,则要恢复通用寄存器原先的内容,并分别将返回地址或断点地址恢复到指令指针寄存器中。这些功能都要通过堆栈来实现。另外,在高级语言中除中断及子程序调用外,参数的传递也是靠堆栈来实现的。除返回地址和断点地址的保护及恢复的操作是由CPU自动完成的以外,寄存器的保存、恢复以及参数的传递都需要由堆栈指令来完成。堆栈的一端是固定的,称为栈底;另一端是浮动的,称为栈顶。当堆栈中没有数据时,栈顶与栈底重合。当数据进栈时,栈顶会自动地向地址减1的方向浮动;而当数据出栈时,栈顶又会自动地向地址增1的方向变化。一般把堆栈中的数据称为元素,最后进栈的那个元素所在地址就是栈顶。由于堆栈元素的存入和取出必须遵循LIFO的原则,因此堆栈的操作总是对栈顶进行的。为了指示栈顶地址,所以要设置堆栈指示器ss:SP(StackPointer),ss:SP的内容就是堆栈栈顶的存储单元地址。数据写入堆栈称为压入堆栈(PUSH),也叫入栈。数据从堆栈中读出称之为弹出堆栈(POP),也叫出栈。先入栈的数据由于存放在栈的底部,因此后出栈;而后入栈的数据存放在栈的顶部,因此先出栈。微型计算机多在主存储器中开辟堆栈。这种堆栈称之为外堆栈。外堆栈的主要优点是堆栈容量大,可以认为堆栈空间是无限的,因此能实现无限制的中断嵌套和子程序嵌套。但外堆栈的操作速度较慢。另一类堆栈称之为内堆栈,所谓内堆栈就是在CPU芯片的寄存器中开辟堆栈。MCS-51的堆栈就是开辟在内部RAM中。内堆栈的主要优点是操作速度快,但堆栈容量有限。此外,由于堆栈的占用,也会减少内部RAM的用户可利用单元堆栈的使用有两种方式。一种是自动方式,即在调用子程序或中断时,返回地址(断点)自动进栈。程序返回时,断点再自动弹回PC。这种堆栈操作无需用户干预,因此称为自动方式。另一种是指令方式,即使用专用的堆栈操作指令,进行进出栈操作。其进栈指令为PUSH,出栈指令为POP。例如现场保护就是一系列指令方式的进栈操作;而现场恢复则是一系列指令方式的出栈操作。(2)栈操作指令PUSHOPRDPOPOPRD堆栈——按照先进后出的原则组织的一段内存区域。8088中规定堆栈设置在堆栈段(SS段)内,堆栈指针SP的初值决定了堆栈的大小。SP始终指向堆栈的顶部,即始终指向最后推入堆栈的信息所在的单元。操作数:16位通用寄存器;段寄存器;16位内存操作数(除立即数之外的任何寻址方式)。00000SS:0000SS:SP堆栈段1入栈指令PUSH指令格式为:PUSHSRCSRC为源操作数,可以是除立即数之外的16位的寄存器或者内存字单元的内容(两个字节)。功能:将源操作数中的一个字推入(也称压入)堆栈,其堆栈指针SP的值始终指向刚刚入栈的数据处,每进一个字后,栈顶指针SP的值减2。PUSH的操作如下:①SP←(SP)-1②SRCH→(SP)③SP←(SP)-1④SRCL→(SP)设(AX)=2107H,(SP)=0064H,执行PUSHAX指令后堆栈的情况如图所示。堆栈段中0063H单元内容为21H,0062H单元内容为07H,(SP)=0062H。出栈指令POP指令格示为:POPDSTDST是目的操作数。功能:将SP所指的堆栈顶处的一个字取出(也称弹出)送至目的DST中,并且SP的值加2。POP的操作如下:①((SP))→DSTL②SP←(SP)+1③((SP))→DSTH④SP←(SP)+1N如果在上图的情况下执行POPAX指令的情况如图所示。(AL)=07H,(AH)=21H,(SP)=0064H,指令执行后方式:(1)CPU通用寄存器入/出栈,如:PUSHAXPOPBX(2)段寄存器入/出栈,如PUSHCSPOPDS(3)存储单元入/出栈PUSH[BX+DI]POP[2000H]入栈和出栈指令性用于程序保存和恢复数据,或用于转子或中断时保护现场和恢复现场。其主要注意:(1)堆栈操作指令中,有一个操作数是隐含了的,这个操作数就是(SP)指示的栈顶存储单元;(2)8086堆栈都是字操作,也就是说,没有PUSHAH,POPBL这样的字节操作指令。(3)堆栈操作指令可以使用除立即数以外的其他寻址方式。(4)CS寄存器可以入栈,但不能随意弹出一个数据到CS(5)每执行一条指令,(SP)自动增减2(6)在使用堆栈指令时,要按“先进后出”原则来编写程序(7)堆栈指令不影响标志位。堆栈在计算机工作中起着重要的作用,如果在程序中要用到某些寄存器,但它的内容却在将来还有用,这时就可以用堆栈把它们保存下来,然后到必要时再恢复其原始内容。例如:PUSHAXPUSHBX┇其间程序用到AX和BX寄存器┆POPBXPOPAX堆栈在子程序结构的程序以及中断程序中也很有用,这将在以后加以说明。(3)交换指令XCHGOPRD1,OPRD2源操作数:寄存器、存储器目的操作数:寄存器、存储器执行的操作:OPRD1OPRD2功能:把操作数OPR1和OPR2中的一个字或一个字节的数据进行交换。可在寄存器之间、寄存器与存储器之间进行交换,但不允许在两个存储单元之间执行交换过程,并且段寄存器和IP寄存器既不能作为OPR1,也不能作为OPR2。且指令的执行不影响标志位。例:XCHGBX,[BP+SI](BX)=6F30H(BP)=0200H(SI)=0046H(SS)=2F00H(2F246H)=1234H结果:(BX)=1234H(2F246H)=6F30H例如:XCHGAL,BL;(AL)与(BL)间进行字节交换XCHG[2200H],DX;(DX)与(2200H)、(2201H)两单元间的字交换(数据段)XCHGBX,CX;BX和CX之间进行字交换使用时注意:(1)OPR1和OPR2不能同时为存储器操作数;(2)任一个操作数都不能使用段寄存器,也不能使用立即数。用来对寻址机构进行控制的指令。指令传送到16位目标寄存器中的是存储器操作数的地址,而不是它的内容。1.地址传送指令LEA,LDS,LES把地址传送到指定寄存器。(1)LEA——有效地址送寄存器。LEAREG,SRC(REG)(SRC)目的操作数源操作数(16位通用寄存器)(内存操作数)•该地址常用来设置一个16位的寄存器作为地址指针;•该指令的执行效果与movreg,offs

1 / 317
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功