1、微机控制课件 42011-10-27第二章 微机原理及其工艺过程控制应用第1节 86系列微处理器结构第2节 86系列微型计算机的指令系统指令是让计算机完成某种操作的命令,指令的集合称作指令系统,2.1 86系列汇编语言指令语句格式86系列汇编语言指令语句格式如图27所示。图中由前向后的箭头表示是可选项,由后向前的箭头表示是重复项,回头方框表示是语句中的关键字。图2-7 86系列汇编语言指令语句格式例如: AA: MOV AX,BX; 将寄存器BX内容送到寄存器AX之中 标号 助记符 操作数 注释 图2-8 86系列的操作数寻址方式例21 设BX0158H,DI10A5H,位移量1B57H,DS
2、2100H,假定没有使用段前缀,即把DS作为操作数对应的段寄存器。在各种寻址方式下,这些寄存器和位移量所产生的有效地址和物理地址为:(1)直接寻址: 有效地址1B57H 物理地址21000H十1B57H22B57H(2)寄存器间接寻址(寄存器为BX): 有效地址0158H 物理地址21000H十0158H21158H (3) BX寄存器相对间接寻址: 有效地址0158H十1B57H1CAFH 物理地址21000H十1CAFH22CAFH (4)变址寻址(寄存器为DI): 有效地址l0A5H 物理地址21000H十10A5H220A5H(5)DI寄存器相对变址寻址: 有效地址10A5H十lB57
3、H2BFCH 物理地址21000H十2BFCH23BFCH(6)基址加变址的寻址(BX为基址寄存器,DI为变址寄存器): 有效地址0158H十10A5H11FDH 物理地址21000H十llFDH221FDH(7)相对的基址加变址的寻址(BX为基址寄存器,DI为变址寄存器) 有效地址0158H十l0A5H十1B57H2D54H 物理地址21000H十2D54H23D54H*指令系统:传送类指令、算术运算类指令、逻辑运算和移位指令、串操作指令、控制指令23 传送类指令传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换等场合。此处我们把这类指令分为4种,并把各
4、种指令操作码助记符和对应的操作数列表所示。表2-3 传送类指令指令类型指令格式指令功能状态标志位备注O S Z A P C通用数据传送MOV 目标,源PUSH 源POP 目标XCHG 目标,源XLAT传送字节或字字压入堆栈字弹出堆栈交换字节或字字节翻译- - - - - - - - - - - - - - - - - - - - - -源:寄存器、存储器、立即数目标:寄存器、存储器源:寄存器、存储器目标:寄存器(CS除外)、存储器源:通用寄存器、存储器目标:通用寄存器、存储器目标地址传送LEA 目标,源LDS 目标,源LES 目标,源装入有效地址装入数据段指针到DS装入附加段指针到ES- -
5、- - - - - - - - - - - - - -源:内存操作数目标:16位通用寄存器标志位传送LAHFSAHFPUSHFPOPF把FR低字节装入AH把AH内容装入FR低字节把FR内容压入堆栈从堆栈弹出FR内容- - - - - - - - - - - - I/O数据传送IN 累加器,端口OUT 端口,累加器输入字节或字输出字节或字- - - - - - - - - - -累加器:AL或AX端口:地址0255或间址寄存器DX说明:运算结果影响标志位,- 运算结果不影响标志位。1传送类指令 (1)通用数据传送指令通用传送指令中包括最基本的传送指令MOV,堆栈指令PUSH和POP,数据交换指令
6、XCHG。MOV指令是形式最简单、用的最多的指令。它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或者内存单元。例如: MOV AL,BL ;BL中的8位数据送AL MOV ES,DX ;DX中16位数据送ES MOV AX, BX ;BX和BX十1所指的两个内存单元的内容送AX MOV DI,AX ;累加器的内容送DI和Dl十1所指的两个单元 MOV CX,1000 ;将1000和1001两单元的内容送CX MOV BL,40 ;立即数40送BL MOV DX,5040 ; 立即数5040送DX MOV WORD PTRSI,60
7、70 ;立即数6070送到SI和SI十1所指的两个单元 ;这里的PTR是一个汇编操作符,与前面的WORD ;一起,标明往SI地址中写一个字,而不是一个节*(2)堆栈操作指令在子程序调用和中断处理过程时,分别要保存返回地址和断点地址,在进入子程序和中断处理后,还需要保留通用寄存器的值;子程序返回和中断处理返回时,则要恢复通用寄存器的值,并分别将返回的地址或断点地址恢复到指令指针寄存器中。这些操作都要通过堆栈来操作,其中寄存器的保存和恢复需要有堆栈指令来完成。8086/8088的堆栈操作遵循“先进后出”原则。例: 保存和恢复DS,ES内容的指令如下PUSH DSPUSH ESPOP ESPOP D
8、S与上比较:PUSH DSPUSH ESPOP DSPOP ES结果有何不同?*(3)交换指令交换指令XCHG可以实现字节交换,也可以实现字交换。交换过程可以在CPU的内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行,但不能在两个存储之间执行数据交换过程。例如:XCHG AL,BL ;AL和BL之间进行字节交换XCHG BX,CX ;BX和CX之间进行字节交换XCHG 2503,CX ;CX中的内容和2530,2531两单元的内容交换*(4)换码指令 XLAT是一条完成字节翻译功能的指令,称为换码指令。它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。使用换
9、码指令时,要求BX寄存器指向表的首地址,AL中为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。XLAT指令是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。例如,将十进制数字(09)翻译成7段显示码的译码表顺序存放在内存中,假设这段数据存放的偏移地址首址为2000H,取出“6”所对应的7段码,该过程可用如下几条程序实现:MOV BX,2000HMOV AL,3XLAT*2目标地址传送指令 这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏
10、移地址,共包含以下3条指令:(1)取有效地址指令取有效地址指令LEA的功能是将存储器地址送到一个寄存器。LEA指令要求源操作数必须为内存单元地址,目的操作数必须为一个16位的通用寄存器。这条指令常用来使一个寄存器作为地址指针。例如:LEA AX,2728 ;将2728单元的偏移量送AX,指令执行后,AX中为2728LEA BX,BPSI ;指令执行后,BX中的内容为BPSI的值LEA SP,0482 ;使堆栈指针SP为482*(2)将地址指针装到DS和另一个寄存器的指令LDS指令的功能是把4个字节的地址指针(其中包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地
11、址一定送到DS中。比如,设2l30H一2133H这4个单元中存放着一个地址,2130H和2131H中为地址的偏移量,2132H和2133H中为地址的段值,执行指令:LDS DI,2130H该指令功能是:2130H和2131H中的偏移量送到DI,2132H和2133H中的段值送到DS。*88(3)将地址指针装到ES和另一个寄存器的指令 LES指令与LDS指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。3标志位传送指令可完成标志位传送的指令共有4条:(1)读取标志指令读取标志指令LAHF被执行时,将标志寄存器中的低8位传送到A
12、H中,如图29所示。图2-9 LAHF指令的功能(2)设置标志指令设置标志指令SAHF被执行时,将AH寄存器的相应位传送到标志寄存器的低8位。用图表示,就是将图2-9的5个箭头方向反过来。(3)对标志寄存器的压入堆栈指令和弹出堆栈指令 PUSHF指令将标志寄存器的值压入堆栈顶部,同时,堆栈指针SP的值减2。此指令在执行时标志寄存器的值不变。POPF指令的功能正好相反,此指令在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针SP的值加2。PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。4输入输出数据传送指令输入输出指令用来完成累加器(AX
13、AL)与IO端口之间的数据传送功能。执行输入指令时,CPU可以从一个8位端口读入一个字节到AL中,也可以从两个连续的8位端口读一个字到AX中。执行输出指令时,CPU可以将AL中的个字节写到一个8位端口中,或者将AX中的一个字写到两个连续的8位端口中。例如:IN AL,50H ;将50H端口的字节读入ALIN AX,70H ;将70、71端口的值读入AX, 将70H端口的内容读入AL,71H端口的内容读入AHIN AL,DX ;从DX所指的端口中读取一个字节OUT 44H,AL ;将AL中的一个字节输出到44H端口。OUT 80H,AX ;将AL中的内容输出到80H,AH中的内容输出到81HOU
14、T DX,AL ;将AL中的内容输出到DX所指的端口中OUT DX,AX ;将AL中的内容输出到DX所指的端口中;AH中的内容输出到DX1所指的端口中*2.2.4 算术运算类指令86系列CPU指令系统中,具有完备的加,减,乘,除算术运算指令,可处理不带符号或带符号的8/16位二进制整数,以及不带符号的装配型/拆开型十进制整数。表2-4给出了86系列指令系统中算术运算类指令。表2-4 算术运算类指令指令类型指令格式指令功能状态标志位备注O S Z A P C加法ADD 目标,源ADC 目标,源INC 目标加法(字节/字)带进位加法(字节/字)加1(字节/字) -源:通用寄存器、存储器、立即数目标
15、:通用寄存器、存储器源:通用寄存器、存储器、立即数目标:通用寄存器、存储器目标:通用寄存器、存储器减法SUB 目标,源SBB 目标,源DEC 目标NEG 目标CMP 目标,源减法(字节/字)带借位减法(字节/字)减1(字节/字)取补比较 - 1 源:通用寄存器、存储器、立即数目标:通用寄存器、存储器源:通用寄存器、存储器、立即数目标:通用寄存器、存储器目标:通用寄存器、存储器目标:通用寄存器、存储器源:通用寄存器、存储器、立即数目标:通用寄存器、存储器乘法MUL 源IMUL 源无符号乘法(字节/字)有符号乘法(字节/字) * * * * * * * * 源:通用寄存器、存储器源:通用寄存器、存
16、储器除法DIV 源IDIV 源CBWCWD无符号除法(字节/字)有符号除法(字节/字)字节转换成字字转换成双字* * * * * * * * * * *- - - - - - - - - - -源:通用寄存器、存储器源:通用寄存器、存储器十进制调整AAADAAAASDASAAMAAD加法的ASCII码调整加法的十进制调整减法的ASCII码调整减法的十进制调整乘法的ASCII码调整除法的ASCII码调整* * * * 1* * * * * 1* * * * - *说明:运算结果影响标志位,- 运算结果不影响标志位,*标志位为任意值,“1”将标志位置11加法指令 (1)不带进位位的加法指令ADD用
17、来执行两个字或两个字节的相加操作,结果放在原来存放目的操作数的地方。例如: ADD AL,50H ;AL和50H相加,结果放在AL中 ADD CX,l000H ;CX中的内容和1000H相加,结果放在CX中 ADD DI,SI ;DI和SI的内容相加,结果放在DI中 ADD BXDI,AX ;BX十DI和BX十DI十1两个存储单元的内容和AX中的内容相加,;结果放在BXDI和BXDI1所指的存储单元中 ADD AX,BX2000H ;BX2000H和BX2001H所指的两单元的内容和AX的内容相加,;结果放在AX中(2)带进位位的加法指令ADC在形式上和功能上都和ADD指令类似,只有一点区别,
18、就是ADC指令被执行时,将进位标志CF的值加在和中。例如: ADC AX,SI ;AX和SI中的内容以及CF的值相加,结果放在AX中ADC指令为实现多字节的加法运算提供了方便。【例子】有两个4字节的无符号数相加,这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后,要求进行运算后,得到的和放在2000H开始的内存单元中。可以用如下程序段实现这种多字节的加法:CLC ;清进位位CFMOV SI,2000H ;取第一个数的首地址MOV AX,SI ;将第一个数的低16位取到AXMOV DI,3000H ;取第二个数的首地址ADD AX,DI ;第一个数和第二个数的低16位相加
19、MOV SI,AX ;低16位相加的结果送到2000H,200lH单元MOV AX,SI2 ;取第一个数的高16位送到AX中ADC AX,DI2 ;两个数的高16位连同进位位相加MOV SI2,AX ;高16位相加的结果送到2002H、2003H单元(3)增量指令INC只有1个操作数,指令在执行时,将操作救的内容加1,再送回该操作数。这条指令一般用在循环程序中修改指针和循环次数。例如:INC AL ;将AL中的内容加1INC CX ;将CX中的内容加IINC BYTE PTRBXDI500 ;将BX十DI十500所指的存储单元的内容加1在编程中要注意,INC指令不影响进位标志CF的状态。2减法
20、指令 (1)不带借位的减法指令SUB完成两个字节或两个字的相减。例如:SUB BX,CX ;将BX中的内容减去CX中的内容。结果放在BX中SUB BP2,CL ;将SS段的BP2所指的单元中的值减去CL中的值。 ;结果放在BP2所指的堆栈单元中SUB AL,20 ;AL中的数减去20,结果放在AL中SUB SI,5010H ;SI中的数减去50l0H,结果放在SI中(2)带借位的减法指令SBB在形式上和功能上都和SUB指令类似,只是SBB指令在执行减法运算时,还要减去CF的值。在减法运算中,CF的值就是两数相减时,向高位产生的借位,所以,SBB在执行减法运算时,是用被减数减去减数,并减去低位字
21、节相减时产生的借位。和带进位位的加法指令类似,SBB主要用在多字节减法运算中。例如:SBB AX,2030H ;将AX的内容减去立即数2030H,并减去进位位CF的值SBB WORD PTRDI,1000H ;DI和DI1所指的单元中的数减去1000H及CF,;结果;放在DI和DI1所指的单元中(3)减量指令DEC只有1个操作数,执行时,将操作数的值减1,再将结果送回操作数。例如:DEC AX ;将AX的内容减1 ,再送回AX中DEC BL ;将BL的内容减1,结果送回BL中DEC BYTE PTRDI2 ;将DI2所指的单元中的内容减1,结果送回此单元(3)取补指令NEG对指令中给出的操作数
22、取补码,再将结果送回。因为对一个操作数取补码相当于用0减去此操作数,所以NEG指令执行的也是减法操作。例如:NEG AL ;将AL中的数取补码,送回ALNEG CX ;将CX中的内容取补码,送回CX(4)比较指令CMP也是执行两个数的相减操作,但不送回相减的结果,只是使结果影响标志位。例如:CMP AX,2000H ;将AX的内容和2000H相比较,结果影响标志位CMP AX,BXDI100 ;将累加器和两个存储单元的数相比较,结果影响标志;位,地址由BXDI100和BXDI101指出CMP DX,DI ;将DX和DI的内容相比,结果影响标志位一般情况下,CMP指令后面经常会有一条条件转移指令
23、,用来检查标志位的状态是否满足了某种关系。CMP指令对标志位的影响如表2-5所示。表2-5 CMP指令执行后标志位的状态数据类型目的操作数与源操作数的关系 CF ZF SF OF带符号位的操作数0 1 0 0- 0 1 0- 0 0 1- 0 0 0- 0 1 1不带符号位的操作数0 1 0 01 0 - -0 0 - -3乘法指令乘法运算是双操作数运算,但是,在指令中却只指定了个操作数,另一个操作数是隐含规定的,乘法运算的隐含规则如图210所示。其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为AL或AX。从图210中可以看出,两个8位数相乘,其结果是16位数;两个16位数相乘,其结果
24、是32位数。图2-10 乘法运算规则4除法指令除法运算也是双操作数运算,它的隐含规则如图211所示,其中的操作数与乘法指令相同。在除法运算中,如果除数是8位的,则要求被除数是16位的;如果除数是16位的,则要求被除数是32位的。如果被除数的位数不够,则应在进行除法以前,预先将被除数扩展到所需要的位数。对于带符号数,这种扩展应该保持被扩展数的值(包括符号位)不变,因此应该是带符导位的扩展。例如,0111 000B应扩展成0000 0000 0111 0000B,1111 0000应扩展成1111 1111 1111 0000B。CBW和CWD指令就是分别用于这两种扩展的。对于带符号数的除法,86
25、系列是按表2-6所示的方式来处理商和余数的。图2-11 除法运算规则表2-6 带符号数除法的商和余数被除数除数商余数99-9-92-22-24-4-4411-1-1从表2-6可以看出.余数始终与被除数同号,也就是说,商是往0靠拢的。*2.2.5逻辑运算和移位指令8086指令系统提供了对8位数和16位数的逻辑操作指令。这些指令分为两类:一类是逻辑运算指令,另一类是移位指令。表2-7给出了86系列指令系统中逻辑运算和移位类指令。表2-7 逻辑运算和移位指令指令类型指令格式指令功能状态标志位备注O S Z A P C逻辑运算NOT 目标AND 目标,源OR 目标,源XOR 目标,源TEST 目标,源
26、非(字节/字)与(字节/字)或(字节/字)异或(字节/字)测试(字节/字)- - - - - -0 * 0 * 0 * 00 * 0目标:通用寄存器、存储器源:通用寄存器、存储器、立即数目标:通用寄存器、存储器源:通用寄存器、存储器、立即数目标:通用寄存器、存储器源:通用寄存器、存储器、立即数目标:通用寄存器、存储器源:8位或16位立即数目标:通用寄存器、存储器移位SHL 目标,计数值SAL 目标,计数值SHR 目标,计数值SAR 目标,计数值逻辑左移(字节/字)算术左移(字节/字)逻辑右移(字节/字)算术右移(字节/字) * * * * 目标:通用寄存器、存储器计数值:1或CL,移位次数目标:通用寄存器、存储器计数值:1或CL,移位次数目标:通用寄存器、存储器计数值:1或CL,移位次数目标:通用寄存器、存储器计数值:1或CL,移位次数循环移位ROL 目标,计数值R0R 目标,计数值RCL 目标,计数值RCR 目标,计数值循环左移(字节/字)循环右移(字节/字)带进位循环左移(字节/字)带进位循环右移(字节/字) - - * - - - * - - - * - - - * - 目标:通用寄存器、存储器计数值:1或CL,移位次数目标:通用寄存器、存储器计数值:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1