ibm-pc汇编语言程序设计(沈美明第二版)第二章指令与寻址_第1页
ibm-pc汇编语言程序设计(沈美明第二版)第二章指令与寻址_第2页
ibm-pc汇编语言程序设计(沈美明第二版)第二章指令与寻址_第3页
ibm-pc汇编语言程序设计(沈美明第二版)第二章指令与寻址_第4页
ibm-pc汇编语言程序设计(沈美明第二版)第二章指令与寻址_第5页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

汇编语言程序设计,北京理工大学电子工程系,马永锋mayongfeng,第二章汇编语言指令系统和寻址方式,2.2指令系统2.2.1数据传送指令2.2.2算术运算指令2.2.3逻辑运算指令2.2.4字符串指令2.2.5程序转移指令2.2.6处理器控制指令,2.2指令系统,指令系统是CPU指令的集合,CPU除了具有计算功能的指令外,还有一些实现其它功能的指令,也有为某种特殊的应用而增设的指令。在学习汇编指令时,指令的功能无疑是我们学习和掌握的重点,但要准确、有效地运用这些指令,我们还要熟悉系统对每条指令的一些规定或约束。归纳起来,对指令还要掌握以下几个方面内容:要清楚指令操作数的寻址方式,不同寻址方式,执行时间大不相同;指令对标志位的影响、标志位对指令的影响指令的执行时间,对可完成相同功能的指令要选用执行时间短的指令,指令的执行时间,指令的基本执行时间举例,加法指令执行时间计算有效地址EA所需时间,2.2.1数据传送指令(14条),1.通用数据传送指令MOV(MOVebyteorword)传送字节或字。POP(POPwordoffstack)字退栈。PUSH(PUSHWordintostack)字进栈。XCHG(Exchangebyteorword)字节或字交换。XLAT(Translatebyte)字节换码2.输入输出指令IN(INputbyteorword)输入字节或字。OUT(OUTputbyteorword)输出字节或字。3.标志寄存器传送指令LAHF(LoadAHregisterfromFlags)取标志到AH。SAHF(StoreAHregisterinFlags)取AH到标志。PUSHF(PUSHFlagsintostack)标志进栈。POPF(POPFlagsoffstack)标志退栈。4.地址传送指令LEA(LoadEffectiveAddress)取有效地址。LDS(LoadpointerusingDS)取指示器到DS。LES(LoadpointerusingES)取指示器到ES。,除指令SAHF和POPF指令外,本类的其它指令都不影响标志位。,1通用数据传送指令,(1)传送指令MOV(MoveInstruction)传送指令是使用最频繁的指令,它相当于高级语言中的赋值语句。格式:MOVReg/Mem,Reg/Mem/Imm功能:把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。说明:源操作数可以是立即数、通用寄存器、存储器以及段寄存器;目的操作数可以是通用寄存器、存储器和除CS外的段寄存器,目的操作数不能是立即数。当存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。注释:RegRegister(寄存器),MemMemory(存储器),ImmImmediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。,通用数据传送指令MOV,对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOVBL,AX等是不正确的;两个操作数不能同时为段寄存器,如:MOVES,DS等;代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOVCS,AX等不正确,但指令MOVAX,CS等是正确的;立即数不能直接传给段寄存器,如:MOVDS,100H等;立即数不能作为目的操作数,如:MOV100H,AX等;指令指针IP,不能作为MOV指令的操作数;两个操作数不能同时为存储单元,如:MOVVARA,VARB等,其中VARA和VARB是同数据类型的内存变量。对于规定2、4和7,我们可以用通用寄存器作为中转来达到最终目的。,通用数据传送指令MOV,数据传送方向搭配图,通用数据传送指令MOV,举例:(1)寄存器与寄存器之间的数据传送例如:MOVAX,BX;(BX)AXMOVDL,AH;(AH)DLMOVDX,ES;(ES)DXMOVDS,AX;(AX)DSMOVAX,CS;(CS)AX注意:源操作数和目的操作数的数据类型必须一致,可以同时是字节寄存器或字寄存器,不能同时为段寄存器;代码段寄存器CS不能为目的操作数;指令指针IP不能作为操作数。MOV指令不影响状态标志,通用数据传送指令MOV,举例:(2)立即数传送到通用寄存器立即数传送到通用寄存器是指立即数传送给AX,BX,CX,DX,BP,SP,SI,DI以及AH,AL,BH,BL,CH,CL,DH,DL寄存器,但不能传送到段寄存器。例如:MOVAX,100Q;100QAXMOVBX,0FFFFH;0FFFFHBXMOVAL,-2;0FFFEHALMOVCH,100B;100BCHMOVDL,A;65DLMOVSI,OFFSETTABLE;OFFSETTABLESI注意:立即数与寄存器数据类型必须一致,立即数可以是二进制、八进制、十进制、十六进制的常数,可以是带符号或无符号的整数,也可以是ASCII字符。,通用数据传送指令MOV,举例:(3)寄存器与存储器之间的数据传送寄存器与存储器之间的数据传送是指除了CS和IP以外的所有寄存器与内存储器之间的数据传送。例如:MOVAL,BUFFER;(BUFFER)ALMOVAX,SI;(DS)10H+(SI)AXMOVDI,DX;(DX)(DS)10H+(DI)MOVBX+DI,DL;(DL)(DS)10H+(BX)+(DI)MOVSI,ES:BP;(ES)10H+(BP)SIMOVAX,ABXSI;(DS)10H+(BX)(SI)+A位移)AX(4)立即数传送到存储器立即数的数据类型与存储器变量的类型一致。例如:MOVA,3;3同A的类型一致MOVBYTEPTRSI,3;3为一个字节MOVWORDPTRBX,3;3为一个字MOVB1BXDI1,30H;30H同B1变量的类型一致存储器操作数可以采用各种存储器寻址方式。,(2)堆栈指令POP/PUSH,堆栈的概念堆栈也称作栈(Stack),是一种具有后进先出访问方式的存储空间;堆栈是先进后出(LastInFirstOut)的线性表,简称LIFO表,堆栈允许插入和删除的一端称作栈顶,另外一端称作栈底。堆栈就是限制在顶端进行插入和删除的线性表。见示意图堆栈有两个基本操作:入栈(push)和出栈(pop)。入栈就是将一个新的元素放入栈顶,这一个元素只能够是字,不能是字节。入栈也称作压栈。出栈则是从栈顶取出一个元素。其中栈顶的元素总是最后入栈最先出栈。出栈也称作退栈或弹出。,堆栈指令POP/PUSH,8086的堆栈机制8086CPU中提供了堆栈的机制,将一段内存当作栈来使用,并通过8086的相关指令以栈的方式访问内存。堆栈操作过程中,段寄存器SS指向用于堆栈的内存段,SP指向该堆栈的栈顶,把它们合在一起就可以访问栈顶单元。堆栈的深度由SP的初值决定。入栈指令:PUSH格式:PUSHReg/MemPUSHImm;80286+功能:一个字进栈,系统自动完成两步操作:首先SPSP-2,使栈顶指针指向一个新位置,然后(SP)操作数;出栈指令:POP格式:POPReg/Mem功能:弹出一个字,系统自动完成两步操作:首先弹出操作数(SP),然后SPSP+2,使栈顶指针指向新的栈顶位置;,堆栈指令POP/PUSH,举例:PUSHAX;(SP)-2SP且(SP),(SP)1)(AX)PUSHBX;将(BX)压入堆栈PUSHSS;将(SS)压入堆栈PUSHCS;将(CS)压入堆栈(这是合法的)PUSHBETA;将BETA存储字的内容压入堆栈PUSHBETABX;将BETABX一个字的内容压入堆栈PUSHBETABXSI;将BETABX+SI一个字的内容压入堆栈POPBETABXSIPOPBETABXPOPBETAPOPA;因为POPCS是非法的POPSSPOPBXPOPAX,堆栈指令POP/PUSH,假设AX=4243H,执行指令“PUSHAX”,进栈前后堆栈段的情况如a、b所示,执行指令“POPBX”,堆栈段情况如图b、c所示。,(a)进栈前堆栈段(b)进栈后和出栈前堆栈段(c)出栈后堆栈段,堆栈指令POP/PUSH,注意:(1)因为堆栈指针SP总是指向已经存入数据的栈顶,所以PUSH指令是先(SP)-2SP,然后将内容压栈,即先修改SP使之指向堆栈中的空闲单元,后将内容压栈。而POP是先从栈顶弹出一个字,然后将堆栈指针(SP)+2SP以便使刚刚弹出的堆栈字空间释放;(2)因为SP总是指向栈顶,而用PUSH和POP指令存取数时都是在栈顶进行的,所以堆栈是“先进后出”或称作“后进先出”。栈底在高地址,堆栈是从高地址向低地址延伸的,所以栈底就是最初的栈顶;(3)PUSHCS是合法的,但POPCS是非法的;(4)PUSH和POP的操作数都不能是立即数;(5)用PUSH指令和POP指令时只能按字访问堆栈,不能按字节访问堆栈;(6)PUSH和POP指令都不影响标志。,堆栈指令POP/PUSH,.modelsmall.stack4h.codego:movah,Amoval,Bmovbh,Cmovbl,Dpushaxpushbxpopaxpopbxmovah,4chint21hendgo,(3)交换指令XCHG,格式:XCHGReg/Mem,Reg/Mem功能:将源操作数和目的操作数相互交换。目的操作数和源操作数同时为字节或字。例如:XCHGAX,BX;AX与BX寄存器内容交换XCHGSI,AX;SI与AX内容交换XCHGAL,BL;AL与BL内容交换XCHGWORD_VAR,CX;变量WORD_VAR与CX寄存器内容交换XCHGDH,BYTE_VAR;DH与变量BYTE_VAR内容交换XCHGSI+3,AL;DS:SI+3所指的内容与AL内容交换,交换指令XCHG,注意:XCHG指令不影响状态标志。(2)操作数可以是通用寄存器和存储器,但不包括段寄存器,也不能为立即数。(3)源操作数和目的操作数不能同时为存储器,因此不能直接实现两个存储器单元的内容交换。若要进行存储器(字)变量A和存储器(字)变量B的内容交换,可以借用一个通用寄存器来实现:MOVAX,BXCHGAX,AMOVB,AX,交换指令XCHG,举例:用XCHG指令将字符串S1与S2的内容进行交换源程序如下:DATASEGMENTS1DBABCDEFGS2DB0123456NDW$-OFFSETS2;N为字符串长度DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,0MOVCX,N;将字符的个数送至CX中,L1:MOVAL,S1SIXCHGAL,S2SIMOVS1SI,AL;借助寄存器AL将S1SI与S2SI交换INCSILOOPL1;循环N次MOVAH,4CHINT21HCODEENDSENDSTART,(4)查表转换指令XLAT,格式:XLAT功能:换码表中的一个字节,称为换码字节,用换码字节来置换累加器AL中的内容,即ALBXAL。,说明:该指令有两个隐含操作数BX和AL,换码表的表首由DS:BX指向,要换的码在表中的位移由寄存器AL中的内容指出。指令执行后即将表中要换的码置入AL中,即DS:BX+ALAL。,查表转换指令XLAT,举例:利用XLAT指令将计算机机内二进制表示的十六进制转换成ASCII码并显示输出源程序如下:DATASEGMENTHEX_NUMDB0,1,2,3,4,5,6,7,8,9,0AH,0BH,0CH,0DH,0EH,0FHTABLEDB0123456789ABCDEFDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,16MOVBX,OFFSETTABLEMOVSI,OFFSETHEX_NUM,查表转换指令XLAT,L:MOVAL,SIXLATTABLE;换码DS:BX+ALALMOVDL,ALMOVAH,02H;显示输出INT21HMOVDL,INT21HINCSILOOPLMOVAH,4CHINT21HCODEENDSENDSTART,2输入输出指令IN/OUT,格式一:端口输入INAL,port端口输出OUTport,AL功能:IN从指定的外设端口读数据到AL寄存器,OUT将AL寄存器的内容传送到指定的外设端口。说明:这里端口地址port为立即数,限制在0255,只能使用AX或AL收发端口数据。格式二:端口输入MOVDX,portINAL,DX端口输出MOVDX,portOUTDX,AL说明:这里端口地址可以在065535,3标志寄存器传送指令,(1)LAHF指令(LoadAHwithFlags)格式:LAHF功能:将标志寄存器的状态标志SF,ZF,AF,PF,CF位传送至AH寄存器的对应位,AH寄存器的其余3位内容不变,其操作如图所示:,标志寄存器传送指令,(2)SAHF指令(StoreAHintoFlags)格式:SAHF功能:将AH的指定位(与状态标志对应的位)传送至标志寄存器(即与LAHF指令传送方向相反)。其操作示意如下图所示,该条指令把寄存器AH的指定位送至标志寄存器低8位的SF,ZF,AF,PF和CF标志位,因而这些标志的内容会受到影响。但这条指令不影响溢出标志OF、方向标志DF、中断允许标志IF和追踪标志TF,即不影响标志寄存器的高位字节。,标志寄存器传送指令,(3)PUSHF指令(PUSHFlags)格式:PUSHF功能:将标志寄存器的内容压入堆栈。先将堆栈指针减2(即(SP)-2SP),然后将整个标志寄存器(16位)的内容压入SP所指向的栈顶。这条指令不影响状态标志。(4)POPF指令(POPFlags)格式:POPF功能:标志寄存器退栈。先将堆栈顶的内容,即(SP)+1,(SP)传送至标志寄存器(16位)中,然后将堆栈指针SP加2,即(SP)+2SP。执行该指令后,标志寄存器的各位会发生相应的变化,因此,该指令影响标志寄存器。,4地址传送指令,(1)有效地址传送指令LEA(LoadEffectiveAddress)格式:LEAReg,Mem功能:把源操作数的有效地址传送至目的操作数寄存器说明:该指令通常用来对指针或变址寄存器BX、DI或SI等置初值之用。目的操作数为16位的通用寄存器(即AX,BX,CX,DX,SP,BP,SI,DI之一);源操作数是存储器操作数,如变量、标号或地址表达式例如:LEABX,BUFFER;将变量BUFFER的位移量送入BX中LEADX,BUFARRAYBXSI;将数组元素的位移量送入DX中LEAAX,BPDI;将有效地址(BP)+(DI)送入AX中,地址传送指令,注意:LEA指令处理的是变量的地址(即变量的位移量),而不是变量的内容(即变量的值)。LEA指令和MOV指令有本质上的区别。假设变量BUFFER的偏移是1000H,该字变量的值是4243H,则指令“LEAAX,BUFFER”是将偏移1000H送入AX中,而指令“MOVAX,BUFFER”是将值4243H送入AX中。MOV指令也可以传送有效地址(位移量),但必须用OFFSET操作符作用于变量,“MOVAX,OFFSETBUFFER”将变量BUFFER的位移量送入AX中。(3)LEA指令的源操作数可以带下标,即LEA指令可以传送任意数组元素的位移量。例如指令“LEADX,BUFARRAYBXSI”是将数组元素BUFARRAYBXSI的位移量传送至DX中。而MOV指令用OFFSET操作符则不能直接取数组元素的位移量,只能取数组的第一个元素的位移量(即数组的起始地址)。(4)LEA指令的源操作数必须是存储器操作数。(5)LEA指令的目的操作数必须是16位寄存器。(6)LEA指令不影响状态标志。,地址传送指令,(2)取段寄存器指令(LoadSegmentInstruction)格式:LDS/LESReg,Mem功能:将双字指针传送至目的操作数(寄存器)和数据段寄存器。将源操作数中所含的一个32位地址指针的段值部分(变量或标号所在地段的基址)送到数据段寄存器DS(LDS)或ES(LES)中,偏移部分(变量或标号所在段的位移量)送到目的操作数。LDS(LoadDataSegmentRegister)和LES(LoadExtraSegmentRegister)。Reg是16位寄存器,Mem必须是32位存储器指针;例如:LDSBX,DD_VAR;DD_VAR为双字变量将DD_VAR所在的段的段基址送到DS,将DD_VAR的偏移量送到BX。,2.2.2算术运算指令(20条),1加法指令ADD(ADDbyteorword)字节或字相加ADC(ADdbyteorwordwithCarry)带进位的字节或字相加INC(INCrementbyteorwordby1)字节或字加1。AAA(ASCIIAdjustforAddition)加法的ASCII码修正DAA(DecimalAdjustforAddition)加法的十进制修正2减法指令SUB(SUBtractbyteorword)字节或字相减SBB(SUBtractByteorwordwithcarry)带借位的字节或字相减NEG(NEGatebyteorword)字节或字求补CMP(COMParebyteorword)字节或字的比较DEC(DECrementbyteorwordby1)字节或字减1AAS(ASCIIAdjustforSubtraction)减法的ASCII码修正DAS(DecimalAdjustforSubtraction)减法的十进制校正,算术运算指令,3乘法指令MUL(MULtiplebyteorwordunsigned)无符号的字节或字相乘。IMUL(IntegerMULtiplebyteorword)整数字节或字相乘。AAM(ASCIIAdjustforMultiple)乘法的ASCII码修正4除法指令DIV(DIVidebyteorwordunsigned)无符号的字节或字相除。IDIV(IntegerDIVisionsigned)带符号数除法指令。AAD(ASCIIAdjustforDivision)除法的ASCII码修正。CBW(ConvertBytetoWord)字节转换为字。CWD(ConvertWordtoDoubleword)字转换为双字。,算术运算的数据格式,80X86提供的二进制算术运算指令包括二进制运算和十进制运算指令,能对二进制数(字节或字)直接进行算术运算,并且通过专门的调整指令,可以完成十进制数(BCD码)的算术运算。它提供的加、减、乘、除4种基本的算术运算指令,只能直接对整数进行操作,而不能直接对实数(浮点数)进行运算。对于无符号二进制数加法指令有:ADD,ADC,INC减法指令有:SUB,SBB,DEC乘法指令为:MUL除法指令为:DIV对于带符号的二进制数乘法指令为:IMUL除法指令为:IDIV;加、减法运算:与无符号二进制数的加、减法指令一样,算术运算的数据格式,对于压缩型BCD码加、减分两步来实现:先用一条无符号二进制数的加、减指令对压缩型BCD码进行加、减,在AL中产生一个中间结果(可能为不正确的结果);然后再执行一条加、减法的压缩型BCD码调整指令。加法调整指令为DAA;减法调整指令为DAS。调整指令将AL中的中间结果调整为最终正确的压缩型BCD码。压缩型BCD码不能进行乘、除运算对于非压缩型BCD码加、减、乘运算都是先用无符号二进制数的加、减、乘运算指令在AL中产生一个中间结果,然后,再执行一条调整指令,以便将AL中可能错误的中间结果调整成最终正确的非压缩型BCD码。其加法的调整指令为AAA;减法的调整指令为AAS;乘法的调整指令为AAM。非压缩型BCD码十进制数的除法运算与加、减、乘不同,除法不是先计算后校正,而是先校正后做除法。除法调整指令为AAD。非压缩型BCD码在进行加、减时,可以直接用09数字的ASCII码参加运算,而不必将高4位清零,这也是将非压缩型BCD码的调整指令称为ASCII码调整指令的缘故。而乘、除运算之前则必须将ASCII码高4位清零,即必须转换为真正的非压缩型BCD码后才能够进行相应运算。,二进制加法指令ADD,(1)加法指令ADD格式:ADDDST,SRC功能:(DST)+(SRC)DST影响状态标志:AF,CF,OF,PF,SF,ZF。说明:目的操作数可以是寄存器和存储器;源操作数可以是寄存器、存储器和立即数,但是两者不能同时是存储器。例:ADDAX,BX;(AX)+(BX)AXADDBX;同上,这里不写出目的操作数,隐含的目的操作数为AXADDAX,BX+SI;(AX)+(DS:BX+SI)AXADDAX,12;(AX)+12AXADDBXSI,AX;(DS:BX+SI)+(AX)DS:BX+SIADDBXSI,12;(DS:BXSI)+12(BXSI),二进制加法指令ADC,(2)带进位加法指令ADC格式:ADCDST,SRC功能:(DST)+(SRC)+CFDST影响状态标志:AF,CF,OF,PF,SF,ZF。说明:ADD和ADC指令既适用于无符号二进制数加法运算,也适用于带符号二进制数的加法运算。但是,它们的两个操作数必须同时为无符号数或同时为带符号数,并且同时为字节(8位数)或同时为字(16位数)。ADC指令多用于多字节加法运算,需要分步计算时很有用。例如,有两个两字节的数相加,AF8AH+0A90H,先进行低字节相加,然后做高字节相加,并且要加上进位,示意如下:,二进制加法指令INC,(3)加1指令INC格式:INCDST功能:(DST)+1DST影响状态标志:AF,OF,DF,SF,ZF。不影响进位标志CF。说明:目的操作数可以为通用寄存器,也可以为存储器,但不能是立即数。操作数可为字节或字,并被当作一个无符号二进制数,这一点不同于ADD,ADC。该指令常用于调整地址和计数器。例如:INCCXINCBLINCBYTEPTRBX;数据段中位移量BX的字节加1INCWORDPTRBX+SI;数据段中位移量为BX+SI处的字加1INCWORDPTRBP+SI;堆栈段中位移量为BP+SI处的字加1,二进制减法指令SUB,(4)减法指令SUB格式:SUBDST,SRC功能:(DST)(SRC)DST影响状态标志:AF,CF,OF,PF,SF,ZF。说明:目的操作数和源操作数的具体格式同ADD指令。例:SUBAX,BX;(AX)-(BX)AXSUBCL,6SUBWORDPRTBX,56,二进制减法指令SBB,(5)带借位减法指令SBB格式:SBBDST,SRC功能:(DST)(SRC)CFDST影响状态标志:AF,CF,OF,PF,SF,ZF。说明:要求同ADC,可用于多字节数值的减法程序。减法实际上是用加法做的。即先把源操作数(减数)变成其补码,把CF也变成补码(0的补码为0,1的补码为11111111(8位时)或1111111111111111(16位时),然后再做加法。例如:(DL)=03H,(BL)=64H,CF=1。指令:SBBBL,DL的执行结果是:(BL)=60H,示意如下:,二进制减法指令DEC、CMP,(6)减1指令DEC格式:DECDST功能:(DST)1DST影响状态标志:AF,OF,PF,SF,ZF。不影响进位标志CF。说明:目的操作数可为字节或字,并被视为无符号二进制数。例如:DECBX(7)比较指令CMP格式:CMPDST,SRC功能:(DST)(SRC),影响标志位。影响状态标志:AF,OF,PF,SF,ZF,CF。说明:该指令常用于比较两个数的大小,执行相减后只根据结果设置标志位,并不改变两个操作数的原值。其它要求同SUB指令。例如:CMPAX,BX,二进制减法指令NEG,(8)求补指令NEG格式:NEGDST功能:0减去目的操作数后送至目的操作数,使目的操作数符号变反。例如,+1变成-1,-变成+2。即实现:0(DST)DST.影响状态标志:AF,CF,OF,PF,SF和ZF。但要注意:除了操作数为0以外,CF总是1;操作数为0时CF置0。说明:利用NEG指令可以实现求一个数的相反数。举例:(1)实现0(AL)的运算。NEGAL(2)AX中存放一负数,求该数的绝对值。NEGAX,二进制加减运算的有效性,加减指令同时会影响到标志寄存器的CF和OF,这两个标志位主要是为算术运算设计的,设计规则如下:(1)当符号位(即最高位)有进位时,CF=1,否则CF=0。CF可以用来表示无符号数的溢出。(2)数据位向符号位有进位,但符号位不再产生进位时有溢出,或者符号位产生进位但数据位不向符号位进位时也产生溢出。OF可以用来表示带符号数的溢出。下面用实例来总结CF,OF和运算有效性之间的关联规律。(1)CF=0,OF=0符号位无进位CF=0,数据位向符号位无进位OF=0,二进制加减运算的有效性,(2)CF=1,OF=0符号位有进位CF=1,数据位向符号位也有进位OF=0,(3)CF=0,OF=1符号位无进位CF=0,数据位向符号位有进位OF=1,二进制加减运算的有效性,(4)CF=1,OF=1符号位有进位CF=1,并且数据位向符号位无进位OF=1,标志位与运算结果的有效性关系,二进制加减运算举例(1),例1执行指令ADDDX,0F0F0H,二进制加减运算举例(2),例2执行两个双精度数的加法。设目的操作数在DX和AX中,DX为高位,源操作数在BX和CX中,BX为高位。(DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H,指令序列为ADDAX,CXADCDX,BX第一条指令执行后:第二条指令执行后:,二进制加减运算举例(3),例3执行指令SUBSI+14H,0136H,二进制加减运算举例(4),例4执行指令SUBDH,BP+4,二进制加减运算举例(5),例5设X,Y,Z均为双精度数,它们分别存放在X,X+2;Y,Y+2;Z,Z+2存储单元中,存放时高位字在高地址,低位字在低地址,用指令实现下列运算,结果存放在W,W+2单元。W=X+Y+24-Z,二进制乘法指令MUL、IMUL,(9)无符号乘法指令MUL(UnsignedMultiple)(10)带符号乘法指令IMUL(SignedMultiple)格式:MULSRC_reg/mIMULSRC_reg/m功能:把源操作数与隐含目的操作数AL或AX相乘,结果保存到AX或(DX,AX)中。说明:源操作数可以使用除立即数方式外的各种寻址方式;若源操作数是8位,则与AL相乘,实现字节型乘法:(AL)*(SRC)8AX若源操作数是16位,则与AX相乘,实现字型乘法:(AX)*(SRC)16(DX,AX),二进制乘法指令IMUL,影响状态标志:AF,CF,OF,PF,SF和ZF,但只有CF、OF有意义,其它标志不确定。对于MUL指令,若乘积的高半部分(AH或DX)为0,则对CF和OF清0,否则OF、CF均为1。可以用来检查结果是字节、字或者是双字。对于IMUL指令,如果乘积的高一半是低一半的符号扩展,则CF和OF均为0,否则就均为1。举例:MOVAL,8MULBL;(AL)*(BL),结果在AX中MOVAX,1234HMULWORDPRTBX;(AX)*(BX),结果在DX:AX中MOVAL,80HSUBAH,AH;AH清0MULBX;(AX)*(BX),结果在DX:AX中,二进制除法指令DIV,(11)无符号除法指令DIV格式:DIVSRC_reg/m功能:将AX或(DX,AX)中无符号被除数除以源操作数中的无符号除数。对于8位除数的除法运算,被除数在AX中;对于16位除数的除法运算,被除数在(DX,AX)中。运算后将商送回累加器AL或AX,将余数送到AH或DX。商或余数均为无符号数。具体操作:字节型除法:(AX)/(SRC)8商:AL,余数:AH字节型除法:(DX,AX)/(SRC)16商:AX,余数:DX影响状态标志:无定义。若除数为0或商超出操作数的范围,会产生除法错中断,类型号为0.,二进制除法指令DIV,举例:(1)计算135100,可用以下指令序列来实现:MOVAX,135;被除数135AXMOVBL,100;除数100BLDIVBL;(AX)(BL)商1AL,余数35AH(2)计算125321000,可用下列指令序列实现:MOVAX,12532;被除数12532AXMOVDX,0;0DXMOVBX,1000;除数1000BXDIVBX;DXAX(BX)商12AX,余数532DX,二进制除法指令IDIV,(12)带符号除法指令IDIV格式:DIVSRC_reg/m功能:实现两个带符号二进制数相除,与DIV指令类似,但操作数必须是带符号数,商和余数也是带符号数。说明:带符号数的除法指令IDIV规定:余数和被除数的符号相同。这样规定就使得商和余数是唯一的。例如:-26(+)=-3(商),余数为-5,是正确的;-26(+)=-4(商),余数为+2,是错误的。除法指令源操作数的寻址方式可以使用除立即数之外的各种寻址方式;,字节、字扩展指令CBW/CWD,(13)字节转换为字指令CBW格式:CBW功能:将AL的符号扩充到AH说明:如(AL)最高位为0,则(AH)=00;如(AL)最高位为1,则(AH)=0FFH;(14)字转换为双字指令CWD格式:CWD功能:将AX的符号扩充到DX说明:如(AX)最高位为0,则(DX)=0000;如(AX)最高位为1,则(DX)=0FFFFH;,算术运算综合举例,计算(V(X*Y+Z540)/X,其中X、Y、Z、V均为16位带符号数,已分别装入X、Y、Z、V单元中,要求计算结果商存入AX,余数存入DX寄存器。,十进制算术运算,(1)对于压缩型BCD码加、减分两步来实现:先用一条无符号二进制数的加、减指令对压缩型BCD码进行加、减,在AL中产生一个中间结果(可能为不正确的结果);然后再执行一条加、减法的压缩型BCD码调整指令。加法调整指令为DAA;减法调整指令为DAS。调整指令将AL中的中间结果调整为最终正确的压缩型BCD码。压缩型BCD码不能进行乘、除运算,十进制运算调整指令DAA,DAA(decimaladjustforaddition)加法的十进制调整指令格式:DAA功能:跟在二进制加法指令之后,把AL中的结果调整成压缩BCD码并送回AL.说明:参与二进制加法指令的两个操作数必须是压缩BCD码,DAA指令必须在ADD或ADC指令之后,二进制加法的和必须在AL寄存器中。调整规则:如果AL低四位组成的二进制数大于9或者辅助进位标志AF=1,则将AL加上06H,并使AF=1;如果AL高四位组成的二进制数大于9或者进位标志CF=1,则将AL加上60H,并使CF=1;影响标志位:除OF标志无影响外,影响其它标志。,十进制运算调整指令,DAS(decimaladjustforsubtraction)减法的十进制调整指令格式:DAS功能:跟在二进制减法指令之后,把AL中的结果调整成两位压缩BCD码并送回AL.说明:参与二进制减法指令的两个操作数必须是压缩BCD码,DAS指令必须在SUB或SBB指令之后,二进制减法的差必须在AL寄存器中。调整规则:如果AL低四位组成的二进制数大于9或者辅助进位标志AF=1,则将AL减去06H,并使AF=1;如果AL高四位组成的二进制数大于9或者进位标志CF=1,则将AL减去60H,并使CF=1;影响标志位:除OF标志无影响外,影响其它标志。,十进制算术运算,(2)对于非压缩型BCD码09十个数字的ASCII码可以看作非压缩BCD码。加、减、乘运算都是先用无符号二进制数的加、减、乘运算指令在AL中产生一个中间结果,然后,再执行一条调整指令,以便将AL中可能错误的中间结果调整成最终正确的非压缩型BCD码。其加法的调整指令为AAA;减法的调整指令为AAS;乘法的调整指令为AAM。非压缩型BCD码十进制数的除法运算与加、减、乘不同,除法不是先计算后校正,而是先校正后做除法。除法调整指令为AAD。非压缩型BCD码在进行加、减时,可以直接用09数字的ASCII码参加运算,而不必将高4位清零,这也是将非压缩型BCD码的调整指令称为ASCII码调整指令的缘故。而乘、除运算之前则必须将ASCII码高4位清零,即必须转换为真正的非压缩型BCD码后才能够进行相应运算。,十进制运算调整指令,AAA(ASCIIadjustforaddition)加法的ASCII调整指令格式:AAA功能:跟在二进制加法指令之后,把AL中的结果调整成非压缩BCD码并送回AL.说明:参与二进制加法指令的两个操作数必须是ASCII码或非压缩BCD码,AAA指令必须在ADD或ADC指令之后,二进制加法的和必须在AL寄存器中。调整步骤:(1)如AL低4位在09之间且AF=0,则跳过第(2)步,执行第(3)步;(2)如AL低4位在十六进制数AF之间或AF=1,则将AL加上06H,AH内容加1,并使AF=1;(3)清除AL寄存器的高4位;(4)AF位的值送CF位.影响标志位:影响AF/CF标志,其它标志无定义。,十进制运算调整指令,AAS(ASCIIadjustforsubtraction)减法的ASCII调整指令格式:AAS功能:跟在二进制减法指令之后,把AL中的结果调整成非压缩BCD码并送回AL.说明:参与二进制减法指令的两个操作数必须是ASCII码或非压缩BCD码,AAS指令必须在SUB或SBB指令之后,二进制减法的差必须在AL寄存器中。调整步骤:(1)如AL低4位在09之间且AF=0,则跳过第(2)步,执行第(3)步;(2)如AL低4位在十六进制数AF之间或AF=1,则将AL减去06H,AH内容减1,并使AF=1;(3)清除AL寄存器的高4位;(4)AF位的值送CF位.影响标志位:影响AF/CF标志,其它标志无定义。,十进制运算调整指令,AAM(ASCIIadjustformultiplication)加法的ASCII调整指令格式:AAM功能:跟在二进制乘法指令MUL之后,对AL中的结果进行调整,调整后的非压缩BCD码在AX中.说明:参与MUL指令的两个操作数必须是非压缩BCD码,AAM指令必须在MUL指令之后,AX中的二进制乘积的有效部分在AL中,该乘积的最大值不会超过81,调整的非压缩BCD码结果在AX中。调整步骤:把AL内容除以0AH,商放在AH中,余数保存在AL中。影响标志位:影响SF/ZF/PF标志,其它标志无定义,十进制运算调整指令,AAD(ASCIIadjustfordivision)减法的ASCII调整指令格式:AAD功能:AAD指令在二进制除法指令DIV之前,对AX中的非压缩BCD码进行调整,以便执行DIV指令之后,得到非压缩BCD码形式的商在AL中,余数在AH中.说明:调整前AH中为非压缩BCD码的十位上的数,AL中为个位。调整步骤:把AX中的被除数调整成二进制数,并存放在AL中,内容除以0AH,商放在AH中,余数保存在AL中。影响标志位:影响SF/ZF/PF标志,其它标志无定义以上讨论都没有涉及到符号问题,对于带符号的十进制数,需要用附加的字节作为符号标志。,2.2.3逻辑运算指令(13条),(1)逻辑指令(logical)NOT(NOTbyteorword)字节或字逻辑非AND(ANDbyteorword)字节或字的逻辑与OR(InclusiveORbyteorword)字节或字的逻辑或XOR(eXclusiveORbyteorword)字节或字的逻辑异或TEST(TESTbyteorword)字节或字的测试(2)移位指令(shifts)SHL(SHiftLogicalLeftbyteorword)字节或字的逻辑左移SAL(SHiftArithmeticLeftbyteorword)字节或字的算术左移SHR(SHiftlogicalRightbyteorword)字节或字的逻辑右移SAR(ShiftArithmeticRightbyteorword)字节或字的算术右移ROL(ROtateLeftbyteorword)字节或字的循环左移ROR(ROtateRightbyteorword)字节或字的循环右移RCL(RotatethroughCarryLeftbyteorword)字节或字带进位循环左移RCR(RotatethroughCarryRightbyteorword)字节或字带进位循环右位,逻辑指令NOTANDORXORTEST,(1)逻辑指令(logical)逻辑指令可以对字或字节按位执行逻辑运算。格式:ANDDST,SRC;按位相与,结果送(DST)ORDST,SRC;按位相或,结果送(DST)XORDST,SRC;按位异或,结果送(DST)NOTOPR;对操作数按位取反TESTOPR1,OPR2;按位相与,结果影响标志位但不保存说明:(1)NOT指令不允许使用立即数;(2)NOT指令不影响标志位,其余4条指令对CF和OF清0,影响SF、ZF、PF,对AF无定义。,逻辑指令举例,;对AL中的值按位求反MOVAL,00001111BNOTAL;清0高四位,低四位不变ANDAL,0FH;使高四位置位,低四位不变ORAL,0F0H;使61H端口的D1、D7位变反INAL,61HXORAL,82HOUT61H,AL;使AX清0XORAX,AX,;设系统中打印机的状态端口是379H,其D7位是忙闲标志位,D7=0表示忙,D7=1表示闲,测试打印机状态,控制程序执行。MOVDX,379HWT:INAL,DXTESTAL,80HJZWT,移位指令,基本移位指令格式:SHLOPR,CNT;逻辑左移CNT次SALOPR,CNT;算术左移CNT次SHROPR,CNT;逻辑右移CNT次SAROPR,CNT;算术右移CNT次循环移位指令格式:ROLOPR,CNT;循环左移CNT次ROROPR,CNT;循环右移CNT次RCLOPR,CNT;带进位逻辑左移CNT次RCROPR,CNT;带进位循环右移CNT次,(1)SHL/SAL(2)SHR(3)SAL(4)ROL(5)ROR(6)RCL(7)RCR,移位指令,说明:(1)操作数OPR可以为8、16或32位,可以用立即数之外的任何寻址方式;(2)CNT1时,直接在指令中写出,CNT1时,在CL寄存器给出;(3)CF中总是最后移出的一位,ZF/SF/PF按结果设置,当CNT=1时,如果移位使符号位变化,则使OF=1,否则OF=0。(4)SAR指令使最高位右移,保持其自身的值不变。举例:设无符号数X在AL中,用移位指令实现X*10的运算。MOVAH,0SALAX,1MOVBX,AXMOVCL,2SALAX,CLADDAX,BX,2.2.4字符串指令(5条),MOVSMOVSBMOVSW(MOVByteorWordString)传送字节串或字串。STOSSTOSBSTOSW(STOreByteORWordString)存字节串或字串。LODSLODSBLODSW(LOaDByteorWordString)取字节串或字串。以上各条指令前可使用重复前缀指令REPCMPSCMPSBCMPSW(COMPareByteorWordString)比较字节或字串。SCASSCASBSCASW(SCAnByteorWordString)搜索字节串或字串。以上各条指令前可使用重复前缀指令REPEREPZREPNZ,字符串指令,(1)串传送指令格式:MOVSDST,SRCMOVSB(字节传送)MOVSW(字传送)操作:(DI)(SI),且自动修改SI/DI指针:若DF=0:字节操作时,SI/DI各加1,字操作时,SI/DI各加2;若DF=1:字节操作时,SI/DI各减1,字操作时,SI/DI各减2;该指令不影响标志位。说明:第一种格式应在操作数中表明是字节还是字操作,用如下格式:MOVSES:BYTEPTRDI,DS:SI且这种寻址方式是固定的,不允许其他寻址方式。源串是指由DS:SI指向的字节或字符串目标串是指由ES:DI指向的字节或字符串,字符串指令,(2)存入串指令格式:STOSDSTSTOSB(存字节)STOSW(存字)操作:字节操作:(DI)(AL)字操作:(DI)(AX)自动修改SI/DI指针:若DF=0:字节操作时,SI/DI各加1,字操作时,SI/DI各加2;若DF=1:字节操作时,SI/DI各减1,字操作时,SI/DI各减2;该指令不影响标志位。说明:,字符串指令,(3)从串取指令格式:LODSDST,SRCLODSB(取字节)LODSW(取字)操作:字节操作:(AL)(SI)字操作:(AX)(SI)自动修改SI/DI指针:若DF=0:字节操作时,SI/DI各加1,字操作时,SI/DI各加2;若DF=1:字节操作时,SI/DI各减1,字操作时,SI/DI各减2;该指令不影响标志位。说明:,字符串指令,指令前缀:REP重复串操作直到CX=0格式:REPMOVSB或REPLODS或REPSTOS操作:(1)如(CX)=0则退出REP,否则执行下面步骤;(2)(CX)=(CX)1;(3)执行其后的串操作;(4)

温馨提示

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

评论

0/150

提交评论