微机系统与接口课件2012-2013学年-第3章_第1页
微机系统与接口课件2012-2013学年-第3章_第2页
微机系统与接口课件2012-2013学年-第3章_第3页
微机系统与接口课件2012-2013学年-第3章_第4页
微机系统与接口课件2012-2013学年-第3章_第5页
已阅读5页,还剩182页未读 继续免费阅读

下载本文档

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

文档简介

第3章-1

寻址方式和指令系统教学重点:指令系统的一般概念对操作数的寻址方式六大类指令的操作原理:操作码的含义指令对操作数的要求指令执行的结果指令:控制计算机完成指定操作的命令;机器指令:指令的二进制代码形式,如:CD21H;汇编指令:助记符形式的指令,如:INT21H;指令系统:CPU所有指令及其使用规则的集合。8088/8086指令系统:(1)指令向后兼容(x86系列);(2)应用广泛,资料丰富。第3章-1寻址方式和指令系统概述寻址方式:指CPU指令中规定的寻找操作数所在的地址的方式。操作数:MOVAL,05H操作码目的操作数,源操作数操作数引用时的字节顺序:若存放的信息是字节,则按顺序存放若存放的信息是字,则将字的低位字节存放在低地址,高位字节存放在高地址注:如果没有特别说明,寻址方式是指源操作数的寻址方式。寻址方式8088/8086的操作数分为3类1、立即数(常数)取值范围如下表:立即数只能用作源操作数,如8位16位无符号数00H-FFH(0-255)0000H-FFFFH(0-65535)带符号数80H-7FH(-128~+127)8000H-7FFFH(-32768~)MOV AX,0FA00H ;正确MOV 8000H,DX ;错误放在8个通用寄存器或4个段寄存器中的操作数16位AXAHAL16位BXBHBL16位CXCHCL16位DXDHDL2、寄存器操作数只能存放字操作数段寄存器存放当前操作数的段基地址不允许将立即数传送至段寄存器!SIDIBPSPCSDSESSS存储器操作数字节字双字124类型存储单元个数一般不允许两个操作数同时为存储器操作数3、存储器操作数一条指令的指行时间=∑指令的执行时间取指令取操作数执行指令传送结果单位用时钟周期数表示建议:

1)尽量使用寄存器作为操作数

2)若有可能,用移位代替乘除法

3)尽量使用简单的寻址方式3.1.1立即寻址立即寻址方式中,指令操作码和操作数都在存储器的代码段中。汇编格式:n(n为立即操作数,是用8位或16位二进制补码表示的有符号数)功能:操作数存放在存储器,指令下一单元的内容为立即操作数n。图形表示:立即寻址只能用于源操作数MOVAX,1C8FHMOVBYTEPTR[2A00H],8FH错误例:

×MOV2A00H,AX;错误!

例3.1指令操作例:MOVAX,3102H;AX3102H执行后,(AH)=31H,(AL)=02H3.1.2直接寻址汇编格式:①含有变量的地址表达式。②段寄存器名:[EA]。功能:有效地址由指令直接给出,有效地址只包含位移量。图形表示:默认的段寄存器为DS,但也可以显式地指定其他段寄存器—称为段超越前缀偏移地址也可用符号地址来表示,如ADDR、VAR例3.2:指令操作例:MOVAX,[3102H]AL(3102H),AH(3103H)如果(DS)=2000H,(23012H)=CDH,(23013H)=ABH则操作数的物理地址为:20000HH=23102H指令执行后:MOV操作码02H31HAHAL23102HCDHABH存储器代码段数据段..(AX)=0ABCDH3.1.3寄存器寻址寄存器寻址方式的操作数在指令指明的寄存器中。汇编格式:R(R为寄存器名)功能:操作数直接存放在寄存器R中。图形表示:

R指令→操作数源操作数与目的操作数字长要相同;寄存器寻址与段地址无关。例3.3下列程序执行后,(AX)=?,(BX)=?MOVAX,1234HMOVBX,5678H

ADDAX,BX该程序中MOV指令为数据传送指令操作符,ADD指令为加法指令操作符,三条指令皆为双操作数指令。第一、二条指令AX、BX皆为目的操作数地址,为寄存器寻址方式。第三条指令中,AX为目的操作数地址,BX为源操作数地址。源地址和目的地址皆为寄存器寻址方式。图形表示:执行:1234H→AX5678H→BX

(AX)+(BX)→AX执行后:(AX)=68ACH,(BX)=5678H3.1.4寄存器间接寻址寄存器间接寻址方式中,寄存器的内容为操作数的偏移地址EA,操作数在存储器中。汇编格式:[R]功能:操作数存放在存储器,寄存器R存放操作数的偏移地址EA。偏移地址EA计算方法如下:EA=[SI] SI作间址寄存器。[DI] DI作间址寄存器。[BX] BX作间址寄存器。[BP] BP作间址寄存器。以SI、DI、BX为间址时,默认的段地址寄存为DS;以BP为间址时,默认的段地址寄存为SS;只有SI、DI、BX和BP可作间址寄存器。例3.4:指令操作例:MOVAX,[SI]若(DS)=6000H,

(SI)=1200H,(61200H)=44H,(61201H)=33H则指令执行后,(AX)=3344H3.1.5变址寻址变址寻址方式操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中。汇编格式:X[R](X表示位移量,是8位或16位二进制补码表示的有符号数)功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。图形表示如下:偏移地址EA计算方法如下:例3.5:MOVAX,[BX+8]MOVCX,TABLE[SI]MOVAX,[BPH];默认段寄存器为SS指令操作例:MOVAX,DATA[BX]若(DS)=6000H,(BX)=1000H,DATA=2A00H,(63A00H)=66H,(63A01H)=55H则物理地址=60000H+1000H+2A00H=63A00H指令执行后:(AX)=5566HMOVAX,DATA[BX]3.1.6基址—变址寻址基址—变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量X三项之和,操作数在存储器中。汇编格式:X[BR][IR]功能:操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。图形表示:由基址寄存器(BX或BP)给出——

基址寻址方式由变址寄存器(SI或DI)给出——

变址寻址方式同一组内的寄存器不能同时出现操作数偏移地址EA计算方法如下例3.6:MOVAX,DATA[DI][BX]若(DS)=8000H,(BX)=2000H,(DI)=1000H,DATA=200H则指令执行后:(AH)=[83021H],(AL)=[83020H]使用基址-变址寻址方式可以很方便地访问二维数组。基址寄存器数组首地址变址寄存器数组元素行址位移量数组元素列址(偏移地址)二维数组例:内存图示(按行存储)(行位移地址)(行内元素下标)183252409A=3.1.7

隐含寻址指令操作数是隐含的,在指令中未显式地指明。例:MULBL

指令隐含了被乘数AL及乘积AX

类似的指令还有:DIV、CBW、MOVS等(AL)×(BL)→AX3.1.8I/O端口寻址直接端口寻址可以对0~255的端口编号进行寻址间接端口寻址用寄存器DX的内容来指定端口地址,可以对编号为0~65535的端口进寻址。只能用输入指令IN或输入指令OUT来访问I/O端口。3.1.9跨段问题按前述规定:若选用BP作间址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。该规定为系统默认状态。当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。汇编格式:段寄存器名:操作数地址功能:段寄存器名指明操作数属哪个段。例3.9跨段前缀示例。MOV AX,DS:[BP]MOV CX,SS:[SI]该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:PA1=(DS)左移4位+[BP]PA2=(SS)左移4位+[SI]小结指令由(

)和(

)构成如何取得操作数——称为(

)操作码操作数寻址方式寻址方式可分为立即寻址直接寻址变址寻址寄存器寻址基址-变址寻址寄存器间接寻址基址寻址几种寻址方式比较8086/8088的指令系统指令系统是一台计算机所能识别和执行的全部指令的集合。指令一般包括两个部分:操作码域和地址域。操作码域存放指令的操作码,即指明该指令应由计算机完成何种操作。地址域确定操作数的值或地址、操作结果的地址,有的指令的地址域还指出下一条指令的地址。

机器指令:计算机能识别的代码,机器指令是由二进制数组成的。例如:ADDCL,BH

指令格式为:0000001011001111PUSH AX机器指令为:01010000

汇编语言:汇编语言是一种符号语言,用助记符表示操作码,用符号或符号地址表示操作数或操作数地址,它与机器指令是一一对应的。

汇编程序:MASM.EXE将汇编语言源程序翻译成机器语言,即目标程序。3.2数据传送类指令3.2.1通用数据传送指令3.2.2堆栈操作指令3.2.3标志寄存器传送指令3.2.4地址传送指令3.2.5输入输出指令3.2.1通用数据传送指令1.传送指令MOV2.数据交换指令XCHG3.查表转换指令XLAT1.传送指令MOV语句格式:MOVOPD,OPS功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)→OPD。下图描述了MOV指令在传送数据时允许传送的路径及类型。MOV指令所允许的数据传送路径及类型MOV指令使用规则1)IP不能作目的寄存器2)不允许mem←mem3)不允许segreg←segreg4)立即数不允许作为目的操作数5)不允许segreg←立即数6)源操作数与目的操作数类型要一致几个不能传送的解决办法:用AX作桥梁

存储器←存储器:

MOVAX,MEM1MOVMEM2,AX段寄存器←段寄存器:

MOVAX,DSMOVES,AX段寄存器←立即数:

MOVAX,DATAMOVDS,AX例:存储器与寄存器间数据传送。MOVAX,BUF;BUF是变量,源操作数为直接寻址MOVBH,[DI];源操作数为寄存器间接寻址MOVDI,ES:3[SI];源操作数为变址寻址,使用跨段前缀MOVBP,3[BX+SI] ;源操作数为基址-变址寻址MOVBUFA,DL ;BUFA是一字节变量MOV[BP],AX ;使用SS段寄存器MOVDS:[BP],DL ;使用跨段前缀MOVBUF,DS ;BUF是个字变量2.数据交换指令XCHG语句格式:XCHGOPD,OPS功能:将源地址与目的地址中的内容互换。即(OPD)→OPS,(OPS)→OPD。两操作数中必须有一个在寄存器中;操作数不能为段寄存器和立即数;源和目地操作数类型要一致。例:MOV AX,5678H ;(AX)=5678HMOV BX,0FFFFH;(BX)=0FFFFHXCHGAX,BX (AX)=0FFFFH,(BX)=5678H3.换码指令/查表指令XLAT语句格式:XLATOPS或XLAT功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即([BX+AL])→AL。3.2.2堆栈操作指令1.进栈指令PUSH2.出栈指令POP什么是堆栈?按“后进先出(LIFO)”方式工作的存储区域。堆栈以字为单位进行压入/弹出操作。为什么要设置堆栈?为什么要按“后进先出”方式工作?参见下图规定由SS指示堆栈段的段基址,堆栈指针SP始终指向堆栈的顶部,SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。SPSS堆栈段进栈方向退栈方向栈底栈顶低地址高地址

①压栈指令

PUSHsrc ;src为16位操作数例:PUSH AX ;将AX内容压栈执行操作:(SP)-1←高字节AH

(SP)-2←低字节AL

(SP)←(SP)-2设(AX)=1020H,执行示意图如下:低地址存储区(SS段)执行前(AX)=1020H(SP)存储区(SS段)进栈方向执行后20H10H(AL)(AH)PUSHAX指令执行示意图(SP)-2(SP)高地址低地址高地址(SP)-1压栈指令的格式为:

PUSH regPUSH mem/regPUSH segreg例如:

PUSHAXPUSH[BX]PUSHDS注意进栈方向是高地址向低地址发展。

②弹出指令

POP dest例:POP BX ;将栈顶内容弹至BX

执行操作:(BL)←(SP)

(BH)←(SP)+1

(SP)←(SP)+2POPBX的执行示意图如下图所示POPBX指令执行示意图堆栈指令使用时应注意几点:①堆栈操作总是按字进行②一般不能从栈顶弹出一个字给CS③堆栈指针为SS:SP,SP永远指向栈顶④SP自动进行增减量23.2.3标志寄存器传送指令1.标志送AH指令LAHF2.AH送标志指令SAHF3.标志寄存器进栈指令PUSHF4.标志寄存器出栈指令POPF标志寄存器1.标志送AH指令LAHF语句格式:LAHF功能:将标志寄存器的低8位送入AH寄存器。即(FLAGS)7-0→AH。该指令的执行对标志位无影响。例:标志寄存器传送。执行前:(FLAGS)=0485H,(AX)=0FFFFH执行指令:LAHF

(AX)=?2.AH送标志指令SAHF语句格式:SAHF功能:将AH的内容送入标志寄存器的低8位,高8位不变。即(AH)→FLAGS7-0.。从该指令功能可看出,SAHF为LAHF的逆过程。问题:将标志ZF置0?3.标志寄存器进栈指令PUSHF语句格式:PUSHF功能:将标志寄存器的内容压入堆栈。即(FLAGS)→↓(SP)。4.标志寄存器出栈指令POPF功能:将栈顶内容弹出送入标志寄存器中。即↑(SP)→FLAGS。POPF指令与PUSHF指令互为逆过程。例:将标志寄存器的单步标志TF置位。PUSHF ;(FLSGS)→↓(SP)POPAX ;(SP)→AXORAX,0100H ;设置D8=TF=1PUSHAX ;(AX)→↓(SP)POPF;(SP)→↓FLAGS,即(AX)→↓FLAGS3.2.4地址传送指令1.传送偏移地址指令LEA2.传送偏移地址及数据段首址指令LDS3.传送偏移地址及附加数据段指令LES1.传送偏移地址指令LEA语句格式:

LEAOPD,OPS功能:将源操作数的有效地址即16位偏移地址传送到目的寄存器中。例:主存偏移地址的获取。MOVBX,0100H ;(BX)=0100HMOVSI,0210H ;(SI)=0210HLEABX,1234H[BX][SI];(BX)=?注意以下两条指令差别:

LEABX,BUFFERMOVBX,BUFFER前者表示将符号地址为BUFFER的存储单元的偏侈地址取到BX中;后者表示将BUFFER存储单元中的内容取到BX中。2.传送偏移地址及数据段首址指令LDS语句格式:LDSOPD,OPS功能:将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器。即(OPS)→OPD,(OPS+2)→DS。例:(DS)=C000H,

(C0010H)=80H,

(C0011H)=01H,

(C0012H)=00H,

(C0013H)=20H,

执行:LDSSI,[0010H]则(SI)=?,(DS)=?(SI)=0180H,(DS)=2000H3.传送偏移地址及附加数据段指令LES语句格式:LESOPD,OPS功能:将主存某字单元内容送指定寄存器。即(OPS)→OPD,(OPS+2)→ES。3.2.5输入输出(I/O)指令1.输入指令IN2.输出指令OUT只限于用累加器AL或AX来传送信息。功能:(累加器)←→I/O端口1.输入指令IN输入指令用来从指定的外设寄存器取信息送入累加器。它有四种形式:(1)语句格式:IN AL,PORT

功能:(PORT)→AL;端口号0~255(2)语句格式:IN AX,PORT

功能:(PORT)→AX(3)语句格式:IN AL,DX

功能:([DX])→AL;DX表示的端口范围达64K(4)语句格式:IN AX,DX

功能:([DX])→AX2.输出指令OUT输出指令用来把累加器的内容送往指定的外设存储器,它有四种形式:(1)语句格式:OUT PORT,AL

功能:(AL)→PORT(2)语句格式:OUT PORT,AX

功能:(AX)→PORT(3)语句格式:OUTDX,AL

功能:(AL)→[DX](4)语句格式:OUTDX,AX

功能:(AX)→[DX]3.3算术运算类指令3.3.1加法指令3.3.2减运算指令3.3.3乘运算指令3.3.4除运算指令3.3.5符号扩展指令3.3.6十进制调整指令3.3.1加法指令1.加1指令INC2.加指令ADD3.带进位加指令ADC1.加1指令INC语句格式:INCOPD功能:将目的操作数加1,结果送目的地址。即(OPD)+1→OPD。INC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。如:INCBX,即(BX)+1→BX。加1指令可用于对计数器和地址指针进行调整。注:本指令不影响CF标志!2.加指令ADD语句格式:ADDOPD,OPS功能:将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。即(OPD)+(OPS)→OPD。 例:

ADD

AL,30HADD AX,[BX+20H] ADD CX,SIADD [DI],200HADD指令对标志位(指状态标志)都有影响。3.带进位加指令ADC语句格式:ADCOPD,OPS功能:将目的操作数加源操作数再加进位标志位CF,结果送目的地址。即(OPD)+(OPS)+CF→OPD。例:无符号双字加法运算。MOV AX,4652H ;(AX)=4652HADD AX,0F0F0H ;(AX)=3742H,CF=1MOV DX,0234H ;(DX)=0234HADC DX,0F0F0H ;(DX)=0F325H,CF=0ADD/ADC对条件标志位(CF/OF/ZF/SF)的影响:CF位表示无符号数相加的溢出。OF位表示带符号数相加的溢出。1结果为负0否则SF=1结果为00否则ZF=1和的最高有效位有向高位的进位0否则CF=1两个操作数符号相同,而结果符号与之相反0否则OF=3.3.2减运算指令1.减1指令DEC2.减指令SUB4.带借位减指令SBB3.求补指令NEG5.比较指令CMP1.减1指令DEC语句格式:DECOPD功能:将目的操作数减1,结果送目的地址。即(OPD)-1→OPD。DEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。如:DECCX。即(CX)-1→CX。注:本指令不影响CF标志2.减指令SUB语句格式:SUBOPD,OPS功能:目的操作数减源操作数,结果存于目的地址,源地址内容不变。即(OPD)-(OPS)→OPD例:减法运算。MOV AX,5678H ;(AX)=5678HSUB AX,1234H ;(AX)=4444HMOV BX,3354H ;(BX)=3354HSUB BX,3340H ;(BX)=0014H注:1.源和目的操作数不能同时为存储器操作数;2.立即数不能作为目的操作数。3.带借位减指令SBB语句格式:SBBOPD,OPS功能:目的操作数减源操作数再减借位标志位CF,结果送目的地址。即(OPD)―(OPS)―CF→OPD4.求补指令NEG语句格式:NEGOPD功能:将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。等价:0-OPD或0FFFFH-OPD+1;例:求补运算。MOV AX,0FF64HNEG AL ;(AX)=0FF9CHSUB AL,9DH ;(AX)=0FFFFHNEG AX ;(AX)=0001HDEC AL ;(AX)=0000HNEG AX ;(AX)=0000HSUB/SBB对标志位(CF/OF/ZF/SF)的影响CF=1表示无符号数减法溢出。OF=1表示带符号数减法溢出。NEG指令对CF/OF的影响:CF:操作数为0时,求补的结果使CF=0,否则CF=1。OF:字节运算对-128求补或字运算对-32768求补时OF=1,否则OF=0。1被减数的最高有效位有向高位的借位0否则CF=1两个操作数符号相反,而结果的符号与减数相同0否则OF=5.比较指令CMP语句格式:CMPOPD,OPS功能:目的操作数减源操作数,结果只影响标志位,不送入目的地址。即(OPD)-(OPS)。根据标志位来判断比较的结果1)根据ZF判断两个数是否相等。若ZF=1,则两数相等。2)若两个数不相等,则分两种情况考虑:①比较的是两个无符号数若CF=0,则OPD>OPS;若CF=1,则OPD<OPS。②比较的是两个有符号数若OF⊕SF=0,则OPD>OPS;

若OF⊕SF=1,则OPD<OPS。比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。举例:比较AL、BL、CL中带符号数的大小,将最小数放在AL中。程序:CMPAL,BL;AL和BL比较

JNG

BBB

;若AL≤BL,则转

XCHGAL,BL;若AL>BL,则交换

BBB:CMPAL,CL;AL和CL比较

JNG

CCC;若AL≤CL,则转

XCHGAL,CL;若AL>CL,则交换

CCC:HLT3.3.3乘运算指令1.无符号数乘法指令MUL2.有符号乘指令IMUL进行乘法时:8位8位→16位乘积 16位16位→32位乘积1.无符号数乘法指令MUL语句格式:MULOPS功能:若是字节数据相乘,(AL)与OPS相乘得到字数据存入AX中;若是字数据相乘,则(AX)与OPS相乘得到双字数据,高字存入DX、低字存入AX中。即字节乘法:(AL)(OPS)→AX,

字乘法:(AX)

(OPS)→DX,AX例:无符号数0A3H与11H相乘。MOV AL,0A3H ;(AL)=0A3HMOV BL,11H ;(BL)=11HMUL BL ;(AX)=0AD3H2.有符号乘指令IMUL语句格式:IMULOPS功能:字节乘法:(AL)(OPS)→AX,字乘法:(AX)(OPS)→DX、AX。IMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。例:有符号数0B4H与11H相乘。MOV AL,0B4H ;(AL)=B4HMOV BL,11H ;(BL)=11HIMUL BL ;(AX)=0FAF4H注意:MUL/IMUL指令中AL(AX)为隐含的乘数寄存器;

AX(DX,AX)为隐含的乘积寄存器;

OPS不能为立即数;

除CF和OF外,对其它标志位无定义。乘法指令对CF/OF的影响:00

乘积的高一半为零11

否则MUL指令:CF/OF=00

乘积的高一半是低一半的符号扩展11

否则

IMUL指令:CF/OF=例:(AL)=A5H(-5B),(BL)=11H

(1)IMULBL;(AX)(AL)×(BL)

;A5×11-5B×11=-060BF9F5

;

(AX)=F9F5H

CF=OF=1(2)MULBL;(AX)(AL)×(BL)

;A5×11=0AF5

;

(AX)=0AF5H

CF=OF=1

3.3.4除运算指令1.无符号除指令DIV2.有符号除指令IDIV进行除法时:16位/8位→8位商

32位/16位→16位商1.无符号除指令DIV语句格式:DIVOPS功能:字节除法:(AX)/(OPS)→AL(商)、AH(余数)字除法:(DX、AX)/(OPS)→AX(商)、DX(余数)例:写出实现无符号数0400H/0B4H运算的程序段。MOV AX,0400H ;(AX)=0400HMOV BL,0B4H ;(BL)=0B4HDIV BL ;商(AL)=05H,余数(AH)=7CH

注:若除数为零或AL中商大于0FFH(或AX中商大于0FFFFH),则CPU产生一个类型0的内部中断。2.有符号除指令IDIV语句格式:IDIVOPS功能:字节除法:(AX)/(OPS)→AL(商)、AH(余数)字除法:(DX,AX)/(OPS)→AX(商)、DX(余数)如除数为0,或字节除法时AL寄存器中的商超出-128~+127的范围,或字除法时AX寄存器中的商超出-32768~的范围,则CPU产生一个类型0的内部中断。例:写出实现有符号数0400H/0B4H运算的程序段。MOV AX,0400H ;(AX)=0400HMOV BX,0B4H ;(BX)=0B4HIDIV BX ;(AL)=0F3H,(AH)=24H注意:

对于DIV/IDIV指令

AX(DX,AX)为隐含的被除数寄存器。

AL(AX)为隐含的商寄存器。

AH(DX)为隐含的余数寄存器。

OPS不能为立即数。

对所有条件标志位均无定义。除法运算要求被除数字长是除数字长的两倍,若不满足则需对被除数进行扩展,否则产生错误;对于无符号数除法扩展,只需将AH或DX清零即可;对有符号数而言,则是符号位的扩展。可使用下面介绍的符号扩展指令CBW和CWD。关于除法操作中的字长扩展问题3.3.5符号扩展指令1.字节转换成字指令CBW2.将字转换成双字指令CWD1.字节转换成字指令CBW语句格式:CBW功能:将AL中的符号位数据扩展至AH。例:将字节数据扩展成字数据。MOV AL,0A5H;(AL)=0A5HCBW ;(AX)=0FFA5HADD AL,70H ;(AL)=25HCBW ;(AX)=0025H2.将字转换成双字指令CWD语句格式:CWD功能:将AX中的符号位数据扩展至DX。例:将字数据扩展成双字数据。MOV DX,0 ;(DX)=0MOV AX,0FFABH ;(AX)=0FFABHCWD ;(DX)=0FFFFH(AX)=0FFABH例:

写出34H÷25H的程序段。

MOVAL,34HMOVBL,25HCBW;AL的符号扩展到AHIDIVBL;0034H÷25H,结果为;(AH)=0FH,(AL)=01H3.3.6十进制调整指令1.压缩BCD码调整指令2.非压缩BCD码调整指令BCD码本质上是十进制数,即应遵循逢十进一的规则。而计算机是按二进制(十六进制)进行运算,并未按十进制规则进行运算。(1)压缩BCD码加法调整DAA两个压缩BCD码相加结果在AL中,通过DAA调整得到一个正确的压缩BCD码.指令操作(调整方法):若AL的低4位>9或

AF=1

则(AL)←(AL)+6,AF←1若AL的高4位>9或

CF=1

则(AL)←(AL)+60H,CF←1

只对AL的内容进行调整,对AH无影响;DAA指令应紧跟在ADD或ADC指令之后。例:

0100100048H

MOVAL,48H

+01110100

74H

MOVBL,74H10111100BCHADDAL,BL

+01100110

66H

DAA100100010122H

(进位) (进位)执行ADD后,(AL)=BCH,高4位低4位均大于9,故DAA指令执行加66H调整,最后结果为:

(AL)=22H,CF=1,AF=1不正确的和(2)压缩BCD码减法的十进制调正指令DAS对AL中由两个压缩BCD码相减的结果进行调整。调整操作为:若AL的低4位>9或

AF=1,则:

AL←(AL)-6,且AF←1若AL的高4位>9或CF=1,则:

AL←(AL)-60H,且CF←1

只对AL的内容进行调整,对AH无影响;DAS指令要求跟在减法指令之后。2.非压缩BCD码调整指令(1)加法的非压缩BCD码调整指令AAA(2)减法的非压缩BCD码调整指令AAS(3)乘法的非压缩BCD码调整指令AAM(4)除法的非压缩BCD码调整指令AAD(1)加法的非压缩BCD码调整指令AAA语句格式:AAA功能:如果AL的低4位大于9或(AF)=1,则:(AL)=(AL)+6(AH)=(AH)+1(AF)=(CF)=1

且AL高4位清零。否则:(CF)=(AF)=0AL高4位清零。

AAA指令只影响AF和CF,其余标志无定义。AAA指令应紧跟在ADD或ADC指令之后。例:计算8+900001000=11

结果应为17,而计算机相加为11,原因在于运算过程中,如遇到低4位往高4位产生进位时(此时AF=1)是按逢十六进一的规则,但BCD码要求逢十进一,因此只要产生进位,个位就会少6,这就要进行加6调正。这个1代表了16,而实际上仅应为10,即多进了6。(2)非压缩BCD码减法的十进制调正指令AAS对AL中由两个非压缩的BCD码相减的结果进行调整。调整操作为:若AL的低4位>9或

AF=1,则:①AL←(AL)-6,AH←(AH)-1,AF←1②AL←(AL)&0FH③CF←AF否则:AL←(AL)&0FH举例:16-8=?

MOVAX,0106H0000011006MOVBL,08H-00001000

-08SUBAL,BL11111110FE

AAS-00000110

-06

11111000F8

∧00001111

∧0F0000100008结果为:(AL)=08H,(AH)=0,CF=AF=1(3)乘法的非压缩BCD码调整指令AAM语句格式:AAM功能:被调整的乘积在AX中,对AL按10取模,则:(AL)/0AH→AH(商):AL(余数)其中AH为商,AL为余数,标志位AF、CF、OF、PF、SF、ZF受影响。例:按十进制乘法计算7×8=?程序段如下:

MOV AL,07H ;(AL)=07H MOV CL,08H ;(CL)=08H MUL CL ;(AX)=0038H AAM ;(AH)=05H,(AL)=06H所得结果为非压缩的BCD码。又例:把3AH转换成等值的十进制数。

MOVAL,3AH;58BCDAAM;(AH)=05H,(AL)=08H(4)除法的非压缩BCD码调整指令AAD语句格式:AAD功能:除法运算前,先调整被除数AX内容,使:(AL)=(AL)+(AH)0AH(AH)=0即把非压缩型十进制数变成二进制数。例:按十进制除法计算55÷7=?

程序段如下:

MOV AX,0505H ;(AX)=55BCD MOV CL,07H ;(CL)=7 AAD ;(AX)=0037H DIV CL ;(AH)=6,(AL)=7

所得结果为非压缩的BCD码(商7余6)。又例:把73转换成等值的二进制数。

MOVAX,0703H;(AX)=73BCDAAD;(AX)=0049H3.4位操作类指令3.4.1逻辑运算指令3.4.2移位指令

3.4.1逻辑运算指令1.求反指令NOT2.逻辑乘指令AND3.测试指令TEST4.逻辑加指令OR5.按位加指令XOR1.求反指令NOT语句格式:NOTOPD功能:将目的地址中的内容逐位取反后送入目的地址。即(OPD)→OPD例:逻辑非运算。MOV AX,878AH ;(AX)=878AHNOT AX, ;(AX)=7875H对标志位无影响!2.逻辑乘指令AND——逻辑“与”语句格式:ANDOPD,OPS 功能:将目的操作数和源操作数进行逻辑乘运算,结果存目的地址。即(OPD)∧(OPS)→OPD。该指令用于清除目的操作数中与源操作数置0的对应位。说明:逻辑乘的运算法则为:1∧1=1,1∧0=0,0∧1=0,0∧0=0例:将AL中第3位和第7位清零。MOV AL,0FFHAND AL,77H3.测试指令TEST语句格式:TESTOPD,OPS功能:源地址和目的地址的内容执行按位的逻辑乘运算,结果不送入目的地址,但影响标志寄存器。即(OPD)∧(OPS)。例:测试AX中的第12位是否为0,不为0则转L。TEST AX,1000HJNE L4.逻辑加指令OR——逻辑“或”语句格式:OROPD,OPS功能:将目的操作数和源操作数进行逻辑加运算,结果存目的地址。即(OPD)∨(OPS)→OPD。说明:逻辑加的运算法则为:1∨1=1,1∨0=1,0∨1=1,0∨0=0。例:把AL中的非压缩BCD码变成相应十进制数的ASCII码。

ORAL,30H例:把AH和AL中的非压缩BCD码组合成压缩的BCD码,放到AL中。MOVCL,4SHLAH,CLORAL,AH例:把AL的第5位置为1ORAL,00100000B5.按位加指令XOR——逻辑“异或”语句格式:XOROPD,OPS功能:目的操作数与源操作数做按位加运算,结果送入目的地址。即(OPD)⊕(OPS)→OPD。说明:按位加的运算法则为;1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。例:把AX寄存器清零。例:把DH的bit4,3变反①MOVAX,0XORDH,18H②XORAX,AX③ANDAX,0④SUBAX,AX3.4.2移位指令移位指令包括算术移位指令、逻辑移位指令和循环移位指令,分别进行左移和右移操作。这些指令均有统一的语句格式:

操作码OPD,1操作符OPD,CL其功能为将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数(0~255)移动,结果送入目的地址。目的操作数是8位(或16位)的寄存器数据或存储器数据。1.算术左移和逻辑左移指令SAL(SHL)语句格式:SALOPD,1或SHLOPD,1SALOPD,CL或SHLOPD,CL功能:将(OPD)向左移动CL指定的次数,最低位补入相应的0,CF的内容为最后移入位的值。最低位最高位CF02.算术右移指令SAR语句格式:SAROPD,1或SAROPD,CLCF功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。例:算术右移运算。MOV BH,0F4H ;(BH)=0F4H=11110100BMOV CL,2 ;(CL)=2SAR BH,CL ;(BH)=0FDH=11111101B;(CF)=0该例语句“SARBH,CL”实际上完成了(BH)/4→BH的运算,所以,用SAR指令可以实现对有符号数除2n的运算(n为移位次数)。3.逻辑右移指令SHR语句格式:SHROPD,1或SHROPD,CL功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。算术移位——把操作数看做有符号数;逻辑移位——把操作数看做无符号数。移位位数放在CL寄存器中,如果只移1位,也可以直接写在指令中。例如:

MOVCL,4 SHRAL,CL;AL中的内容右移4位影响C,P,S,Z,O标志。结果未溢出时:左移1位≡操作数*2

右移1位≡操作数/2例:把AL中的数x乘10因为10=8+2=23+21,所以可用移位实现乘10操作。程序如下:

SALAL,1;2x MOVAH,AL SALAL,1;4xSALAL,1;8xADDAL,AH;8x+2x=10x4.循环左移指令ROL语句格式:ROLOPD,1或ROLLPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。5.循环右移指令ROR语句格式:ROROPD,1或ROROPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。6.带进位的循环左移指令RCL语句格式:RCLOPD,1或RCLOPD,CL功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。7.带进位的循环右移指令RCR语句格式:RCROPD,1或RCROD,CL功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。循环移位举例例1:将AL的高4位与低4位互换。

MOVCL,4ROLAL,CL例2:

MOVCL,8RORBX,CLRORAX,CLMOVBH,AHMOVAH,0问题:此程序段的功能是什么?将(AX,BX)组成的32位数右移8位,最高8位填0。3.5串操作类指令串操作指令:数据传送类指令每次只能传送一个数据,若要传送大批数据就需要重复编程,这样就浪费了大量的时间和空间。为此8086提供了一组处理主存中连续存放数据串的指令,这就是串操作指令。3.5串操作指令串:顺序放在内存中的一组相同类型的数据;串操作:对串中的元素进行相同的操作;串操作的寻址方式:源操作数指针———DS:SI(DS可超越)目的操作数指针——ES:DI每次串操作后:串操作指令自动修改SI和DI——字节±1,字±2。DF标志决定±。(注意:退出串操作后,指针指向最后操作的元素的下一个元素);可完成两个存储单元之间的传送和比较操作(也仅是串指令可以);串指令使用的一般方法设置源串地址设置目标串地址设置串长度设置操作方向DF串指令MOVSI,源串首地址(或LEASI,源串)MOVDI,目的串首地址(或LEADI,目的串)MOVCX,串长度CLD(或STD)“串指令”1.传送指令MOVS语句格式:①MOVSB——字节串传送②MOVSW——字串传送功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。即:①(DS:[SI])→ES:[DI]。②当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。2.串比较指令CMPS

语句格式:①CMPSB——字节串比较②CMPSW——字串比较功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。即:①([SI])-([DI])。②修改串指针,使之指向串中的下一个元素。当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。3.串搜索指令SCAS语句格式:①SCASB——字节串搜索②SCASW——字串搜索功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存,即:①字节操作:(AL)-([DI]),字操作:(AX)-([DI])。②修改指针使之指向串中的下一个元素。当DF=0时,(DI)增量。当DF=1时,(DI)减量。4.从源串中取数指令LODS语句格式:①LODSB——从字节串中取数②LODSW——从字串中取数功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。即:①字节操作:([SI])→AL,字操作:([SI])→AX。②修改指针SI,使它指向串中的下一个元素。当DF=0时,(SI)增量。当DF=1时,(SI)减量。5.往目的串中存数指令STOS语句格式:①STOSB——往字节串中存数②STOSW——往字串中存数功能:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。即:①字节操作:(AL)→[DI],字操作:(AX)→[DI]。②修改指针DI,使之指向串中的下一个元素。当DF=0时,(DI)增量。当DF=1时,(DI)减量。重复前缀有的串操作指令前面可加上重复前缀REP。当使用REP前缀时,该指令重复执行,重复执行次数由CX决定(带有REP前缀的串操作指令每执行一次,CX自动减1)。重复前缀包括:REPCX≠0

时重复执行REPE/REPZCX≠0

且ZF=1时重复执行REPNE/REPNZCX≠0

且ZF=0时重复执行串传送指令使用举例例1:用串传送指令实现200个字节的数据传送:

LEASI,MEM1LEADI,MEM2MOVCX,200

CLD

REPMOVSB

例2:把从A000H开始的2KB内存单元清零。程序段如下:MOVDI,0A000HMOVAX,0MOVCX,1024CLDREPSTOSW例3:把1000H开始的100个存储单元填入ASCII码2AH(即*号)。程序段如下:

MOVDI,1000H;首地址 MOVAL,2AH;‘*’

MOVCX,100;重复执行100次 CLD;增量修改DI

REP STOSB例4:用串操作指令代替如下指令:1)

MOVAL,[SI]INCSI2)

MOVES:[DI],AXINCDIINCDI3.6控制转移类指令3.6.1条件转移指令3.6.2无条件转移指令3.6.3循环指令3.6.4子程序调用指令3.6.5中断指令3.6.1条件转移指令1.单个标志位条件转移指令2.无符号数条件转移指令3.有符号数条件转移指令它们都有通用的语句格式和功能。语句格式:[标号:]操作符标号功能:如果条件满足,则(IP)+位移量→IP。1.单个标志位条件转移指令

2.无符号数条件转移指令例:比较无符号数大小,将较大的数存放AX寄存器。CMP AX,BX;(AX)-(BX)JNB NEXT ;若AX>=BX,转移到NEXTXCHG AX,BX;若AX<BX,交换NEXT:…3.有符号数条件转移指令例:比较有符号数大小,将较大的数存放在AX寄存器。CMP AX,BX ;(AX)-(BX)JNL NEXT ;若AX>=BX,转移到;NEXTXCHGAX,BX ;若AX<BX,交换NEXT:…

MOV BX,12FAH MOV CH,4 ;CH做循环计数器ROT: MOV CL,4 ;CL做移位计数器 ROL BX,CL ;将最高4位移到低4位

MOV AL,BL AND AL,0FH ;取出低4位

ADD AL,30H ;转换为ASCII码

CMP AL,39H ;与’9’比较

JBE DISP

;若(AL)≤‘9’,则转显示

ADD AL,07H ;若(AL)>’9’,再加7转为‘A’-‘F’DISP:

MOV DL,AL ;(DL)←字符

MOV AH,2

INT 21H ;显示输出

DEC CH ;4个十六进制数显示完否?

JNZ ROT

;没有,循环

MOV DL,48H

;‘H’

MOV AH,2

INT 21H ;最后显示’H’例:以十六进制数形式显示BX中的内容。3.6.2无条件转移指令无条件转移指令——JMP本指令无条件转移到指定的目标地址,以执行从该地址开始的程序段。根据设置CS、IP的方法,JMP指令分成4种情况。

①段内直接转移:JMPdisp

指令中给出的8/16位的位移量加到IP。CS保持不变。

②段内间接转移:JMPreg/mem

reg/mem中的16位偏移地址送IP。CS保持不变。③段间直接转移JMPsegment:offset指令中给出的16位的段和16位的偏移地址送到CS和IP。

④段间间接转移JMPmem32

mem32中的16位的段和16位的偏移地址送到CS和IP。转移的目标地址由指令直接给出。指令中给出的目标地址实际上是一个相对于IP的位移量:位移量转移范围汇编语言中格式8位-128~+127JMPSHORTOPRD16位-32768~JMPNEARPTROPRD例:JMP 0120H ;直接转向0120H JMP SHORTLP ;转向LPJMP NEARPTRBBB ;转向BBB由于是段内转移,故转移后CS内容保持不变①段内直接转移②段内间接转移转移的目标地址由寄存器或存储单元的内容给出。

例1:JMPSI若(SI)=1200H,则指令执行后,(IP)=1200H,于是转向代码段的偏移地址1200H处开始执行。注意:目标地址以段内偏移的形式给出,而不是相对于IP的位移量,所以它是一个16位的操作数。例2:JMP[BX+DI]设指令执行前:(DS)=3000H,(BX)=1300H,(DI)=1200H,(32500H)=2350H;则指令执行后:(IP)=2350H在汇编语言中,段内间接寻址通常写成:

JMP WORDPTR[BX+DI]表示所取得的目标地址是一个字。③段间直接转移在指令中直接给出要转移到的目的段地址和偏移地址。

例:JMP 2000H:1000H执行时,(IP)←1000H,(CS)←2000H注:直接地址为符号地址时,段间直接转移指令中的符号地址前应加操作符FARPTR。

例:JMPFARPTRfar_label其中的far_label为远类型的标号。转移的目的地址(段和偏移)在两个相邻的字存储单元中。例如:

JMP DWORDPTR[SI]设指令执行前:(DS)=4000H,(SI)=1212H,(41212H)=1000H,(41214H)=4A00H则指令执行后:(IP)=1000H,(CS)=4A00H于是转到4B000H处开始执行指令。例中的DWORDPTR表示转移地址是一个双字。④段间间接转移3.6.3循环指令1.循环指令LOOP2.相等/为零循环指令LOOPE3.不相等/不为零循环指令LOOPNE4.CX为零转移指令JCXZ(1)LOOP格式:LOOPlabel操作:(CX)-1→CX;若(CX)≠0,则转至label处执行;否则退出循环,执行LOOP后面的指令。

注:LOOP指令与下面的指令段等价:

DECCX JNZlabel(2)LOOPZ/LOOPE格式:LOOPZ

label操作:(CX)-1→CX;

若(CX)≠0且

ZF=1,则转至label处执行;否则退出循环,执行LOOP后面的指令。(3)LOOPNZ/LOOPNE格式:LOOPNZlabel操作:(CX)-1→CX;若(CX)≠0且

ZF=0,则转至label处执行;否则退出循环,执行LOOP后面的指令。(4)CX为零转移指令JCXZ语句格式:JCXZ标号功能:(CX)=0,则程序转移(循环);否则,顺序执行。例1:给1A000H开始的256个内存单元均减去1,若发现某个单元减为0则立即退出循环,其后的单元不再减1。程序段如下:(逻辑地址为1A00:0000H)

MOVAX,1A00HMOVDS,AX;1A00H段MOVDI,-1MOVCX,256GOON:INCDIDECBYTEPTR[DI]LOOPNZ

GOON

温馨提示

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

评论

0/150

提交评论