北理工自动化复试微机原理-第五章第二部分_第1页
北理工自动化复试微机原理-第五章第二部分_第2页
北理工自动化复试微机原理-第五章第二部分_第3页
北理工自动化复试微机原理-第五章第二部分_第4页
北理工自动化复试微机原理-第五章第二部分_第5页
已阅读5页,还剩210页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8086和8088的指令系统传送类指令数据操作类指令串操作指令控制类指令本章要求编程与程序调试传送类指令

传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换等场合。这类指令分为以下四种:

通用数据传送指令

目标地址传送指令

标志位传送指令

输入/输出数据传送指令

小结返回通用数据传送指令

通用数据传送指令主要由以下几部分组成:

最基本的传送指令

堆栈操作指令

数据交换指令查表换码指令返回特点:该类指令的执行对标志位不产生影响最基本的传送指令

指令格式:MOV目的操作数,源操作数

指令功能:实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,以及把一个立即数送给CPU的内部寄存器或者内存单元。

示例返回MOV指令示例

MOVES,DX;DX中16位数据送ES

MOVAX,[BX];BX和BX+1所指的两个内存单元的内容送AX

MOV[DI],AX;累加器的内容送DI和DI+1所指的两个单元

MOVCX,[1000H];将1000H和1001H两单元的内容送CX

MOVDX,5040H;立即数5040H送DX

MOVWORDPTR[SI],6070H;立即数6070送SI和SI+1所指的两个单元;这里的PTR是一个汇编操作符,与前面的

WORD一起,意思是从SI地址中取一个字;

而不是一个字节一般数据传送指令注意:两操作数字长必须相同

两操作数不允许同时为存储器操作数两操作数不允许同时为段寄存器在源操作数是立即数时,目标操作数不能是段寄存器IP和CS不作为目标操作数,FLAGS一般也不作为操作数在指令中出现一般数据传送指令应用例将(*)的ASCII码2AH送入内存1000H开始的100个单元中:

MOVDI,1000HMOVCX,64HMOVAL,2AHAGAIN:MOV[DI],ALINCDI;DI+1

DECCX;CX-1JNZAGAIN;CX≠0则继续

HLT上段程序在代码段中的存放形式设CS=109EH,IP=0100H,则各条指令存放地址如下:

CS:IP109E:0100MOVDI,1000H109E:0103MOVCX,64H109E:0106MOVAL,2AH109E:0108MOV[DI],AL109E:010AINCDI109E:010BDECCX109E:010CJNZ0108109E:010EHLT数据段中的分布

送上2AH后数据段中相应存储单元的内容改变如下:DS:10002A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10102A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10202A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10302A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10402A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10502A2A2A2A2A2A2A2A-2A2A2A2A2A2A2A2ADS:10602A2A2A2A000000000000000000000000偏移地址[DI]返回堆栈操作指令指令格式:PUSH源操作数/POP目的操作数实现功能:完成对寄存器的值的保存和恢复注意事项:使用堆栈操作指令时,应预置堆栈段寄存器SS、堆栈指示器SP的值,使SP指向当前堆栈段的栈顶。在执行PUSH指令时,堆栈指示器SP自动减2;然后,将一个字以源操作数传送至栈顶。POP指令是将SP指出的当前堆栈段的栈顶的一个操作数,传送到目的操作数中,然后,SP自动加2,指向新的栈顶。flash堆栈操作指令掌握:有关堆栈的概念栈顶、栈首、栈底堆栈指令的操作原理

执行过程,执行结果堆栈操作的原则后进先出以字为单位堆栈操作指令压栈指令PUSH执行过程:

(SP)←(SP)-2

(SP)-1←操作数高字节

(SP)-2←操作数低字节出栈指令POP执行过程:(SP)操作数低字节(SP)+1操作数高字节

(SP)←(SP)+2压栈指令的操作设AX=1234H,SP=1200H,执行PUSHAX指令后堆栈区的状态:堆栈段1200H┇

SP-2=11FEH12H34H1200H┇

堆栈段12H34HAX入栈后入栈前出栈指令的操作执行POPAX堆栈区的状态:12H34H11FEH┇

堆栈段代码段PUSH1234

AX

SP+2堆栈操作指令说明指令的操作数必须是16位的操作数可以是寄存器或存储器两单元,但不能是立即数不能从栈顶弹出一个字给CSPUSH和POP指令在程序中一般成对出现PUSH指令的操作方向是从高地址向低地址,而POP指令的操作正好相反堆栈操作指令示例例:将16位通用寄存器CX的内容压入堆栈,然后,弹出栈顶至CX中,已知:(SS)=0200H,(SP)=0008H,(CX)=12FAH,其示意图如下所示:•••

12FA

2008

2007

2006

SS段首地址新栈顶原栈顶2000存储器•••

12FA

2008

2007

2006

SS段首地址原栈顶新栈顶2000存储器0200SS000612FASPCX×1612FAH+20200SS000812FASPCX×1612FAH-2

PUSHCX指令的操作过程示意图

PUSHCX指令的操作过程示意图堆栈操作指令示例

堆栈中的内容是按后进先出的次序进行传送的,因此,保存内容和恢复内容时,要按照对称的次序执行一系列压入指令和弹出指令.例如:PUSHDSPHSHES……POPESPOPDS•••返回数据交换指令指令格式:XCHG目的,源指令功能:实现字节、字交换。交换过程可以在CPU的内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行。注意:不能在两个存储单元之间执行数据交换过程,两操作数必须有一个是寄存器操作数。不允许使用段寄存器。两操作数应等长。

示例返回数据交换指令示例

1

XCHGAL,BL;AL和BL之间进行字节换

2XCHGBX,CX

;BX和CX之间进行字交换

3设(DS)=2000H,(22530H)=88H,(22531H)=66H,执行指令XCHG[2530H],CX后(CX)=?CX中的内容和数据段中的2530、2531H两单元的内容交换返回(CX)=6688H换码指令指令格式:XLAT

实现功能:它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。指令说明:使用换码指令时,要求BX寄存器指向表的首地址,AL中为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。XLAT指令就是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。

示例返回查表指令例数据段中存放有一张ASCII码转换表,设首地址为2000H,现欲查出表中第11个代码的ASCII码(设DS=4000H)303132...394142...4546...42000H+042000H+11‘0’‘1’‘2’‘9’‘A’‘B’‘E’‘F’查表指令例可用如下指令实现:MOVBX,2000H;(BX)←表首地址MOVAL,0BH;(AL)←序号XALT;查表转换

执行后得到:(AL)=42H换码指令示例

例:将十进制数字(0—9)翻译成七段显示码的译码表,执行XLAT指令通过查表可将任意一个十进制数翻译成七段显示码。其操作步骤如下:(1)将译码表定位到某个逻辑段的一片连续地址中,并将其表首地址的偏移量置入BX寄存器中;(2)将待翻译的十进制数字送入AL寄存器中;(3)执行XLAT指令。例如,假设这段数据存放在偏移量地址为2000H开始的内存中取出“3”所对应的七段码,用如下几条程序助记符即可完成:

MOVBX,2000HMOVAL,3XLAT返回表abcfegd表十进制数的七段显示码十进制数字七段显示码gfedcba01234567890100000001111001

0010010000110000000110010001001000000010011110000000000000010000返回目标地址传送指令这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下三条指令:

一、取有效地址指令

二、将地址指针装到DS和另一个寄存器的指令

三、将地址指针装到ES和另一个寄存器的指令返回取有效地址指令LEA指令格式:LEA目标,源指令功能:将存储器地址送到一个寄存器。说明:LEA指令格式中,要求源操作数必须为内存单元地址,目的操作数必须为一个16位的通用寄存器。LEA常用来使一个寄存器作为地址指针。返回示例取有效地址指令示例LEABX,[BP+SI];指令执行后,BX中的内容为BP+SI的值LEASP,[0428H];使堆栈指针SP为0482H思考:试比较下面两条指令的不同LEAAX,[2728H]MOVAX,[2728H]

将2728H单元的偏移量送AX指令执行后,AX中为2728H将2728H单元中的内容送到AX中LEA指令比较下列指令:

LEASI,DATA1MOVSI,DATA1MOVAX,[BX]LEAAX,[BX]符号地址┇

DATA112H34H1100H88H77H(BX)=1100HLEA指令在程序中的应用将数据段中首地址为MEM1的50个字节的数据传送到同一逻辑段首地址为MEM2的区域存放。编写相应的程序段

LEA指令在程序中的应用开始取源地址取目标地址送数据块长度到CL传送一个字节修改地址指针修改计数值计数值=0?结束NYLEA指令在程序中的应用

LEASI,MEM1LEADI,MEM2MOVCL,50NEXT:MOVAL,[SI]MOV[DI],ALINCSIINCDIDECCLJNZNEXTHLT返回P

133LDS指令指令格式:LDS目标,源指令功能:是把四个字节的地址指针(其中包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到DS中。示例:执行指令LDSDI,[2130H]

执行该指令后使2130H和2131H这两个单元中的地址偏移量送到DI,2132H和2133H中的段地址值送到DS。LDS指令例例:下列指令执行后结果如何?

LDSDI,[1200H]MOVAX,[DI]┇

12H34H00H60H1200H数据段1┇

DSDI数据段233H22H61234H(DS)=6000H(DI)=1234H(AX)=2233H返回LES指令指令格式:LES目标,源功能:是把四个字节的地址指针(其中包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到ES中。基本相同,所不同仅在于将源操作数所指的地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。思考:LES指令与LDS指令的操作有何不同?LES指令例LESDI,[1200H]MOVAX,[DI]┇

12H34H00H60H1200H数据段┇

ESDI附加段33H22H61234H返回标志位传送指令

可完成标志位传送的指令共有以下四条:

一、读取标志指令

二、设置标志指令

三、对标志寄存器的压入堆栈和弹出堆栈指令返回读取标志指令LAHF读取标志指令LAHF被执行时,将标志寄存器中的低8位传送到AH中,其指令隐含操作数AH,操作示意图如下所示:返回OFDFIF

TFAFPFZFSFCFD4D2D6D7D0AHFLAGLAHF指令的功能示意图设置标志指令SAHF设置标志指令SAHF被执行时,将AH寄存器的相应位传送到标志寄存器的低8位。其指令隐含操作数AH,操作示意图如下所示:返

回OFDFIF

TFAFPFZFSFCFD4D2D6D7D0AHFLAGSAHF指令的功能示意图PUSHF和POPF指令PUSHF指令:将标志寄存器的值压入堆栈顶部,同时,栈指针SP的值减2,此指令在执行时标志寄存器的值不变。POPF指令的功能正好相反。PUSHF和POPF指令的作用:隐含操作数FLAGS。一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。返回输入/输出数据传送指令格式:IN累加器,端口/OUT端口,累加器功能:输入/输出指令用来完成累加器AX/AL与I/O端口之间的数据传送。说明:执行输入指令IN时,CPU可以从一个8位端口读入一个字节到AL中,也可以从两个连续的8位端口读入一个字到AX中。执行输出指令OUT时,CPU可以将AL中的一个字节写到一个8位端口中,或者将AX中的一个字写到两个连续的8位端口中。示例返

回输入/输出数据指令寻址方式直接寻址直接给出8位端口地址,可寻址256个端口(0-FFH)间接寻址

16位端口地址由DX指定,可寻址64K个端口(0-FFFFH)输入/输出数据传送指令示例

INAX,50H;将50H、51H两端口的值读入AX,50H端口的内容读入AL,51H端口的内容读入AHINAX,DX;从DX和DX+1所指的两个端口中读取一个字,低地址端口中的值读入AL中,高地址端口中的值读入AH中

OUT44H,AL;将AL的内容输出到地址为44H的端口

MOVDX,0345HMOVAL,45HOUTDX,AL返回;将45H输出到地址为0345H的端口指令小结一OSZAPC———————ooooo——————ooooooLAHFSAHFPUSHFPOPF标志位传递

累加器:AL或AX(16位外部总线用AX)端口:地址0~255或间址寄存器DX————————————IN累加器,端口OUT端口,累加器I/O数据传送源:内存操作数,目标:十六位通用寄存器源:内存操作数,目标:十六位通用寄存器源:内存操作数,目标:十六位通用寄存器——————————————————LEA目标,源LDS目标,源LES目标,源目标地址传递

源:寄存器,存储器,立即数目标:寄存器,存储器源:寄存器,存储器目标:寄存器(CS除外),存储器源:

通用寄存器,存储器目标:通用寄存器,存储器——————————————————

oooooo——————MOV目标,源PUSH源POP目标XCHG目标,源XLAT通用数据传递

备注

状态标位指令格式指令类型注:O代表对该标志位有影响例题讲解1、假设(SS)=2250H,(SP)=0140H,如果在堆栈中存入5个数据,则栈顶的物理地址为()H。如果又从堆栈中取出3个数据,则栈顶的物理地址为()H。226362263C2、指令LEA

BX,[BX+SI+0F62H]执行前(BX)=0400H

(SI)=003CH,该指令执行后(BX)=?注意:在此BX寄存器得到的是偏移地址而不是该存储单元的内容(BX)=0400+003C+0F62=139EH例题讲解3、已知指令

LDS

SI,[10H]执行前(DS)=C000H,(C0010H)=80H,(C0011H)=01H,(C0012H)=00H,(C0013H)=20H,指令执行后(SI)=?(DS)=?(SI)=0180H,(DS)=2000H返回数据操作类指令此类指令主要包括以下三种:

一、算术运算类指令

二、逻辑运算指令三、移位指令

四、小结返

回算术运算类指令8086/8088指令系统中,具有完备的加、减、乘、除算术运算指令,可处理不带符号或带符号的8/16位二进制整数,以及不带符号的装配型/拆开型十进制整数。

一、加法指令

二、减法指令

三、乘法指令

四、除法指令

五、BCD码运算指令返回算术运算指令的执行大多对状态标志位会产生影响加法指令加法指令有以下三条:

一、不带进位位的加法指令ADD

二、带进位位的加法指令ADC

三、增量指令INC

指令说明…返回不带进位位的加法指令指令格式:ADDDST,SRC;(DST)(DST)+(SRC)指令功能:用来执行2个字或2个字节的相加操作,结果放在原来存放的目的操作数的地方。

例如:

ADDAL,50H;AL和50H相加,结果放在AL中

ADDAX,[BX+2000H];BX+2000H和BX+2001H所指;的两单元的内容和AX的内容;相加,结果放在AX中。返回示例注意:ADD指令的执行对全部6个状态标志位都产生影响带进位位的加法指令指令格式:ADCDST,SRC;(DST)(DST)+(SRC)+CF指令功能:指令格式、对操作数的要求、对标志位的影响与ADD指令完全一样,指令执行时,将进位标志CF的值加在和中。ADC指令多用于多字节数相加,使用前要先将CF清零。示例返回ADD指令例例题:

MOVAL,78HADDAL,99H

指令执行后6个状态标志位的状态标志位状态:

CF=SF=AF=ZF=PF=OF=

01111000+10011001000100011返回ADC和ADD指令示例

例:有两个四字节的无符号数相加,这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后,和放在2000H开始的存储单元中:

MOVSI,2000H;MOVAX,[SI];MOVDI,3000H;ADDAX,[DI];MOV[SI],AX;MOVAX,[SI+2];ADCAX,[DI+2];MOV[SI+2],AX;返回增量指令指令格式:INCOPR;(OPR)(OPR)+1指令功能:只有一个操作数,操作数内容加1。这条指令一般用在循环程序中修改地址指针和循环次数,但该指令不影响进位标志CF的状态。

例如:

INCAL;将AL中的内容加1

INCCX;将CX中的内容加1返回不能是段寄存器或立即数加法指令说明在ADD、ADC、INC指令中,除INC指令不影响CF标志位外,它们都影响状态标志位(AF,OF,PF,SF,ZF,CF),其中主要是OF,SF,ZF,CF四种标志位。ADD、ADC、INC这三条加法指令都可以完成字或字节运算。返回减法指令减法指令主要有以下五条:

一、不带借位的减法指令SUB

二、带借位的减法指令SBB

三、减量指令DEC

四、取补指令NEG

五、比较指令CMP指令说明…返回不带借位的减法指令指令格式:SUBDST,SRC;(DST)(DST)-(SRC)指令功能:完成2个字或2个字节的相减操作。

例如:

SUBBX,CX;将BX中的内容减去CX中的内;容,结果在BX中

SUB[BP+2],CL

;将SS段的BP+2所指的单元;中的值减去CL中的值,结;果放在BP+2所指的单元中返回对标志位的影响与ADD指令同带借位的减法指令指令格式:

SBBDST,SRC;(DST)(DST)-(SRC)-CF指令功能:形式和功能同SUB,指令执行减法运算时,还要减去CF的值。例如:

SBBAX,2030H

;将AX的内容减去立即数

;2030H,并减去进位位CF;的值返回减量指令指令格式:

DECOPR;(OPR)(OPR-1)指令功能:只有一个操作数,执行时,将操作数的值减1,再将结果送回操作数。指令对操作数的要求与INC相同,常用于在程序中修改计数值

例如:

DECAX;将AX的内容减1,再送回AX中

DECBL;将BL的内容减1,再将结果送回BL中应用程序例

MOVBL,2NEXT1:MOVCX,0FFFFHNEXT2:

DECCXJNZNEXT2DECBLJNZNEXT1HLT返回P133?取补指令指令格式:NEGOPR;(OPR)0-(OPR)

或(OPR)0FFFFH-(OPR)+1指令功能:对指令中给定的操作数取补码,再将结果送回操作数。例如:

NEGAL;将AL中的数取补码,送回AL

NEGCX

;将CX中的内容取补码,送回CX返回取补指令说明当操作数的值为-128(80H)或-32768(8000H),求补后结果没有变化。NEG指令影响标志位:AF,OF,PF,SF,ZF,CF,此指令执行时,总是使CF=1,只有操作数为0时,CF=0,因为是0减操作数之故。返回比较指令指令格式:

CMPOPR1,OPR2;(OPR1)-(OPR2)指令功能:比较指令CMP也是执行两个数相减操作,但不送回相减的结果,只是影响标志位。可作为条件转移指令转移的条件。指令对操作数的要求及对标志位的影响同SUB指令。例如:

CMPAX,2000H

;将AX的内容和2000H相比较,结果影响标志位。返回表比较指令表

CMP指令执行后标志位的状态目的的操作数与源操作数的关系CFZFSFOF带符号位的操作数无符号位的操作数目的操作数源操作数等于小于小于大于大于目的操作数源操作数等于低于高于

0100—010—001—000—011

0100

1

0——

0

0——CMP指令两个无符号数的比较:

CMPAX,BX

若AX>BXCF=0

若AX<BXCF=1两个带符号数的比较

CMPAX,BX

两个数的大小由OF和SF共同决定

OF和SF状态相同AX>BXOF和SF状态不同AX<BXCMP指令例

LEABX,MAXLEASI,BUFMOVCL,20MOVAL,[SI]NEXT:INCSICMPAL,[SI]JNCGOON

;CF=0转

XCHG[SI],ALGOON:DECCLJNZNEXTMOV[BX],AL

HLT程序功能?P133?程序功能┇

MAXBUFXXHXXHXXH找20个数中最大的数,并将其存放在MAX单元中返回减法指令说明五条减法指令中,除DEC指令不影响CF标志位外,它们都影响状态标志位。五条减法指令都可以完成字或字节运算。返回乘法指令乘法指令采用隐含寻址,隐含的是存放被乘数的累加器AL或AX及存放结果的AX,DX;将DX寄存器看成是AX寄存器的扩展,当得到16位乘积时,结果放在AX中;当得到32位乘积时,结果放在DX和AX两个寄存器中,DX为乘积的高16位,AX为乘积的低16位。若运算结果的高位全为0或1,表示其为无效数据,OF=CF=0

一、无符号的乘法指令MUL

二、有符号的乘法指令IMUL返回无符号的乘法指令指令格式:

MULSRC;

字节操作:(AX)(AL)*(SRC)

字操作:(DX,AX)(AX)*(SRC)例如:

MULBL;AXAL*BL

MULCX;DX+AXAX*CX注意:SRC不能是立即数无符号数乘法指令例MULBYTEPTR[BX]┇BXXXHAL×XXHAX返回有符号的乘法指令指令格式:IMULSRC;

字节操作:(AX)(AL)*(SRC)

字操作:(DX,AX)(AX)*(SRC)指令说明:

有符号乘法指令IMUL,它在形式上与MUL类似,只是要求两个乘数必须均为有符号数。并且,两个乘法指令影响标志位CF和OF,其余四个标志位无意义。IMUL指令例设:AL=FEH,CL=11H,求AL与CL的乘积。若为无符号数,则

MULCL

结果:AX=10DEH若将两操作数看作有符号数,则:

IMULCL

指令执行后:AX=FFDEH=-34。IMUL指令将OPRD视为带符号数,运算时若操作数为负数,要先将操作数求补码,运算后再将结果求补。返回除法指令执行除法指令时,规定除数必须为被除数的一半字长。除法指令相关指令主要有以下四条:一、

无符号的除法指令DIV

二、有符号的除法指令IDIV

三、字节转换指令CBW

四、字转换指令CWD返回小结除法指令无符号除法指令DIVOPRD有符号除法指令IDIVOPRD若OPRD是字节数,则执行AX/OPRD若OPRD是双字节数,则执行DXAX/OPRD注意:指令是隐含寻址方式,要求被除数是除数的双倍字长AL=商AH=余数AX=商DX=余数返回无符号的除法指令指令格式:

DIVSRC;指令功能:实现两个操作数除法运算。字节操作时,16位被除数在AX中,8位除数为源操作数,8位商在AL中,8位余数在AH中。表示为:

(AL)(AX)/(SRC)的商;(AH)(AX)/(SRC)的余数字操作时,32位被除数在DX,AX中,其中DX存高16位,AX中存低16位,16位除数为源操作数,16位商在AX中,16位余数在DX中,表示为:

(AX)(DX,AX)/(SRC)的商;(AX)(DX,AX)/(SRC)的余数返回有符号的除法指令指令格式:

IDIVSRC;指令功能:功能同无符号除法运算指令。但操作数必须是带符号数。商和余数也为带符号数,且和被除数符号相同。返回乘法和除法小结指令乘数被乘数积MULCLCL(byte)ALAXMULBXBX(word)AXDXAX

乘法操作小结指令除数被除数商余数DIVCLCL(byte)AXALAHDIVBXBX(word)DXAXAXDX除法操作小结返回字位扩展指令

将符号数的符号位扩展到高位指令为零操作数指令,采用隐含寻址,隐含的操作数为AX及AX,DX无符号数的扩展规则为在高位补0字节到字的扩展指令格式:

CBW操作:将AL内容扩展到AX,将AL寄存器中的符号位扩展到AH中规则:若最高位=1,则执行后AH=FFH

若最高位=0,则执行后AH=00H示例:MOVAL,8EH

CBW(AX)=FF8EH字到双字的扩展指令格式:

CWD操作:将AX内容扩展到DXAX;将AX寄存器中的符号位扩展到DX中,规则:若最高位=1,则执行后DX=FFFFH

若最高位=0,则执行后DX=0000H示例:MOVAX,43FFH

CWD(DX:AX)=000043FFHCBW&CWD字节扩展指令和字扩展指令用在什么场合?举例说明。答:遇到两个字节或字相除时,要预先执行CBW或CWD指令,产生一个双倍长度的被除数。特别注意这两条指令只能对AL,AX进行扩展。例如:

MOVBL,3 MOVAL,-12 CBW

;扩展AL中符号位至AH

IDIVBL

或:

MOVBX,3 MOVAX,-12 CWD

;扩展AX中符号位至DX

IDIVBX

返回BCD码运算指令BCD码:是一种用二进制编码的十进制数。分类:

压缩BCD码(组合BCD码):即用一个字节表示两位BCD码;非压缩BCD码(非组合BCD码):即用一个字节表示一位BCD码,高四位为零。为什么使用BCD码调整?BCD码运算指令返回十进制数码0123456789压缩BCD码0000000100100011010001010110011110001001为什么使用BCD码调整?例一:8+7=15。用组合的BCD码表示,运算结果为:+0000011100001000————00001111即结果为0FH。在BCD码中,只允许0~9这10个数字出现,0FH不代表任何BCD码,因此要对它进行变化。BCD码应该是逢10进1,但计算机在这里是逢16进1。因此,可以在个位上补一个6,让其产生进位,而此进位作为十位数出现。+0000011000001111————00001111结论:如果一位BCD码所对应的4位二进制超过9,那就应该补上一个6产生进位来进行调整。BCD码调整例题9+9=18,用组合BCD码表示运算过程为:+0000100100001001————00010010+0000011000001001————00011110错误的原因是:计算机在运算时,遇到低四位往高四位产生进位时是按照逢16进1的规则进行的,但BCD码要求逢10进1,可见,BCD码运算时只要产生了进位,就会丢失一个6。因此,在出现进位时要进行调整。结论:对BCD码进行运算时,只要AF变为1就要在低6位进行调整。结果为12调整原理总结:

凡是遇上某4位二进制码对应的BCD码大于9时,则加6进行调整;凡是遇上低4位产生了进位时,则加6进行调整。当对多个字节进行BCD码运算时,如果低位字节往高位字节产生进位则CF=1,而当一个字节的低4位往高4位产生进位时,AF=1。十进制调整指令会根据CF和AF的值判断是否进行“加6调整”,并进行具体的调整操作。然后,程序再对高位字节进行运算,再进行十进制调整。返回BCD码调整指令共6条,均为隐含寻址方式,隐含的操作数是

AL或AL、AH;不能单独使用,要紧跟在相应的算术运算指令之前后;执行结果为压缩BCD码或扩展BCD码表示的十进制数。BCD码运算指令BCD码运算指令主要有以下四种:压缩的BCD码调整指令:

DAA——加法十进制调整指令

DAS——减法十进制调整指令非压缩的BCD码调整指令:

AAA——加法的ASCII调整指令

AAS——减法的ASCII调整指令

AAM——乘法的ASCII调整指令

AAD——除法的ASCII调整指令返回非组合BCD码加法十进制调整指令指令格式:

AAA指令功能:实现两个非组合BCD码相加结果的和存放到AL寄存器中的调整,指令把AL调整到非压缩的BCD码格式,AH中存放调整产生的进位值。指令说明:指令影响标志位:AF和CF,而PF,SF,ZF,OF无意义。加法指令应用例计算2658+3619=?结果存放在SUM单元设被加数和加数的每一位都以ASCII码形式存放在内存中,低位在前,高位在后。36H32H39H31HSTRING1STRING238H35H36H33H数据段SUM......加法指令应用例LEASI,STRING1LEADI,STRING2LEABX,SUMMOVCX,4CLCNEXT:MOVAL,[SI]ADCAL,[DI]AAAMOV[BX],AL

INCSIINCDIINCBXDECCXJNZNEXT返回调整规则?

ADDAL,BLDAA如指令执行前,(AL)=28,(BL)=68执行ADD指令后(AL)=90,CF=0,AF=1执行DAA指令时,因为AF=1而做(AL)

(AL)+06得(AL)=96,CF=0,AF=1结果正确BCD加法示例返回调整规则?组合BCD码加法十进制调整指令指令格式:

DAA指令功能:实现两个组合BCD码相加结果的和存放到AL寄存器中的调整,指令把AL调整到压缩的BCD码格式。指令说明:指令影响标志位:AF,CF,PF,SF,ZF,而OF无意义。返回示例SUBAL,AHDAS如指令执行前(AL)=86,(AH)=07执行SUB指令后(AL)=7FH,CF=0,AF=1执行DAS指令时,因为AF=1,需要(AL)(AL)-06而得(AL)=79,CF=0,AF=1结果正确BCD减法示例返回调整规则?非组合BCD码减法十进制调整指令指令格式:

AAS指令功能:实现两个非组合BCD码相减结果的差存放到AL寄存器中的调整,指令把AL调整到非压缩的BCD码格式,AH中存放调整产生的借位值。指令说明:指令影响标志位:AF和CF,而PF,SF,ZF,OF无意义。返回组合BCD码减法十进制调整指令指令格式:

DAS指令功能:实现两个组合BCD码相减结果的差存放到AL寄存器中的调整,指令把AL调整到压缩的BCD码格式。指令说明:指令影响标志位:AF,CF,PF,SF,ZF,而OF无意义。返回示例BCD码乘法十进制调整指令指令格式:

AAM指令功能:实现两个非组合BCD码相乘结果的乘机存放到AL寄存器中的调整,指令把AL调整到非压缩的BCD码格式。调整方法为:把AL内容除0AH,商放在AH寄存器中,余数保存在AL寄存器中。根据AL寄存器的内容确定标志位。指令说明:指令影响标志位:SF,ZF,PF,而OF,CF,AF无意义返回调整规则?BCD码除法十进制调整指令指令格式:

AAD指令功能:指令把AX寄存器中存放的二位非组合BCD码,AH中存放十位数,AL中存放个位数,除数是一位非组合BCD数,在相除以前用AAD指令把AX中的被除数调整成二进制数并存放在AL寄存器中的调整,完成操作是:

(AL)10*(AH)+(AL)(AH)0指令说明:该指令只提供对非组合BCD码除法调整,并是在进行除法之前。指令影响标志位:SF,ZF,PF,而OF,CF,AF无意义。返回调整规则?指令小结二逻辑运算类指令逻辑运算指令主要由以下几部分组成:

一、逻辑与指令AND

二、逻辑或指令OR

三、逻辑异或指令XOR

四、逻辑测试指令TEST

五、逻辑非指令NOT返回说明…逻辑与指令指令格式:

ANDOPRD1,OPRD2用途:两操作数相“与”,结果送OPRD1,一般用来对某些位清零,其它位不变,在操作数不变的情况下使CF和OF清零例如:

ANDAL,0FH;指令实现对高4位清零。返回逻辑或指令指令格式:

OROPRD1,OPRD2用途:两操作数相“或”,结果送目标地址。一般用来对一个指定位置1。在不改变操作数的情况下使OF=CF=0例如:

ORAL,02H;指令实现对累加器中的D1位置1返回“或”指令的应用例ORAX,[DI]ORCL,0FHORAX,AX

ORAL,ALJPEGOONORAL,80H

GOON:….偶校验转移(PF=1)将一个二进制数9变为字符‘9’?逻辑异或指令指令格式:

XOROPRD1,OPRD2用途:两操作数相“异或”,结果送目标地址。用来对某一寄存器清零,用于初始化寄存器。例如:XORAX,AX;使累加器AX清零。返回逻辑测试指令指令格式:

TESTOPRD1,OPRD2用途:一般用来检测指定位是1还是0,而这个指定位往往对应一个物理量。例如:TESTAL,01

通过对ZF的判断来了解最低位是否为1。如果ZF=1,说明结果为0,即最低位为0;如果ZF=0,说明结果不为0,即最低位不为0。“测试”指令例从地址为38F0H的端口中读入一个字节数,如果该数的bit1位为1,则可从38FEH端口将DATA为首地址的一个字输出,否则就不能进行数据传送。请编写相应的程序段。“测试”指令例开始取待输出数的偏移地址读入状态字测试bit1位状态Bit1=1?取输入口地址取输出口地址输出一个字NY“测试”指令例

LEASI,DATAMOVDX,38F0HWATT:INAL,DXTESTAL,02HJZWATT;ZF=1转移

MOVDX,38FEHMOVAX,[SI]OUTDX,AX返回逻辑非指令指令格式:

NOTOPR;(OPR)(!OPR)操作:操作数按位取反再送回原地址用途:常用来将某个数据取成反码,再加上1,便得到补码。指令中的操作数不能是立即数。指令的执行对标志位无影响例:NOTBYTEPTR[BX]返回逻辑运算指令说明五种逻辑运算指令中,NOT指令不允许使用立即数,其它四条指令除非源操作数是立即数,否则至少有一个操作数必须存放在寄存器中,另一操作数则可以用任意寻址方式。“非”运算指令要求操作数不能是立即数NOT指令不影响标志位,其它四种指令将使CF和OF为0,AF位无定义,而SF,ZF和PF则根据运算结果设置。例题讲解

设(CH)=01111001,TESTVAL=11100011.下列操作分别执行时,各指令执行后(CH)=?OR CH,TESTVALAND CH,TESTVALXOR CH,TESTVALTEST CH,00000100BXOR CH,11111111BOR(或)运算011110011110001111111011ORCHTESTVALCHAND与运算011110011110001101100001ANDCHTESTVALCHXOR异或运算011110011110001110011010XORCHTESTVALCHTEST命令的使用011110010000010000000000TESTCHCH=01111001CF=OF=0SF=0ZF=1TEST和AND指令设(CH)=10111101B,比较下面两指令的操作区别。101111011110001110100001ANDCHCH101111011110001110100001TESTCHCHANDCH,11100011BTESTCH,11100011B(CH)=10111101B(CH)=10100001B返回移位指令移位指令主要由以下两大类指令组成:一、非循环移位指令二、循环移位指令返回说明…非循环移位指令此类指令主要实现对寄存器或内存单元中的8位或16位操作数进行移位。它分逻辑移位指令和算术移位指令,共四条。

一、算术左移指令SAL

二、逻辑左移指令SHL

三、算术右移指令SAR

四、逻辑右移指令SHR返回算术左移指令指令格式:

SALOPR,CNT;指令功能:

OPR可以是除立即数以外的任何寻址方式。移位次数由CNT决定,CNT可以是1或CL。注意如移位次数大于1,则可在该指令之前把移位次数置于CL寄存器中。返回高

低CF0逻辑左移指令指令格式:

SHLOPR,CNT;指令功能:说明:(1)SHL指令和SAL指令功能相同,可实现有符号数和无符号数乘2,如果左移后,最高位和CF不同,则溢出标志OF为1。(2)根据OF的值判断左移操作是否造成了溢出。高

低CF0返回算术右移指令指令格式:

SAROPR,CNT;指令功能:

说明:右移时,最高位保持不变。用途:用于带符号数除2。高

低CF返回逻辑右移指令指令格式:

SHROPR,CNR;指令功能:

说明:逻辑右移时,最高位补零。用途:用于无符号数除2。高

低CF0返回示例:

(AH)=10101101,指令

SHRAH,1执行后,

(AH)=01010110CF=1循环移位指令循环移位指令主要由以下四条指令组成:

一、不带进位的循环左移指令ROL

二、不带进位的循环右移指令ROR

三、带进位的循环左移指令RCL

四、带进位的循环右移指令RCR返回不带进位的循环左移指令指令格式:

ROLOPR,CNT;指令功能:高

低CF返回不带进位的循环右移指令指令格式:

ROROPR,CNT;指令功能:高

低CF返回示例:

(AH)=10101101,指令RORAH,1执行后

(AH)=11010110CF=1带进位的循环左移指令指令格式:

RCLOPR,CNT;指令功能:高

低CF返回示例:

设(AH)=10101101,CF=0,指令RCLAH,1执行后

(AH)=

若执行指令

RCRAH,1后,

(AH)=01011010CF=101010110CF=1带进位的循环右移指令指令格式:

RCROPR,CNT;指令功能:

低CF返回移位指令说明所有移位指令影响标志位:CF,OF,PF,SF,ZF,无AF。如果要移动若干位,则必须在CL中指出移动位数,若移动一位,可在指令中直接给出。可对字节或字操作,操作数可以是寄存器或内存单元。程序例

MOVSI,1000H MOVDI,3000H MOVCX,4 BBB:MOVAL,[SI]

MOVBL,ALANDAL,0FHORAL,30HMOV[DI],ALINCDIMOVAL,BLPUSHCXMOVCL,4SHRAL,CLORAL,30HMOV[DI],ALINCDIINCSIPOPCXDECCXJNZBBBHLT程序功能?程序例将1000H开始存放的四个压缩BCD码转换为ASCII码存放在3000H开始的单元中去┇┇12H34H56H78H┇1000H3000H返回指令小结三返回指令小结二返回OSZAPC源:通用寄存器,存储器源:通用寄存器,存储器*****o*****oMUL源IMUL源乘法

************————————————DIVIDIVCBWCWD

除法源:寄存器,存储器,立即数目标:寄存器,存储器源:寄存器,存储器,立即数目标:寄存器,存储器目标:通用寄存器,存储器目标:通用寄存器,存储器源:寄存器,存储器,立即数目标:寄存器,存储器ooooooooooooooooo---ooooo1ooooooSUB目标,源SBB目标,源DEC目标NEC目标CMP目标,源

减法

源:寄存器,存储器,立即数目标:寄存器,存储器源:寄存器,存储器,立即数目标:寄存器,存储器目标:通用寄存器,存储器ooooooooooooooooo---ADD目标,源ADC目标,源INC目标加法备注

状态标志位指令格式指令类型注:O代表对该标志位有影响指令小结二(续)OSZAPC目标:通用寄存器,存储器计数值:1或CL,移位次数目标:通用寄存器,存储器计数值:1或CL,移位次数目标:通用寄存器,存储器计数值:1或CL,移位次数目标:通用寄存器,存储器计数值:1或CL,移位次数o——*—oo——*—oo——*—oo——*—oROL目标,计数值ROR目标,计数值RCL目标,计数值RCR目标,计数值循环移位目标:通用寄存器,存储器计数值:1或CL,移位次数目标:通用寄存器,存储器计数值:1或CL,移位次数目标:通用寄存器,存储器计数值:1或CL,移位次数目标:通用寄存器,存储器计数值:1或CL,移位次数ooo*ooooo*ooooo*ooooo*ooSHL目标,计数值SAL目标,计数值SHR目标,计数值SAR目标,计数值移位目标:通用寄存器,存储器源:寄存器,存储器,立即数目标:寄存器,存储器源:寄存器,存储器,立即数目标:寄存器,存储器源:寄存器,存储器,立即数目标:寄存器,存储器源:8位或16位立即数目标:通用寄存器,存储器——————0oo*o00oo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论