ibm-pc汇编语言程序设计(沈美明第二版)第二章指令与寻址.ppt
汇编语言程序设计汇编语言程序设计北京理工大学北京理工大学 电子工程系电子工程系马永锋马永锋第二章第二章 汇编语言指令系统和寻址方式汇编语言指令系统和寻址方式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所需时间所需时间数据传送指令(数据传送指令(14条)条)1.通用数据传送指令通用数据传送指令 MOV(MOVe byte or word)传送字节或字。POP(POP word off stack)字退栈。PUSH(PUSH Word into stack)字进栈。XCHG(Exchange byte or word)字节或字交换。XLAT(Translate byte)字节换码2.输入输出指令输入输出指令 IN(INput byte or word)输入字节或字。OUT(OUTput byte or word)输出字节或字。3.标志寄存器传送指令标志寄存器传送指令 LAHF(Load AH register from Flags)取标志到AH。SAHF(Store AH register in Flags)取AH到标志。PUSHF(PUSH Flags into stack)标志进栈。POPF(POP Flags off stack)标志退栈。4.地址传送指令地址传送指令 LEA(Load Effective Address)取有效地址。LDS(Load pointer using DS)取指示器到DS。LES(Load pointer using ES)取指示器到ES。除指令SAHF和POPF指令外,本类的其它指令都不影响标志位。1 通用数据传送指令通用数据传送指令(1)传送指令)传送指令 MOV(Move Instruction)传送指令是使用最频繁的指令,它相当于高级语言中的赋值语句。格式:格式:MOV Reg/Mem,Reg/Mem/Imm功能:功能:把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。说明:说明:源操作数可以是立即数、通用寄存器、存储器以及段寄存器;目的操作数可以是通用寄存器、存储器和除CS外的段寄存器,目的操作数不能是立即数。当存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。注释:RegRegister(寄存器),MemMemory(存储器),ImmImmediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。通用数据传送指令通用数据传送指令MOV对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。n两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV BL,AX等是不正确的;n两个操作数不能同时为段寄存器,如:MOV ES,DS等;n代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV CS,AX等不正确,但指令MOV AX,CS等是正确的;n立即数不能直接传给段寄存器,如:MOV DS,100H等;n立即数不能作为目的操作数,如:MOV 100H,AX等;n指令指针IP,不能作为MOV指令的操作数;n两个操作数不能同时为存储单元,如:MOV VARA,VARB等,其中VARA和VARB是同数据类型的内存变量。对于规定2、4和7,我们可以用通用寄存器作为中转来达到最终目的。通用数据传送指令通用数据传送指令MOV数据传送方向搭配图数据传送方向搭配图通用数据传送指令通用数据传送指令MOV举例:(1)寄存器与寄存器之间的数据传送例如:MOV AX,BX;(BX)AXMOV DL,AH;(AH)DLMOV DX,ES;(ES)DXMOV DS,AX;(AX)DSMOV AX,CS;(CS)AX 注意:源操作数和目的操作数的数据类型必须一致,可以同时是字节寄存器或字寄存器,不能同时为段寄存器;代码段寄存器CS不能为目的操作数;指令指针IP不能作为操作数。MOV指令不影响状态标志通用数据传送指令通用数据传送指令MOV举例:(2)立即数传送到通用寄存器立即数传送到通用寄存器是指立即数传送给AX,BX,CX,DX,BP,SP,SI,DI以及AH,AL,BH,BL,CH,CL,DH,DL寄存器,但不能传送到段寄存器。例如:MOV AX,100Q;100QAXMOV BX,0FFFFH;0FFFFHBXMOV AL,-2;0FFFEHALMOV CH,100B;100BCHMOV DL,A;65DLMOV SI,OFFSET TABLE;OFFSET TABLESI注意:立即数与寄存器数据类型必须一致,立即数可以是二进制、八进制、十进制、十六进制的常数,可以是带符号或无符号的整数,也可以是ASCII字符。通用数据传送指令通用数据传送指令MOV举例:(3)寄存器与存储器之间的数据传送寄存器与存储器之间的数据传送是指除了CS和IP以外的所有寄存器与内存储器之间的数据传送。例如:MOV AL,BUFFER;(BUFFER)ALMOV AX,SI ;(DS)10H+(SI)AXMOV DI,DX ;(DX)(DS)10H+(DI)MOV BX+DI,DL ;(DL)(DS)10H+(BX)+(DI)MOV SI,ES:BP ;(ES)10H+(BP)SIMOV AX,ABXSI;(DS)10H+(BX)(SI)+A位移)AX(4)立即数传送到存储器立即数的数据类型与存储器变量的类型一致。例如:MOV A,3 ;3同A的类型一致MOV BYTE PTR SI,3 ;3为一个字节MOV WORD PTR BX,3 ;3为一个字MOV B1BXDI1,30H ;30H同B1变量的类型一致存储器操作数可以采用各种存储器寻址方式。(2)堆栈指令)堆栈指令POP/PUSH堆栈的概念堆栈的概念堆栈堆栈也称作栈栈(Stack),是一种具有后进先出访问方式的存储空间;堆栈是先进后出(Last In First Out)的线性表,简称LIFO表,堆栈允许插入和删除的一端称作栈顶,另外一端称作栈底。堆栈就是限制在顶端进行插入和删除的线性表。见示意图堆栈有两个基本操作:入栈(push)和出栈(pop)。入栈就是将一个新的元素放入栈顶,这一个元素只能够是字,不能是字节。入栈也称作压栈。出栈则是从栈顶取出一个元素。其中栈顶的元素总是最后入栈最先出栈。出栈也称作退栈或弹出。堆栈指令堆栈指令POP/PUSH8086的堆栈机制的堆栈机制8086 CPU中提供了堆栈的机制,将一段内存当作栈来使用,并通过8086的相关指令以栈的方式访问内存。堆栈操作过程中,段寄存器SS指向用于堆栈的内存段,SP指向该堆栈的栈顶,把它们合在一起就可以访问栈顶单元。堆栈的深度由SP的初值决定。入栈指令:入栈指令:PUSH 格式:格式:PUSH Reg/Mem PUSH Imm;80286+功能:功能:一个字进栈,系统自动完成两步操作:首先SPSP-2,使栈顶指针指向一个新位置,然后(SP)操作数;出栈指令:出栈指令:POP 格式:格式:POP Reg/Mem功能:功能:弹出一个字,系统自动完成两步操作:首先弹出操作数(SP),然后SPSP+2,使栈顶指针指向新的栈顶位置;堆栈指令堆栈指令POP/PUSH举例:举例:PUSH AX ;(SP)-2SP且(SP),(SP)1)(AX)PUSH BX ;将(BX)压入堆栈PUSH SS ;将(SS)压入堆栈PUSH CS ;将(CS)压入堆栈(这是合法的)PUSH BETA ;将BETA存储字的内容压入堆栈PUSH BETABX;将BETABX一个字的内容压入堆栈PUSH BETABXSI;将BETABX+SI一个字的内容压入堆栈POP BETABXSIPOP BETABXPOP BETAPOP A ;因为POP CS是非法的POP SSPOP BXPOP AX 堆栈指令堆栈指令POP/PUSH假设AX=4243H,执行指令“PUSH AX”,进栈前后堆栈段的情况如a、b所示,执行指令“POP BX”,堆栈段情况如图b、c所示。(a)进栈前堆栈段(b)进栈后和出栈前堆栈段(c)出栈后堆栈段 堆栈指令堆栈指令POP/PUSH注意:注意:(1)因为堆栈指针SP总是指向已经存入数据的栈顶,所以PUSH指令是先(SP)-2SP,然后将内容压栈,即先修改SP使之指向堆栈中的空闲单元,后将内容压栈。而POP是先从栈顶弹出一个字,然后将堆栈指针(SP)+2SP以便使刚刚弹出的堆栈字空间释放;(2)因为SP总是指向栈顶,而用PUSH和POP指令存取数时都是在栈顶进行的,所以堆栈是“先进后出”或称作“后进先出”。栈底在高地址,堆栈是从高地址向低地址延伸的,所以栈底就是最初的栈顶;(3)PUSH CS 是合法的,但POP CS是非法的;(4)PUSH 和POP的操作数都不能是立即数;(5)用PUSH指令和POP指令时只能按字访问堆栈,不能按字节访问堆栈;(6)PUSH和POP指令都不影响标志。堆栈指令堆栈指令POP/PUSH.model small .stack 4h .code go:mov ah,A mov al,B mov bh,C mov bl,D push ax push bx pop ax pop bx mov ah,4ch int 21h end go(3)交换指令)交换指令XCHG格式:格式:XCHG Reg/Mem,Reg/Mem功能:功能:将源操作数和目的操作数相互交换。目的操作数和源操作数同时为字节或字。例如例如:XCHG AX,BX ;AX与BX寄存器内容交换 XCHG SI,AX ;SI与AX内容交换 XCHG AL,BL ;AL与BL内容交换 XCHG WORD_VAR,CX ;变量WORD_VAR与CX寄存器内容交换 XCHG DH,BYTE_VAR ;DH与变量BYTE_VAR内容交换 XCHG SI+3,AL ;DS:SI+3所指的内容与AL内容交换交换指令交换指令XCHG注意:注意:(1)XCHG指令不影响状态标志。(2)操作数可以是通用寄存器和存储器,但不包括段寄存器,也不能为立即数。(3)源操作数和目的操作数不能同时为存储器,因此不能直接实现两个存储器单元的内容交换。若要进行存储器(字)变量A和存储器(字)变量B的内容交换,可以借用一个通用寄存器来实现:MOV AX,B XCHG AX,A MOV B,AX 交换指令交换指令XCHG举例:举例:用XCHG指令将字符串S1与S2的内容进行交换源程序如下:DATA SEGMENTS1 DB ABCDEFGS2 DB 0123456N DW$-OFFSET S2 ;N为字符串长度DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV SI,0 MOV CX,N;将字符的个数送至CX中L1:MOV AL,S1SI XCHG AL,S2SI MOV S1SI,AL;借助寄存器AL将S1SI与S2SI交换 INC SI LOOP L1;循环N次 MOV AH,4CH INT 21HCODE ENDS END START(4)查表转换指令)查表转换指令XLAT格式:格式:XLAT功能:功能:换码表中的一个字节,称为换码字节,用换码字节来置换累加器AL中的内容,即ALBXAL。说明:说明:该指令有两个隐含操作数BX和AL,换码表的表首由DS:BX指向,要换的码在表中的位移由寄存器AL中的内容指出。指令执行后即将表中要换的码置入AL中,即DS:BX+ALAL。查表转换指令查表转换指令XLAT举例:利用XLAT指令将计算机机内二进制表示的十六进制转换成ASCII码并显示输出源程序如下:DATA SEGMENTHEX_NUM DB 0,1,2,3,4,5,6,7,8,9,0AH,0BH,0CH,0DH,0EH,0FHTABLE DB 0123456789ABCDEFDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AXMOV CX,16MOV BX,OFFSET TABLEMOV SI,OFFSET HEX_NUM查表转换指令查表转换指令XLAT L:MOV AL,SIXLAT TABLE;换码DS:BX+ALALMOV DL,ALMOV AH,02H;显示输出INT 21HMOV DL,INT 21HINC SILOOP LMOV AH,4CH INT 21HCODE ENDSEND START2 输入输出指令输入输出指令IN/OUT格式一:格式一:端口输入端口输入 IN AL,port 端口输出端口输出 OUT port,AL功能:功能:IN从指定的外设端口读数据到AL寄存器,OUT将AL寄存器的内容传送到指定的外设端口。说明:说明:这里端口地址port为立即数,限制在0255,只能使用AX或AL收发端口数据。格式二格式二:端口输入端口输入 MOV DX,port IN AL,DX 端口输出端口输出 MOV DX,port OUT DX,AL说明:说明:这里端口地址可以在0655353 标志寄存器传送指令标志寄存器传送指令(1)LAHF指令(Load AH with Flags)格式:格式:LAHF功能:功能:将标志寄存器的状态标志SF,ZF,AF,PF,CF位传送至AH寄存器的对应位,AH寄存器的其余3位内容不变,其操作如图所示:标志寄存器传送指令标志寄存器传送指令(2)SAHF指令(Store AH into Flags)格式:SAHF功能:将AH的指定位(与状态标志对应的位)传送至标志寄存器(即与LAHF指令传送方向相反)。其操作示意如下图所示 该条指令把寄存器AH的指定位送至标志寄存器低8位的SF,ZF,AF,PF和CF标志位,因而这些标志的内容会受到影响。但这条指令不影响溢出标志OF、方向标志DF、中断允许标志IF和追踪标志TF,即不影响标志寄存器的高位字节。标志寄存器传送指令标志寄存器传送指令(3)PUSHF指令(PUSH Flags)格式:格式:PUSHF功能:功能:将标志寄存器的内容压入堆栈。先将堆栈指针减2(即(SP)-2SP),然后将整个标志寄存器(16位)的内容压入SP所指向的栈顶。这条指令不影响状态标志。(4)POPF指令(POP Flags)格式:格式:POPF功能:功能:标志寄存器退栈。先将堆栈顶的内容,即(SP)+1,(SP)传送至标志寄存器(16位)中,然后将堆栈指针SP加2,即(SP)+2SP。执行该指令后,标志寄存器的各位会发生相应的变化,因此,该指令影响标志寄存器。4 地址传送指令地址传送指令(1)有效地址传送指令有效地址传送指令LEA(Load Effective Address)格式:格式:LEA Reg,Mem 功能:功能:把源操作数的有效地址传送至目的操作数寄存器说明:说明:该指令通常用来对指针或变址寄存器BX、DI或SI等置初值之用。目的操作数为16位的通用寄存器(即AX,BX,CX,DX,SP,BP,SI,DI之一);源操作数是存储器操作数,如变量、标号或地址表达式例如:LEA BX,BUFFER;将变量BUFFER的位移量送入BX中LEA DX,BUFARRAYBXSI ;将数组元素的位移量送入DX中LEA AX,BPDI ;将有效地址(BP)+(DI)送入AX中地址传送指令地址传送指令注意:(1)LEA指令处理的是变量的地址(即变量的位移量),而不是变量的内容(即变量的值)。(2)LEA指令和MOV指令有本质上的区别。假设变量BUFFER的偏移是1000H,该字变量的值是4243H,则指令“LEA AX,BUFFER”是将偏移1000H送入AX中,而指令“MOV AX,BUFFER”是将值4243H送入AX中。MOV指令也可以传送有效地址(位移量),但必须用OFFSET操作符作用于变量,“MOV AX,OFFSET BUFFER”将变量BUFFER的位移量送入AX中。(3)LEA指令的源操作数可以带下标,即LEA指令可以传送任意数组元素的位移量。例如指令“LEA DX,BUFARRAYBXSI”是将数组元素BUFARRAYBXSI的位移量传送至DX中。而MOV指令用OFFSET操作符则不能直接取数组元素的位移量,只能取数组的第一个元素的位移量(即数组的起始地址)。(4)LEA指令的源操作数必须是存储器操作数。(5)LEA指令的目的操作数必须是16位寄存器。(6)LEA指令不影响状态标志。地址传送指令地址传送指令(2)取段寄存器指令)取段寄存器指令(Load Segment Instruction)格式:格式:LDS/LES Reg,Mem 功能:功能:将双字指针传送至目的操作数(寄存器)和数据段寄存器。将源操作数中所含的一个32位地址指针的段值部分(变量或标号所在地段的基址)送到数据段寄存器DS(LDS)或ES(LES)中,偏移部分(变量或标号所在段的位移量)送到目的操作数。LDS(Load Data Segment Register)和LES(Load Extra Segment Register)。Reg是16位寄存器,Mem必须是32位存储器指针;例如:LDS BX,DD_VAR;DD_VAR为双字变量 将DD_VAR所在的段的段基址送到DS,将DD_VAR的偏移量送到BX。算术运算指令(算术运算指令(20条)条)1 加法指令加法指令 ADD(ADD byte or word)字节或字相加 ADC(ADd byte or word with Carry)带进位的字节或字相加 INC(INCrement byte or word by 1)字节或字加1。AAA(ASCII Adjust for Addition)加法的ASCII码修正 DAA(Decimal Adjust for Addition)加法的十进制修正2 减法指令减法指令 SUB(SUBtract byte or word)字节或字相减 SBB(SUBtract Byte or word with carry)带借位的字节或字相减 NEG(NEGate byte or word)字节或字求补 CMP(COMPare byte or word)字节或字的比较 DEC(DECrement byte or word by 1)字节或字减1 AAS(ASCII Adjust for Subtraction)减法的ASCII码修正 DAS(Decimal Adjust for Subtraction)减法的十进制校正算术运算指令算术运算指令3 乘法指令乘法指令 MUL(MULtiple byte or word unsigned)无符号的字节或字相乘。IMUL(Integer MULtiple byte or word)整数字节或字相乘。AAM(ASC II Adjust for Multiple)乘法的ASCII码修正4 除法指令除法指令 DIV(DIVide byte or word unsigned)无符号的字节或字相除。IDIV(Integer DIVision signed)带符号数除法指令。AAD(ASCII Adjust for Division)除法的ASCII码修正。CBW(Convert Byte to Word)字节转换为字。CWD(Convert Word to Double word)字转换为双字。算术运算的数据格式算术运算的数据格式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格式:格式:ADD DST,SRC功能功能:(DST)+(SRC)DST影响状态标志:影响状态标志:AF,CF,OF,PF,SF,ZF。说明:说明:目的操作数可以是寄存器和存储器;源操作数可以是寄存器、存储器和立即数,但是两者不能同时是存储器。例:ADD AX,BX ;(AX)+(BX)AXADD BX ;同上,这里不写出目的操作数,隐含的目的操作数为AXADD AX,BX+SI;(AX)+(DS:BX+SI)AXADD AX,12;(AX)+12 AXADD BXSI,AX;(DS:BX+SI)+(AX)DS:BX+SIADD BXSI,12;(DS:BXSI)+12(BXSI)二进制二进制加法指令加法指令 ADC(2)带进位加法指令)带进位加法指令 ADC格式:格式:ADC DST,SRC功能功能:(DST)+(SRC)+CF DST影响状态标志:影响状态标志:AF,CF,OF,PF,SF,ZF。说明:说明:ADD和ADC指令既适用于无符号二进制数加法运算,也适用于带符号二进制数的加法运算。但是,它们的两个操作数必须同时为无符号数或同时为带符号数,并且同时为字节(8位数)或同时为字(16位数)。ADC指令多用于多字节加法运算,需要分步计算时很有用。例如,有两个两字节的数相加,AF8AH+0A90H,先进行低字节相加,然后做高字节相加,并且要加上进位,示意如下:二进制二进制加法指令加法指令 INC(3)加)加1指令指令 INC格式:格式:INC DST功能:功能:(DST)+1 DST影响状态标志:影响状态标志:AF,OF,DF,SF,ZF。不影响进位标志CF。说明:说明:目的操作数可以为通用寄存器,也可以为存储器,但不能是立即数。操作数可为字节或字,并被当作一个无符号二进制数,这一点不同于ADD,ADC。该指令常用于调整地址和计数器。例如:INC CX INC BL INC BYTE PTRBX ;数据段中位移量BX的字节加1 INC WORD PTRBX+SI ;数据段中位移量为BX+SI处的字加1 INC WORD PTRBP+SI ;堆栈段中位移量为BP+SI处的字加1二进制减二进制减法指令法指令 SUB(4)减法指令)减法指令 SUB格式:格式:SUB DST,SRC功能功能:(DST)(SRC)DST影响状态标志:影响状态标志:AF,CF,OF,PF,SF,ZF。说明:说明:目的操作数和源操作数的具体格式同ADD指令。例:SUB AX,BX ;(AX)-(BX)AXSUB CL,6SUB WORD PRTBX,56二进制减二进制减法指令法指令 SBB(5)带借位减法指令)带借位减法指令 SBB格式:格式:SBB DST,SRC功能功能:(DST)(SRC)CF DST影响状态标志:影响状态标志:AF,CF,OF,PF,SF,ZF。说明:说明:要求同ADC,可用于多字节数值的减法程序。减法实际上是用加法做的。即先把源操作数(减数)变成其补码,把CF也变成补码(0的补码为0,1的补码为1111 1111(8位时)或1111 1111 1111 1111(16位时),然后再做加法。例如:(DL)=03H,(BL)=64H,CF=1。指令:SBB BL,DL的执行结果是:(BL)=60H,示意如下:二进制减二进制减法指令法指令 DEC、CMP(6)减)减1指令指令 DEC格式:格式:DEC DST功能功能:(DST)1 DST影响状态标志:影响状态标志:AF,OF,PF,SF,ZF。不影响进位标志CF。说明:说明:目的操作数可为字节或字,并被视为无符号二进制数。例如:DEC BX(7)比较指令)比较指令 CMP格式:格式:CMP DST,SRC功能功能:(DST)(SRC),影响标志位。影响状态标志:影响状态标志:AF,OF,PF,SF,ZF,CF。说明:说明:该指令常用于比较两个数的大小,执行相减后只根据结果设置标志位,并不改变两个操作数的原值。其它要求同SUB指令。例如:CMP AX,BX二进制减二进制减法指令法指令 NEG(8)求补指令)求补指令 NEG格式格式:NEG DST功能:功能:0减去目的操作数后送至目的操作数,使目的操作数符号变反。例如,+1变成-1,-变成+2。即实现:0(DST)DST.影响状态标志:AF,CF,OF,PF,SF和ZF。但要注意:除了操作数为0以外,CF总是1;操作数为0时CF置0。说明:说明:利用NEG指令可以实现求一个数的相反数。举例:(1)实现 0(AL)的运算。NEG AL (2)AX中存放一负数,求该数的绝对值。NEG AX二进制加减运算的有效性二进制加减运算的有效性加减指令同时会影响到标志寄存器的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 CF标志OF标志无符号数有符号数00有效有效10无效有效01有效无效11无效无效标志位与运算结果的有效性关系标志位与运算结果的有效性关系二进制加减运算二进制加减运算举例举例(1)例例1 执行指令执行指令 ADD DX,0F0F0H二进制加减运算二进制加减运算举例举例(2)例例2 执行两个双精度数的加法。执行两个双精度数的加法。设目的操作数在DX和AX中,DX为高位,源操作数在BX和CX中,BX为高位。(DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H,指令序列为ADD AX,CXADC DX,BX第一条指令执行后:第二条指令执行后:二进制加减运算二进制加减运算举例举例(3)例例3 执行指令执行指令 SUB SI+14H,0136H二进制加减运算二进制加减运算举例举例(4)例例4 执行指令执行指令 SUB DH,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(Unsigned Multiple)(10)带符号乘法指令)带符号乘法指令 IMUL(Signed Multiple)格式:格式:MUL SRC_reg/mIMUL SRC_reg/m功能:功能:把源操作数与隐含目的操作数 AL或AX相乘,结果保存到AX或(DX,AX)中。说明:说明:源操作数可以使用除立即数方式外的各种寻址方式;源操作数可以使用除立即数方式外的各种寻址方式;若源操作数是若源操作数是8位,则与位,则与AL相乘,实现字节型乘法相乘,实现字节型乘法:(AL)*(SRC)8 AX若源操作数是若源操作数是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。举例:举例:MOV AL,8MUL BL;(AL)*(BL),结果在AX中MOV AX,1234HMUL WORD PRT BX;(AX)*(BX),结果在DX:AX中MOV AL,80HSUB AH,AH;AH清0MUL BX;(AX)*(BX),结果在DX:AX中二进制二进制除法指令除法指令 DIV(11)无符号除法指令)无符号除法指令 DIV格式:格式:DIV SRC_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,可用以下指令序列来实现:MOV AX,135 ;被除数135AX MOV BL,100 ;除数100BL DIV BL ;(AX)(BL)商1AL,余数35AH(2)计算125321000,可用下列指令序列实现:MOV AX,12532 ;被除数12532AX MOV DX,0 ;0DX MOV BX,1000 ;除数1000BX DIV BX ;DX AX(BX)商12AX,余数532DX二进制二进制除法指令除法指令 IDIV(12)带符号除法指令)带符号除法指令 IDIV格式:格式:DIV SRC_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+Z 540)/X,其中其中X、Y、Z、V均为均为16位带符号数,位带符号数,已分别装入已分别装入X、Y、Z、V单元中,要求计算结果商存入单元中,要求计算结果商存入AX,余数存入,余数存入DX寄寄存器。存器。十进制算术运算十进制算术运算(1)对于压缩型)对于压缩型BCD码码加、减分两步来实现:先用一条无符号二进制数的加、减指令对压缩型BCD码进行加、减,在AL中产生一个中间结果(可能为不正确的结果);然后再执行一条加、减法的压缩型BCD码调整指令。加法调整指令为DAA;减法调整指令为DAS。调整指令将AL中的中间结果调整为最终正确的压缩型BCD码。压缩型BCD码不能进行乘、除运算十进制运算调整指令十进制运算调整指令 DAADAA(decimal adjust for addition)加法的十进制调整指令加法的十进制调整指令格式:格式: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(decimal adjust for subtraction)减法的十进制调整指令减法的十进制调整指令格式:格式: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码。加、减、乘运算都是先用无符号二进制数