汇编语言程序设计:第二章 汇编语言指令系统和寻址方式2_第1页
汇编语言程序设计:第二章 汇编语言指令系统和寻址方式2_第2页
汇编语言程序设计:第二章 汇编语言指令系统和寻址方式2_第3页
汇编语言程序设计:第二章 汇编语言指令系统和寻址方式2_第4页
汇编语言程序设计:第二章 汇编语言指令系统和寻址方式2_第5页
已阅读5页,还剩77页未读 继续免费阅读

下载本文档

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

文档简介

1、第二章 汇编语言指令系统和寻址方式2.2 指令系统 2.2.1 数据传送指令 2.2.2 算术运算指令 2.2.3 逻辑运算指令 2.2.4 字符串指令 2.2.5 程序转移指令 2.2.6 处理器控制指令2.2 指令系统 指令系统是CPU指令的集合,CPU除了具有计算功能的指令外,还有一些实现其它功能的指令,也有为某种特殊的应用而增设的指令。 在学习汇编指令时,指令的功能无疑是我们学习和掌握的重点,但要准确、有效地运用这些指令,我们还要熟悉系统对每条指令的一些规定或约束。 归纳起来,对指令还要掌握以下几个方面内容:要清楚指令操作数的寻址方式,不同寻址方式,执行时间大不相同;指令对标志位的影响

2、、标志位对指令的影响指令的执行时间,对可完成相同功能的指令要选用执行时间短的指令指令的执行时间指令的基本执行时间举例加法指令执行时间计算有效地址EA所需时间2.2.1数据传送指令(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(O

3、UTput 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。除指令S

4、AHF和POPF指令外,本类的其它指令都不影响标志位。1 通用数据传送指令(1)传送指令 MOV(Move Instruction) 传送指令是使用最频繁的指令,它相当于高级语言中的赋值语句。格式:MOV Reg/Mem, Reg/Mem/Imm功能:把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。说明:源操作数可以是立即数、通用寄存器、存储器以及段寄存器;目的操作数可以是通用寄存器、存储器和除CS外的段寄存器,目的操作数不能是立即数。当存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。注释:Reg

5、Register(寄存器),MemMemory(存储器),ImmImmediate(立即数),它们可以是8位、16位或32位(特别指出其位数的除外)。通用数据传送指令MOV对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV BL, AX等是不正确的;两个操作数不能同时为段寄存器,如:MOV ES, DS等;代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV CS, AX等不正确,但指令MOV AX, CS等是正确的;立即数不能直接传给段寄存器,如:MOV DS, 100H等;立即数不能作为目的操作

6、数,如:MOV 100H, AX等;指令指针IP,不能作为MOV指令的操作数;两个操作数不能同时为存储单元,如: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 注意:源操作数和目的操作数的数据类型必须一致,可以同时是字节寄存

7、器或字寄存器,不能同时为段寄存器;代码段寄存器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注

8、意:立即数与寄存器数据类型必须一致,立即数可以是二进制、八进制、十进制、十六进制的常数,可以是带符号或无符号的整数,也可以是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

9、 ;(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表,堆栈允许插入和删除的一端称作栈顶,另外一端称作栈底。

10、堆栈就是限制在顶端进行插入和删除的线性表。见示意图堆栈有两个基本操作:入栈(push)和出栈(pop)。入栈就是将一个新的元素放入栈顶,这一个元素只能够是字,不能是字节。入栈也称作压栈。出栈则是从栈顶取出一个元素。其中栈顶的元素总是最后入栈最先出栈。出栈也称作退栈或弹出。堆栈指令POP/PUSH8086的堆栈机制8086 CPU中提供了堆栈的机制,将一段内存当作栈来使用,并通过8086的相关指令以栈的方式访问内存。堆栈操作过程中,段寄存器SS指向用于堆栈的内存段,SP指向该堆栈的栈顶,把它们合在一起就可以访问栈顶单元。堆栈的深度由SP的初值决定。入栈指令:PUSH 格式: PUSH Reg/M

11、em 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

12、; 将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,然后将内

13、容压栈,即先修改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 sm

14、all .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寄存器内

15、容交换 XCHG DH,BYTE_VAR ; DH与变量BYTE_VAR内容交换 XCHG SI+3, AL ; DS:SI+3所指的内容与AL内容交换交换指令XCHG注意:XCHG指令不影响状态标志。(2) 操作数可以是通用寄存器和存储器,但不包括段寄存器,也不能为立即数。(3) 源操作数和目的操作数不能同时为存储器,因此不能直接实现两个存储器单元的内容交换。若要进行存储器(字)变量A和存储器(字)变量B的内容交换,可以借用一个通用寄存器来实现: MOV AX,B XCHG AX,A MOV B,AX 交换指令XCHG举例:用XCHG指令将字符串S1与S2的内容进行交换源程序如下: DATA

16、 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格式:XL

17、AT功能:换码表中的一个字节,称为换码字节,用换码字节来置换累加器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

18、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功能:

19、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指令(S

20、tore 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所指向

21、的栈顶。 这条指令不影响状态标志。 (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,

22、CX, DX, SP, BP, SI, DI之一);源操作数是存储器操作数,如变量、标号或地址表达式例如: LEA BX,BUFFER ; 将变量BUFFER的位移量送入BX中LEA DX,BUFARRAYBXSI ; 将数组元素的位移量送入DX中LEA AX,BPDI ; 将有效地址(BP)+(DI)送入AX中地址传送指令注意:LEA指令处理的是变量的地址(即变量的位移量),而不是变量的内容(即变量的值)。 LEA指令和MOV指令有本质上的区别。假设变量BUFFER的偏移是1000H,该字变量的值是4243H,则指令“LEA AX,BUFFER”是将偏移1000H送入AX中,而指令“MOV

23、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

24、位寄存器。(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位存储器指针;例如:

25、LDS BX, DD_VAR; DD_VAR为双字变量 将DD_VAR所在的段的段基址送到DS,将DD_VAR的偏移量送到BX。2.2.2算术运算指令(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 (SUB

26、tract 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 by

27、te 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 (Con

28、vert Word to Double word)字转换为双字。算术运算的数据格式80X86提供的二进制算术运算指令包括二进制运算和十进制运算指令,能对二进制数(字节或字)直接进行算术运算,并且通过专门的调整指令,可以完成十进制数(BCD码)的算术运算。它提供的加、减、乘、除4种基本的算术运算指令,只能直接对整数进行操作,而不能直接对实数 (浮点数)进行运算。对于无符号二进制数 加法指令有:ADD,ADC,INC 减法指令有:SUB,SBB,DEC 乘法指令为:MUL 除法指令为:DIV 对于带符号的二进制数 乘法指令为:IMUL 除法指令为:IDIV; 加、减法运算:与无符号二进制数的加、减

29、法指令一样算术运算的数据格式对于压缩型BCD码加、减分两步来实现:先用一条无符号二进制数的加、减指令对压缩型BCD码进行加、减,在AL中产生一个中间结果(可能为不正确的结果);然后再执行一条加、减法的压缩型BCD码调整指令。加法调整指令为DAA;减法调整指令为DAS。调整指令将AL中的中间结果调整为最终正确的压缩型BCD码。压缩型BCD码不能进行乘、除运算对于非压缩型BCD码加、减、乘运算都是先用无符号二进制数的加、减、乘运算指令在AL中产生一个中间结果,然后,再执行一条调整指令,以便将AL中可能错误的中间结果调整成最终正确的非压缩型BCD码。其加法的调整指令为AAA;减法的调整指令为AAS;

30、乘法的调整指令为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。说明:目的操作数可以是寄存器和存储器

31、;源操作数可以是寄存器、存储器和立即数,但是两者不能同时是存储器。 例: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。说明:

32、ADD和ADC指令既适用于无符号二进制数加法运算,也适用于带符号二进制数的加法运算。但是,它们的两个操作数必须同时为无符号数或同时为带符号数,并且同时为字节(8位数)或同时为字(16位数)。ADC指令多用于多字节加法运算,需要分步计算时很有用。例如,有两个两字节的数相加,AF8AH+0A90H,先进行低字节相加,然后做高字节相加,并且要加上进位,示意如下:二进制加法指令 INC(3)加1指令 INC格式:INC DST功能:(DST)+ 1 DST影响状态标志:AF,OF,DF,SF,ZF。不影响进位标志CF。说明:目的操作数可以为通用寄存器,也可以为存储器,但不能是立即数。 操作数可为字节或

33、字,并被当作一个无符号二进制数,这一点不同于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)AXS

34、UB 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,示意如下 :二进制减法指令

35、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减去目的操作数后送至

36、目的操作数,使目的操作数符号变反。例如,+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) 数据位

37、向符号位有进位,但符号位不再产生进位时有溢出,或者符号位产生进位但数据位不向符号位进位时也产生溢出。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

38、无效有效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

39、)例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位

40、,则与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 W

41、ORD 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

42、商: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)带符号除法指

43、令 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;

44、(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;减

45、法调整指令为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,则

46、将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=

47、1;影响标志位:除OF标志无影响外,影响其它标志。十进制算术运算(2)对于非压缩型BCD码09十个数字的ASCII码可以看作非压缩BCD码。加、减、乘运算都是先用无符号二进制数的加、减、乘运算指令在AL中产生一个中间结果,然后,再执行一条调整指令,以便将AL中可能错误的中间结果调整成最终正确的非压缩型BCD码。其加法的调整指令为AAA;减法的调整指令为AAS;乘法的调整指令为AAM。非压缩型BCD码十进制数的除法运算与加、减、乘不同,除法不是先计算后校正,而是先校正后做除法。除法调整指令为AAD。非压缩型BCD码在进行加、减时,可以直接用09数字的ASCII码参加运算,而不必将高4位清零,这也

48、是将非压缩型BCD码的调整指令称为ASCII码调整指令的缘故。而乘、除运算之前则必须将ASCII码高4位清零,即必须转换为真正的非压缩型BCD码后才能够进行相应运算。十进制运算调整指令AAA (ASCII adjust for addition)加法的ASCII调整指令格式:AAA功能:跟在二进制加法指令之后,把AL中的结果调整成非压缩BCD码并送回AL.说明:参与二进制加法指令的两个操作数必须是ASCII码或非压缩BCD码,AAA指令必须在ADD或ADC指令之后,二进制加法的和必须在AL寄存器中。调整步骤:(1)如AL低4位在09之间且AF=0,则跳过第(2)步,执行第(3)步;(2)如AL

49、低4位在十六进制数AF之间或AF=1,则将AL加上06H,AH内容加1,并使AF=1;(3)清除AL寄存器的高4位;(4)AF位的值送CF位.影响标志位:影响AF/CF标志,其它标志无定义。十进制运算调整指令AAS (ASCII adjust for subtraction)减法的ASCII调整指令格式:AAS功能:跟在二进制减法指令之后,把AL中的结果调整成非压缩BCD码并送回AL.说明:参与二进制减法指令的两个操作数必须是ASCII码或非压缩BCD码,AAS指令必须在SUB或SBB指令之后,二进制减法的差必须在AL寄存器中。调整步骤:(1)如AL低4位在09之间且AF=0,则跳过第(2)步

50、,执行第(3)步;(2)如AL低4位在十六进制数AF之间或AF=1,则将AL减去06H,AH内容减1,并使AF=1;(3)清除AL寄存器的高4位;(4)AF位的值送CF位.影响标志位:影响AF/CF标志,其它标志无定义。十进制运算调整指令AAM (ASCII adjust for multiplication)加法的ASCII调整指令格式:AAM功能:跟在二进制乘法指令MUL之后,对AL中的结果进行调整,调整后的非压缩BCD码在AX中.说明:参与MUL指令的两个操作数必须是非压缩BCD码,AAM指令必须在MUL指令之后,AX中的二进制乘积的有效部分在AL中,该乘积的最大值不会超过81,调整的非

51、压缩BCD码结果在AX中。调整步骤: 把AL内容除以0AH,商放在AH中,余数保存在AL中。影响标志位:影响SF/ZF/PF标志,其它标志无定义十进制运算调整指令AAD (ASCII adjust for division)减法的ASCII调整指令格式:AAD功能:AAD指令在二进制除法指令DIV之前,对AX中的非压缩BCD码进行调整,以便执行DIV指令之后,得到非压缩BCD码形式的商在AL中,余数在AH中.说明:调整前AH中为非压缩BCD码的十位上的数,AL中为个位。调整步骤: 把AX中的被除数调整成二进制数,并存放在AL中,内容除以0AH,商放在AH中,余数保存在AL中。影响标志位:影响S

52、F/ZF/PF标志,其它标志无定义以上讨论都没有涉及到符号问题,对于带符号的十进制数,需要用附加的字节作为符号标志。2.2.3逻辑运算指令(13条)(1) 逻辑指令(logical) NOT (NOT byte or word)字节或字逻辑非 AND (AND byte or word)字节或字的逻辑与 OR (Inclusive OR byte or word)字节或字的逻辑或 XOR (eXclusive OR byte or word)字节或字的逻辑异或 TEST (TEST byte or word)字节或字的测试 (2) 移位指令(shifts) SHL(SHift Logical

53、Left byte or word)字节或字的逻辑左移 SAL (SHift Arithmetic Left byte or word)字节或字的算术左移 SHR (SHift logical Right byte or word)字节或字的逻辑右移 SAR (Shift Arithmetic Right byte or word)字节或字的算术右移 ROL (ROtate Left byte or word)字节或字的循环左移 ROR (ROtate Right byte or word)字节或字的循环右移 RCL (Rotate through Carry Left byte or wor

54、d)字节或字带进位循环左移 RCR (Rotate through Carry Right byte or word)字节或字带进位循环右位逻辑指令NOT AND OR XOR TEST(1) 逻辑指令(logical) 逻辑指令可以对字或字节按位执行逻辑运算。 格式:AND DST, SRC ;按位相与,结果送 (DST) OR DST, SRC ;按位相或,结果送 (DST) XOR DST, SRC ;按位异或,结果送 (DST) NOT OPR ;对操作数按位取反 TEST OPR1,OPR2;按位相与,结果影响标志位但不保存说明:(1)NOT指令不允许使用立即数;(2)NOT指令不影

55、响标志位,其余4条指令对CF和OF清0,影响SF、ZF、PF,对AF无定义。逻辑指令举例;对AL中的值按位求反MOV AL,00001111BNOT AL;清0高四位,低四位不变AND AL,0FH;使高四位置位,低四位不变OR AL,0F0H;使61H端口的D1、D7位变反IN AL, 61HXOR AL, 82HOUT 61H, AL;使AX清0XOR AX,AX;设系统中打印机的状态端口是379H,其D7位是忙闲标志位,D7=0表示忙, D7=1表示闲,测试打印机状态,控制程序执行。MOV DX, 379HWT:IN AL, DXTEST AL, 80HJZ WT移位指令基本移位指令格式

56、:SHL OPR, CNT ;逻辑左移CNT次SAL OPR, CNT ;算术左移CNT次SHR OPR, CNT ;逻辑右移CNT次SAR OPR, CNT ;算术右移CNT次循环移位指令格式:ROL OPR, CNT ;循环左移CNT次ROR OPR, CNT ;循环右移CNT次RCL OPR, CNT ;带进位逻辑左移CNT次RCR OPR, CNT ;带进位循环右移CNT次(1)SHL/SAL(2)SHR (3)SAL(4)ROL(5)ROR (6)RCL(7)RCR移位指令说明:(1)操作数OPR可以为8、16或32位,可以用立即数之外的任何寻址方式;(2)CNT1时,直接在指令中写

57、出,CNT1时,在CL寄存器给出;(3)CF中总是最后移出的一位,ZF/SF/PF按结果设置,当CNT=1时,如果移位使符号位变化,则使OF=1,否则OF=0。(4)SAR指令使最高位右移,保持其自身的值不变。举例:设无符号数X在AL中,用移位指令实现X*10的运算。MOV AH, 0SAL AX, 1MOV BX, AXMOV CL, 2SAL AX, CLADD AX, BX2.2.4字符串指令(5条)MOVSMOVSBMOVSW (MOV Byte or Word String)传送字节串或字串。STOSSTOSBSTOSW (STOre Byte OR Word String)存字节串

58、或字串。LODSLODSBLODSW (LOaD Byte or Word String)取字节串或字串。以上各条指令前可使用重复前缀指令REPCMPSCMPSBCMPSW (COMPare Byte or Word String)比较字节或字串。SCASSCASBSCASW (SCAn Byte or Word String)搜索字节串或字串。以上各条指令前可使用重复前缀指令REPEREPZREPNZ字符串指令(1)串传送指令格式: MOVS DST, SRC MOVSB (字节传送) MOVSW (字传送)操作: ( (DI) ) ( (SI) ),且自动修改SI/DI指针:若DF=0 :

59、字节操作时,SI/DI各加1,字操作时,SI/DI各加2;若DF=1 :字节操作时,SI/DI各减1,字操作时,SI/DI各减2;该指令不影响标志位。说明:第一种格式应在操作数中表明是字节还是字操作,用如下格式:MOVS ES:BYTE PTRDI, DS:SI且这种寻址方式是固定的,不允许其他寻址方式。源串是指由DS:SI指向的字节或字符串目标串是指由ES:DI指向的字节或字符串字符串指令(2)存入串指令格式: STOS DST STOSB (存字节) STOSW (存字)操作:字节操作: ( (DI) ) ( AL ) 字操作: ( (DI) ) ( AX ) 自动修改SI/DI指针:若D

60、F=0 :字节操作时,SI/DI各加1,字操作时,SI/DI各加2;若DF=1 :字节操作时,SI/DI各减1,字操作时,SI/DI各减2;该指令不影响标志位。说明:字符串指令(3)从串取指令格式: LODS DST, SRC LODSB (取字节) LODSW (取字)操作: 字节操作: ( AL ) ( (SI) )字操作: ( AX ) ( (SI) )自动修改SI/DI指针:若DF=0 :字节操作时,SI/DI各加1,字操作时,SI/DI各加2;若DF=1 :字节操作时,SI/DI各减1,字操作时,SI/DI各减2;该指令不影响标志位。说明:字符串指令指令前缀:REP 重复串操作直到C

温馨提示

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

评论

0/150

提交评论