




已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言程序设计,北京理工大学 电子工程系,马永锋 ,第二章 汇编语言指令系统和寻址方式,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 (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指令有以下几条具体规定,其中有些规定对其它指令也同样有效。 两个操作数的数据类型要相同,要同为8位、16位或32位;如:MOV BL, AX等是不正确的; 两个操作数不能同时为段寄存器,如:MOV ES, DS等; 代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV CS, AX等不正确,但指令MOV AX, CS等是正确的; 立即数不能直接传给段寄存器,如:MOV DS, 100H等; 立即数不能作为目的操作数,如:MOV 100H, AX等; 指令指针IP,不能作为MOV指令的操作数; 两个操作数不能同时为存储单元,如:MOV VARA, VARB等,其中VARA和VARB是同数据类型的内存变量。 对于规定2、4和7,我们可以用通用寄存器作为中转来达到最终目的。,通用数据传送指令MOV,数据传送方向搭配图,通用数据传送指令MOV,举例:(1) 寄存器与寄存器之间的数据传送 例如: MOV AX, BX ;(BX)AX MOV DL, AH ;(AH)DL MOV DX, ES ;(ES)DX MOV DS, AX ;(AX)DS MOV 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 ;100QAX MOV BX,0FFFFH ;0FFFFHBX MOV AL,-2 ;0FFFEHAL MOV CH,100B ;100BCH MOV DL, A ;65DL MOV SI, OFFSET TABLE ;OFFSET TABLESI 注意:立即数与寄存器数据类型必须一致,立即数可以是二进制、八进制、十进制、十六进制的常数,可以是带符号或无符号的整数,也可以是ASCII字符。,通用数据传送指令MOV,举例:(3) 寄存器与存储器之间的数据传送 寄存器与存储器之间的数据传送是指除了CS和IP以外的所有寄存器与内存储器之间的数据传送。例如: MOV AL,BUFFER ;(BUFFER)AL MOV AX,SI ;(DS)10H+(SI)AX MOV DI,DX ;(DX)(DS)10H+(DI) MOV BX+DI,DL ;(DL)(DS)10H+(BX)+(DI) MOV SI,ES:BP ;(ES)10H+(BP)SI MOV 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/PUSH,8086的堆栈机制 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 BETABXSI POP BETABX POP BETA POP A ; 因为POP CS是非法的 POP SS POP BX POP 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,注意: XCHG指令不影响状态标志。 (2) 操作数可以是通用寄存器和存储器,但不包括段寄存器,也不能为立即数。 (3) 源操作数和目的操作数不能同时为存储器,因此不能直接实现两个存储器单元的内容交换。若要进行存储器(字)变量A和存储器(字)变量B的内容交换,可以借用一个通用寄存器来实现: MOV AX,B XCHG AX,A MOV B,AX,交换指令XCHG,举例:用XCHG指令将字符串S1与S2的内容进行交换 源程序如下: DATA SEGMENT S1 DB ABCDEFG S2 DB 0123456 N DW $-OFFSET S2 ;N为字符串长度 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: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 21H CODE ENDS END START,(4)查表转换指令XLAT,格式:XLAT 功能:换码表中的一个字节,称为换码字节,用换码字节来置换累加器AL中的内容,即ALBXAL。,说明:该指令有两个隐含操作数BX和AL,换码表的表首由DS:BX指向,要换的码在表中的位移由寄存器AL中的内容指出。指令执行后即将表中要换的码置入AL中,即DS:BX+ALAL。,查表转换指令XLAT,举例:利用XLAT指令将计算机机内二进制表示的十六进制转换成ASCII码并显示输出 源程序如下: DATA SEGMENT HEX_NUM DB 0,1,2,3,4,5,6,7,8,9,0AH,0BH, 0CH,0DH,0EH,0FH TABLE DB 0123456789ABCDEF DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,16 MOV BX,OFFSET TABLE MOV SI,OFFSET HEX_NUM,查表转换指令XLAT,L: MOV AL,SI XLAT TABLE ;换码DS:BX+ALAL MOV DL,AL MOV AH,02H ;显示输出 INT 21H MOV DL, INT 21H INC SI LOOP L MOV AH,4CH INT 21H CODE ENDS END START,2 输入输出指令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 说明:这里端口地址可以在065535,3 标志寄存器传送指令,(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中,地址传送指令,注意: LEA指令处理的是变量的地址(即变量的位移量),而不是变量的内容(即变量的值)。 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。,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 (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)AX ADD BX ;同上,这里不写出目的操作数,隐含的目的操作数为AX ADD AX, BX+SI ;(AX)+(DS:BX+SI)AX ADD AX, 12 ;(AX)+12 AX ADD BXSI,AX ;(DS:BX+SI)+(AX)DS:BX+SI ADD 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)AX SUB CL, 6 SUB 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,标志位与运算结果的有效性关系,二进制加减运算举例(1),例1 执行指令 ADD DX, 0F0F0H,二进制加减运算举例(2),例2 执行两个双精度数的加法。 设目的操作数在DX和AX中,DX为高位,源操作数在BX和CX中,BX为高位。 (DX)=0002H, (AX)=0F365H, (BX)=0005H, (CX)=0E024H,指令序列为 ADD AX, CX ADC 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/m IMUL 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, 8 MUL BL ;(AL)*(BL),结果在AX中 MOV AX, 1234H MUL WORD PRT BX ;(AX)*(BX),结果在DX:AX中 MOV AL, 80H SUB AH, AH ;AH清0 MUL 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码不能进行乘、除运算,十进制运算调整指令 DAA,DAA (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码。 加、减、乘运算都是先用无符号二进制数的加、减、乘运算指令在AL中产生一个中间结果,然后,再执行一条调整指令,以便将AL中可能错误的中间结果调整成最终正确的非压缩型BCD码。其加法的调整指令为AAA;减法的调整指令为AAS;乘法的调整指令为AAM。 非压缩型BCD码十进制数的除法运算与加、减、乘不同,除法不是先计算后校正,而是先校正后做除法。除法调整指令为AAD。 非压缩型BCD码在进行加、减时,可以直接用09数字的ASCII码参加运算,而不必将高4位清零,这也是将非压缩型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低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)步,执行第(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,调整的非压缩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中。 影响标志位:影响SF/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 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 word)字节或字带进位循环左移 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指令不影响标志位,其余4条指令对CF和OF清0,影响SF、ZF、PF,对AF无定义。,逻辑指令举例,;对AL中的值按位求反 MOV AL,00001111B NOT AL ;清0高四位,低四位不变 AND AL,0FH ;使高四位置位,低四位不变 OR AL,0F0H ;使61H端口的D1、D7位变反 IN AL, 61H XOR AL, 82H OUT 61H, AL ;使AX清0 XOR AX,AX,;设系统中打印机的状态端口是379H,其D7位是忙闲标志位,D7=0表示忙, D7=1表示闲,测试打印机状态,控制程序执行。 MOV DX, 379H WT: IN AL, DX TEST AL, 80H JZ WT,移位指令,基本移位指令 格式: 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时,直接在指令中写出,CNT1时,在CL寄存器给出; (3)CF中总是最后移出的一位,ZF/SF/PF按结果设置,当CNT=1时,如果移位使符号位变化,则使OF=1,否则OF=0。 (4)SAR指令使最高位右移,保持其自身的值不变。 举例:设无符号数X在AL中,用移位指令实现X*10的运算。 MOV AH, 0 SAL AX, 1 MOV BX, AX MOV CL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三年级信息技术上册 第7课 装扮美丽的花园教学设计 粤教版
- 人教版(2024)五年级下册因数和倍数教学设计
- 人教版(2024)七年级2025年10.1 二元一次方程组的概念教案配套
- 公司员工花名册
- 人教版一年级音乐上册教学计划教案
- 六年级下册心理健康教育教案-16.学画思维导图 苏科版
- 七年级生物下册 第四单元 第七章 第一节 分析人类活动对生态系统的影响教学设计2 (新版)新人教版
- 2024吉林镇赉县鑫阳新能源有限公司招聘工作人员5人笔试参考题库附带答案详解
- 体育教学设计(单杠和仰卧起坐)
- 人教部编版八年级上册法不可违教案配套
- 张学良与西安事变
- 《企业经营决策实战模拟》教学大纲
- 抗菌药物合理使用培训
- 司法鉴定人考试题库
- 2024年人参项目建设方案
- 物业保盘行动策划方案
- 分布式光伏高处作业专项施工方案
- 年产20万吨氯乙烯工艺设计
- 鞘内注射化疗护理课件
- 邮政社区团购怎么做流程
- 妇科肿瘤的预防与治疗方法
评论
0/150
提交评论