第二章8088指令系统_第1页
第二章8088指令系统_第2页
第二章8088指令系统_第3页
第二章8088指令系统_第4页
第二章8088指令系统_第5页
已阅读5页,还剩112页未读 继续免费阅读

下载本文档

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

文档简介

1、第二章第二章 8086/8088的指令系统的指令系统2.1概述概述一、指令的基本构成二、指令中的操作数类型三、指令的执行时间2.2 寻址方式寻址方式一、立即寻址二、直接寻址三、寄存器寻址四、寄存器间接寻址2五、寄存器相对寻址六、基址变址寻址七、基址-变址-相对寻址八、隐含寻址2.38086/8088指令系统指令系统一、数据传送指令二、算术运算指令三、逻辑和移位运算指令四、串操作指令五、控制转移指令六、处理器控制指令32.1 概述概述指令:能够被计算机识别并完成指定操作的命令。指令系统:一台计算机能够识别的所有指令的集合。CISC(Complex Instruction Set Computer

2、)指令系统RISC(Reduced Instruction Set Computer)指令系统8086/8088的指令系统(6大类):数据传输类;算术运算类,逻辑和移位运算;串操作类;控制转移类;处理器控制指令4一、指令的基本构成操作码(OPC) 存放运算数据或结果的地址,参加运算的数据或数据的地址目标操作数源操作数指令的助记符8086指令的长度17个字节,其中操作码占用12个字节。指令长度主要取决于操作数的个数及所采用的寻址方式。根据操作数类型,指令有三种形式无操作数指令;单操作数指令;双操作数指令5二、指令中的操作数类型(一)立即数操作数立即数是具有固定数值的操作数,即常数。字长可以是8位

3、或16位可以是有符号数或无符号数,取值范围必须符合相应字长数的规定只能作源操作数,因为立即数是一个常数,没有表示地址的含义。6(二)寄存器操作数8086CPU的8个通用寄存器和4个段寄存器可以作为指令中的寄存器操作数,它们既可以作源操作数,也可以用作目标操作数。通用寄存器通常用来存放参加运算的数据或数据所在存储器单元的偏移地址。段寄存器用来存放当前操作数的段基址。7(三)、存储器操作数存储器操作数存放内存单元中。存储器操作数的类型字节或字在指令中,存储器操作数可作源和目标操作数,但不允许源操作数和目标操作数同时都是存储器操作数。存储器操作数的有效地址可以在指令中用直接的方式给出(直接寻址);也

4、可以用间接的方式给出(寄存器间接寻址、变址寻址、基址寻址或基址-变址寻址)8为了找到存储器操作数的物理地址,必须确定操作数所在的段,即确定有关的段寄存器。一般情况下,指令中不特别指出设计的段寄存器,这是因为对于各种不同类型的存储器操作,8086/8088CPU约定了隐含的段寄存器。有的指令允许段超越,此时需要在指令中加以标明。各种存储器操作约定的隐含段寄存器、允许超越的段寄存器以及指令的有效地址所在的寄存器见下页表格98086/8088中的默认和可以超越的段存储器操作类型约定段寄存器允许超越的段寄存器有效地址取指令CS无IP堆栈操作SS无SP通用数据读写DSCS, ES, SS有效地址EA源数

5、据串DSCS, ES, SSSI目标数据串ES无DI以BP作为基址寄存器SSCS, DS, ES有效地址EA10三、指令的执行时间一条指令的执行时间包括取指令、取操作数、执行指令及传送结果几个部分,单位用时钟周期数表示。不同指令的执行时间有较大差别:寄存器操作数的指令执行速度最快,立即数操作数次之,存储器操作数指令的执行速度最慢112.2寻址方式寻址方式寻址方式:寻找操作数所在地址的方式一、立即寻址一、立即寻址立即寻址方式只针对源操作数。操作数是一个立即数,它放在指令中,紧跟在操作码的后面,与操作码一起放在内存的代码段中,在CPU取指令时随指令码一起取出并直接参加运算。该立即数可以是8位或16

6、位;若是16位,则存放时低8位存放在低地址单元,高8位存放在高地址单元(地位在前,高位在后)12立即寻址主要用于给寄存器或存储单元赋初值。例如:MOVAX, 1000H操作码0010AXAH AL代码段图2.1.1 立即寻址13二、直接寻址直接寻址方式表示参加运算的数据存放在内存中,存放地址的16位地址偏移量(或称有效地址EA)直接包含在指令中。操作数的段基址默认为数据段,允许段超越。例如:MOV AX, 1000H,假设DS=3000H操作码0010XXLXXHAXAH AL代码段DS3000 30000 1000 31000数据段31000H14例如:MOV BL, ES:1200H,表示

7、将ED段中偏移地址为1200H单元的内容送到BL寄存器中在汇编语言中,有时也用一个符号来代替数值以表示操作数的偏移地址,通常把这个地址称为符号地址。如上例中,若用BUFFER代替偏移地址1200H,则指令可写成:MOV BL, ES:BUFFER注:BUFFER必须在程序的开始处予以定义15三、寄存器寻址操作数为CPU的内部寄存器,它们可以是数据寄存器(8位或16位),也可以是地址指针、变址寄存器或段寄存器。例如:MOV SI, AX若指令执行前SI=2233H,AX=4455H,则指令执行后SI=4455H,AX=4455H (内容保持不变)SIAX寄存器寻址16四、寄存器间接寻址寄存器的内

8、容表示操作数的偏移地址。而操作数本身在内存中。指令中可用的寄存器为:SI、DI、BX和BP,这分为两种情况:(一)以SI、DI、BX间接寻址,地址基准存放在DS中,允许段超越例如:MOV AX, SI DS 2000 0+ SI100021000AXAH AL数据段21000H(a) 以SI间接寻址若操作数在附加段,上例应写为:MOV AX, ES: SI17(二)以BP间接寻址,地址基准存放在SS中,允许段超越例如:MOV AX, BPSI、DI、BX和BP也被称为间址寄存器或地址指针。SS 3000 0+ BP200032000AXAH AL堆栈段32000H(b) 以BP间接寻址18五、

9、寄存器相对寻址操作数在内存中的存放地址(偏移地址)由间址寄存器( SI、DI、BX和BP )的内容加上指令中给出的一个8/16位偏移量。操作数所在段由所使用的间址寄存器决定,规则与寄存器间接寻址方式相同例如:MOV BX, COUNT+SI图2.1.5 变址寻址DS 3000 0+ SI200035000BXBH BL代码段35000H+ COUNT30000030操作码COUNT数据段19寄存器相对寻址语法示例:MOV AL, DATASIMOV AL, SIDATAMOV AL, DATA+SI MOV AL, SI+DATAMOV AL, DATA+SI MOV AL, SI+DATA2

10、0六、基址变址寻址一个基址寄存器(BX,BP)的内容和一个变址寄存器(SI,DI)的内容相加形成操作数偏移地址。在默认情况下,指令中若使用BX做基址寄存器,则段地址在DS中;若使用BP做基址寄存器,则段地址在SS中。运许段超越。+BX1000+ SI200033000AXAH AL代码段33000H操作码数据段DS 3000 0例如:MOV AX, BXSI21七、基址变址-相对寻址指令中指定一个基址寄存器和一个变址寄存器,同时还给出一个8位或16位的位移量,将三者相加得到操作数的偏移地址。默认的段寄存器由基址寄存器决定。允许使用段超越。+BX1000+ SI200033250AXAH AL代

11、码段33250H+ MASK02505002操作码MASK数据段DS 3000 0例如:MOV AX, MASKBXSI22也可以用以下形式实现上例效果:MOV AX, BX+MASKSIMOV AX, BX+SI+MASK MOV AX, BXMASKSIMOV AX, BX+SIMASK MOV AX, MASKSI BX23八、隐含寻址指令的操作码中不仅包含了操作的性质,还隐含了部分操作数的地址例如:MUL BL 隐含了被乘数AL和乘积AX 24寻址方式小结寻址方式寻址方式举例举例立即寻址MOV AX, 2000H直接寻址MOV AX, 2000H寄存器寻址MOV AX, BX寄存器间接

12、寻址MOV AX, BX寄存器相对寻址MOV AX, MASKBX基址-变址寻址MOV AX, BXSI基址-变址-相对寻址MOV AX, MASKBXSI隐含寻址MUL BL252.28086/8088指令系统指令系统一、数据传送指令(一)通用数据传送指令1、MOV(Movement)格式及操作:MOV dest, src ;(dest)(src)特点:(1)不改变源操作数的值(2)操作数可以是8/16位26(3)可以是各种寻址方式(4)可以实现以下传送:寄存器与寄存器/存储器之间立即数至寄存器/存储器寄存器/存储器与段寄存器之间例如:MOV SI, BX; 寄存器至寄存器MOV DS, A

13、X ; 通用寄存器至段寄存器MOV AX, CS ; 段寄存器至通用寄存器27MOV AL, 5; 立即数至寄存器MOV MEM, 5; 立即数至存储器,直接寻址MOV BX, 5; 立即数至存储器,寄存器间址寻址MOV MEM, AX ; 寄存器至存储器,直接寻址MOV MEM, DS ; 段寄存器至存储器,直接寻址MOV DISPBX, CX; 寄存器至存储器,基址寻址MOV AX, DISPSI ; 存储器至寄存器,变址寻址MOV DS, MEM ; 存储器至段寄存器,直接寻址MOV AX, DISPBXSI ; 存储器至寄存器,基址-变址寻址28(5)指令对操作数的要求 两个操作数不能

14、同时为存储器操作数错误:MOV MEM2, MEM1 正确:MOV AX, MEM1MOV MEM2, AX 不能进行立即数至段寄存器的传送错误:MOV DS, 100 正确:MOV AX, 100MOV DS, AX29 两个操作数不能同时为段寄存器错误:MOV ES, DS 正确:MOV AX, DSMOV ES, AX 指令中的两个操作数字长必须相同 一般情况下,指令指针IP和代码寄存器CS的内容不通过MOV指令修改,即它们不做目标操作数,但可以做源操作数 FLAGS整体不作为操作数30例2.2.1 设自AREA1单元开始有一个100个字节的数据块,编写程序段,把它传送到自AREA2开始

15、的数据区MOV SI, OFFSET AREA1 ; SI=AREA1首地址(偏移地址)MOV DI, OFFSET AREA2 ; SI=AREA2首地址(偏移地址)MOV CX, 100 ; CX=数据块长度,也是循环次数AGAIN:MOV AL, SIMOV DI, AL ; 源块中一个字节送到目标,(通过AL)INC SI; SI=SI+1INC DI; DI=DI+1DEC CX; CX)=CX-1JNZ AGAIN ;若结果不为0(未传完),转移到AGAINHLT312、堆栈操作指令(1)堆栈堆栈是在内存中开辟的一个特定的区域,用于存放CPU寄存器或存储器中不用的数据。堆栈在内存中

16、所处的段称为堆栈段,段地址存放在SS中。堆栈指针SP始终指向栈顶,其初值规定了所有堆栈的大小。堆栈段中数据存放方式是“向下生长”型(其它段是“向上生长”型),存取原则是“后进先出”(LIFO)32(2)堆栈的用途当主程序调用子程序或发生中断时机器必须保护断点的地址,以便子程序或中断服务程序执行完后能正确返回主程序继续执行。同时还可用堆栈保护有关的寄存器内容。堆栈的“后进先出”原则在子程序嵌套时保证正确地返回。当寄存器不够用时,可以用堆栈作缓冲器。主程序x1转向子程序返回主程序执行子程序继续执行主程序x2图2.2.1 主程序转子程序及返回主程序子程序1x2子程序2y2x1y1图2.2.2 子程序

17、嵌套示意图33(3)堆栈指令PUSH(Push word onto stack)POP(Pop word off stack)指令格式及操作:PUSH src;SPSP-2, SP+1:SP srcPOP dest ; destSP+1:SP, SPSP+234例如,例如,PUSHAXAX11 22堆栈段(SP-2)(SP-1)(SP)(a)PUSH AX前PUSH AX示意图AX11 222211堆栈段(SP)(SP1)(SP2)(b)PUSH AX后35POP BXBX12 342211堆栈段(SP)(SP1)(SP2)(a)POP BX前BX11 222211堆栈段(SP-2)(SP-1

18、)(SP)(b)POP BX后PUSH和和POP一般成对使用,而且通常一般成对使用,而且通常弹出和推入的顺序相反。弹出和推入的顺序相反。36PUSH和和POP指令的操作数可能有三种情况:指令的操作数可能有三种情况:寄存器,包括通用数据寄存器及地址指针和变址寄存器段寄存器(CS除外,PUSH CS是合法的,而POP CS指令非法)存储器无论哪一种操作数,其类型必须是无论哪一种操作数,其类型必须是16位。位。例如:例如:PUSH BP;基址指针寄存器推入堆栈PUSH DATASI;两个连续的存储单元内容推入堆栈POP DI;从堆栈弹出到变址寄存器POP ALPHABX ;从堆栈弹出到两个连续的存储

19、单元373、交换指令(Exchange)指令格式及功能:XCHGdest, src ; (dest) (src)两个操作数字长必须相同,交换的内容可以是字或字节。交换可以在寄存器与寄存器之间、寄存器与存储器之间进行,但段寄存器除外;源和目标操作数不能同时为存储器操作数。例如:XCHG BL, DL ; 寄存器之间字节交换XCHG AX, SI ; 寄存器之间字交换XCHG COUNTDI, AX ;寄存器与存储器字交换38(二)输入/输出(I/O)指令1、IN(Input byte or word)格式:INacc, port具体形式:IN AL, n ;地址8位(寻址范围:0FFH), 输入

20、一字节,直接寻址IN AX, n ;地址8位,输入一字,直接寻址IN AL, DX ;地址16位(寻址范围: 0FFFFH),输入一字节,间接寻址IN AX, DX ;地址16位,输入一字,间接寻址392、OUT (Output byte or word)格式:OUTport,acc具体形式:OUT n,ALOUT n,AXOUT DX,AL OUT DX,AX采用间接寻址的采用间接寻址的IN/OUT指令只能用指令只能用DX做间址寄存做间址寄存器器40例如:OUT 40H,ALIN AX, 40HMOV DX, 560HOUT AX, DX41(三)取偏移地址指令 LEA(Load Effec

21、tive Address)指令格式:LEA reg16, mem16 ; (reg16)EA(mem16)注意:LEA与MOV的区别, 例如:LEA BX, BUFFER 等价于指令MOV BX, OFFSET BUFFER,表示把BUFFER的有效地址传送到目标寄存器BX而指令MOV BX, BUFFER 表示把BUFFER的内容(连续两个字节)传送到BX42(四)其他传送指令字位扩展指令:CBW,CWD远地址传送指令:LDS,LES标志传送指令:LAHF, SAHF, PUSHF,POPF43二、算术运算指令算术运算指令包括加、减、乘、除运算指令。可实现字节或字、无符号数和有符号数的运算。

22、指令对操作数的要求类似于数据传送类指令:单操作数指令中的操作数不允许使用立即数;在双操作数指令中,立即数只能作为源操作数;不允许源操作数和目标操作数同时存储器操作数。算术运算的结果可能会溢出。有符号数的溢出是一种出错,而无符号数的溢出不能简单的认为是出错,也可看做是向更高位的进位。44(一)加法(Addition)1、ADD (Addition)指令格式及操作:ADD dest, src ;(dest) (dest)+(src)源操作数可以是8或16位立即数、寄存器或存储器;目标操作数可以是寄存器或存储器。影响标志位CF、OF、PF、SF、ZF、AF。例如:MOV AL, 7EH ; (AL)

23、=7EHMOV BL, 5BH ; (BL)=5BHADD AL, BL ; (AL)=7EH+5BH=D9H执行以上三条指令后,(AL)=D9H,SF=1, ZF=0, AF=1, PF=0, CF=0, OF=1。注意:段寄存器不能参加算术运算注意:段寄存器不能参加算术运算452、ADC (Add with Carry)指令格式及操作:ADC dest, src ;(dest) (dest)+(src)+(CF)ADC指令对标志位的影响与ADD指令相同。例如:设CF=1,则执行以下两条指令后:MOV AL,7EHADC AL,0ABH结果为:AL=2AH,CF=1ADC指令主要用于多字节数

24、据的加法运算。指令主要用于多字节数据的加法运算。46例2.2.3 在FIRST单元和SECOND单元开始,存放两个各为10个字节的二进制数(地址最低处放的是最低字节),求它们的和,且把和放回FIRST开始的单元中。MOV CX, 10 ; (CX)=字节长度(循环次数)MOV SI, 0 ; (SI)=0CLC; CF=0AGAIN:MOV AL, SECONDSI ; 取一个字节加数ADCFIRSTSI, AL ; 加上被加数并送回FIRST区INCSI ; SI加1,指向下一字节DECCX ; 循环次数减1JNZAGAIN ; 若不等于0(未循环完),转AGAINHLT ;否则,结束473

25、、INC (Increment by 1)指令格式及操作:INC dest ;(dest) (dest)+1影响标志位OF、PF、SF、ZF、AF,但对进位标志但对进位标志CF没有影响。没有影响。INC指令中操作数的类型可以是寄存器或存储器,但不能是段寄存器。字节操作或字操作均可。例如,INC SI; 16位寄存器加1INC BYTE PTRBXSI ; 存储器加1,字节操作48(二)减法指令(Subtraction)1、SUB (Subtraction)指令格式及操作:SUB dest, src;(dest) (dest)-(src)SUB指令影响标志位SF、AF、ZF、PF、CF、OF。操

26、作数的类型与加法一样。例如:SUB AL, 37H; 寄存器减立即数SUB ARRAYSI, AX ; 存储器减寄存器492、SBB (Subtraction with borrow)指令格式及操作:SBB dest, src;(dest) (dest)-(src)-CFSBB指令对标志位的影响与SUB指令相同。 SBB CX, DX; 寄存器与寄存器带借位减SBB AL, DATASI ; 寄存器与存储器带借位减SBB指令主要用于多字节数据的减法运算。指令主要用于多字节数据的减法运算。503、DEC(Decrement by 1)指令格式及操作:DEC dest ;(dest) (dest)

27、-1DEC指令影响标志位SF、ZF、AF、PF、OF,但不但不影响标志位影响标志位CF。操作数的类型与INC相同。例如:DEC BL;8位寄存器减1DEC WORD PTRBPDI ;16位存储器减1在循环程序中常常利用DEC指令来修改循环次数。例如: MOV CX, 0FFFFHCYC: DEC CXJNZ CYC .514、求补NEG(Negate)指令格式及操作:NEG dest ;(dest) 0-(dest)NEG是对8/16位数取补,它对SF、ZF、AF、PF、CF及OF有影响。操作数的类型可以是寄存器或存储器。利用NEG指令可以得到负数的绝对值,例如假设原来(AL)=FFH(-1

28、的补码),执行指令NEG AL后,结果为(AL)=01H注意:注意: 执行NEG指令后,CF一般为1,除非给定的操作数为0 当指定的操作数为80H(-128)或8000H(-32768)时,执行NEG指令后结果不变,但OF置1,其他情况下OF为0525、CMP指令格式及操作:CMP dest, src;(dest)-(src)与SUB类似,区别只在于CMP指令不改变目标操作数的值, 而只将比较结果反映在标志位上。比较指令用来比较两个数的大小。可以在比较指令执行后,根据标志位的状态判断两个操作数的大小。方法如下:(1)相等关系:如果ZF=1则两个操作数相等,否则不等53(2)大小关系: 对两个无

29、符号数,若CF=0,则被减数较大;否则被减数较小 对于两个有符号数,OFSF=0时,被减数较大;OFSF=1时,被减数较小(详细讨论参见:冯博琴,微型计算机原理与接口技术)54例. 在内存数据段从DATA开始的存储单元中分别存放了两个8位无符号数,比较大小,并将大者传送到MAX单元LEA SI, DATA ; (SI)=DATA首址MOV AL, SI ; 取第一个数到ALINC SI ; SI加1,指向第二个数据CMP AL,SI ; 两个数比较JNC DONE ; 若CF=0,转至DONEMOV AL, SI ; 否则第二个数送ALDONE:MOV MAX, AL ; 较大的数送MAX单元

30、HLT ; 比较结束55(三)乘法指令1、 MUL ( Multiplication unsigned )指令格式:MUL src指令操作:字节相乘:(AX)(src)(AL)字相乘: (DX:AX)(src)(AX)MUL指令执行8/16位无符号数的乘法。乘数在累加器AL(字节相乘)或AX(字相乘)中;被乘数src必须在寄存器或存储器中,两个操作数均按无符号数处理。例如:MUL BX; AX乘BXMUL WORD PTR ALPHA ; AX乘存储器(16位)56若结果的高半部分不为零,则标志位CF1,OF1;否则CF0,OF0。例如:MOV AL, 14H ; (AL)=14HMOV CL

31、, 05H ; (CL)=05HMUL CL; (AX)=0064H, CF=OF=057(四)除法指令1、DIV(Division unsigned)指令格式与操作:DIV src字节除法:(AL)(AX)/ ( src) (AH)(AX)% ( src)字除法:(AX)(DX: AX)/ ( src) (DX)(DX: AX)% ( src)源操作数为8或16位的寄存器或存储器。除法指令对六个标志位均无影响若除数为零,则在内部产生一个类型0中断。58例如:下面指令段实现无符号数字除。MOV AX, 0F05H ; (AX)=0F05HMOV DX, 068AH ; (DX)=068AHMO

32、V CX, 08E9H ; (CX)=08E9H DIV CX; (AX)=BBE1H (商), (DX)=073CH (余数) 59有符号数乘法指令:IMUL有符号数除法指令:IDIVBCD码调整指令:DAA,AAA, DAS, AAS, AAM,AAD60其他算术运算指令三、逻辑和移位运算指令(一)逻辑运算指令逻辑运算指令包括5条:AND(逻辑“与”), OR(逻辑“或”),NOT(逻辑“非”), XOR(逻辑“异或”), TEST(测试)。这些指令可对8位或16位寄存器或存储器单元中的内容进行按位操作。除NOT指令外,其他4条指令对操作数的要求与MOV指令相同。它们执行后都会使CFOF0

33、, AF的值不定,影响标志位PF、SF、ZF。611、AND(Logical and)指令格式及操作:AND dest, src;(dest) (dest)&(src)AND指令的用途指令的用途: 实现两个操作数按位相“与”AND CX, DI ; CX和DI所指字单元字单元的内容相“与”,结果送CX 使目标操作数某些位清零(与0与),其他位保持不变(与1与)AND AL,0FH ;将AL的高4位清零,低4位保持不变 使操作数不变,但影响6个状态标志位,并使CF=OF=0 AND AX,AX 622、TEST(Test or non-destructive logical and)指令

34、格式及操作:TEST dest, src; (dest)&(src)操作与AND相同,只是不送回运算结果,只影响标志位用途:用于检测但不改变特定位的状态用途:用于检测但不改变特定位的状态。例如,检测端口PORT输入的数据,若其中的D1不为零,则转移到NEXTIN AL, PORTTESTAL, 00000010B JNZNEXTNEXT: 63例如:从4000H单元开始存放有32个有符号数(字节),要求统计出负数个数,并将统计结果放入字单元BUFFER中。程序段如下:64;初始化 XOR DX,DX;暂存统计结果,初始化为0MOV SI, 4000H ; 字节指针,初始化为首字节地址M

35、OV CL,32; 循环次数,初始化为32;统计AGN:MOV AL, SI ; 取第一个数INC SI ; 指向下一单元TEST AL, 80H ;测试符号位JZ NXT ; 正数,转到NXTINC DX; 否则(负数),DXDX+1NXT: DEC CL;循环次数-1JNZ AGN;循环未结束,转到AGN(检测下一个);存结果MOV BUFFER, DX3、OR(Logical inclusive or)指令格式及操作:OR dest, src;(dest) (dest)v(src)用途用途: 实现两个操作数按位相“或”OR DI, AL ; DI所指字节单元的字节单元的内容与AL的内容相

36、“与”,结果送DI单元 使目标操作数的某些位不变(与0或),其它位置为“1” (与1或)OR AL,20H ;将AL的D5置1,其它位保持不变 使操作数不变,但影响6个状态标志位,并使CF=OF=0 OR AX,AX 65例题:通信中ASCII码的奇偶校验:偶校验是使要传送的的ASCII码中1的个数为偶数;奇校验是使1的个数为奇数。奇偶校验位放在ASCII码的最高位。假定要传送的ASCII码放在AL中,则偶校验程序段如下:OR AL, AL; 不改变AL内容,但影响标志位JPE CONTINUE; 若PF=1(AL中1的个数为偶数)则转移OR AL, 80H ; 否则,最高位(偶校验位)置1C

37、ONTINUE:664、XOR(Logical exclusive or)指令格式及操作:XOR dest, src;(dest) (dest)(src)用途用途:用于要求一个操作数的若干位不变(与0异或),其它位“求反” (与1异或)的场合。例如,若要使AL寄存器中的第1、3、5、7位求反,第0、2、4、6位保持不变,假设AL中的内容为0FHXOR AL, 0AAH; (AL)=10100101B清寄存器或存储器,同时清标志CF, 例如,XOR AX, AX675、NOT(Logical not)指令格式及操作:NOT dest字节求反或字求反;操作数是8/16位的寄存器或存储器。不影响标志

38、位例如:NOT AX ;将AX中内容取反,结果送回AXNOT WORD PTRSI ;将SI所指字单元的内容取反,结果送回该字单元68(二)移位指令移位指令对8位或16位寄存器或存储器操作数移位指定的位数。当移位1位时,移位位数可以在指令中给出,也可以放在CL寄存器中;移位位数多于1位时,它必须放在CL寄存器中。691、SHL/SAL (Shift logical left/shift arithmetic left)指令格式:SHLdest, 1SAL dest, 1或SHL dest, CL SAL dest, CL操作:对8/16位寄存器或存储器操作数左移1位或CL寄存器中指定的位数(多

39、于1位)。70CF操作数左移指令操作示意图0当移位1位时,若移位后操作数的最高位与标志CF不同,则标志OF1,否则OF0。如果移多位,标志OF的值不确定。例如:MOV AL, 41HSHL AL, 1则执行上面两条指令后,AL=82H,CF=0,OF=1. 若82H为无符号数,则它没有溢出;若它为有符号数,则溢出了。 左移指令常用于完成常数乘法运算。以便提高执行速度71例 将 一个16位无符号数乘以10,该数存放在以FACTOR为首地址的两个连续的存储单元中(低位在前) 10=1010B,所以10 x=21x+23x 时钟数MOV AX, FACTOR; 10, (AX)=被乘数SHL AX,

40、 1; 2 , (AX)=FACTOR*2MOV BX, AX; 2 , 暂存在BXSHL AX, 1; 2 , (AX)=FACTOR*4SHL AX, 1; 2 , (AX)=FACTOR*8ADD AX, BX; 3 , (AX)=FACTOR*10MOV FACTOR, AX; 10, 存结果HLT; 2, 结束722、SHR (Shift logical right )指令格式:SHR dest, 1或SHR dest, CLSHR将操作数当做无符号数,操作与SHL类似。右移1位时若移位后的最高位和次高位不等,则标志OF1;否则OF0。如果移多位,标志OF的值不定。例如,假设(BL)

41、=F0H, 执行指令SHR BL, 1之后,(BL)=78H, CF=0, OF=1,SF=0,ZF=0,PF=1CF操作数SHR指令操作示意图073与SHL类似,SHR指令可以完成除以某些常数的运算例2.2.12 将一个无符号数除以512。该数存放在以DIVIDAND为首址的两个连续的存储单元中MOV AX, DIVIDAND ; (AX)被除数SHR AX, 1; (AX)=DIVIDAND2XCHG AL, AH;(AL)(AH),相当于循环右移8位CBW ;清AX的高8位,(AX)DIVIDANAN/512HLT743、SAR ( Shift arithmetic right )指令格

42、式:SARdest,1或SAR dest,CLSAR将操作数当做有符号数,操作与SHR类似。SAR指令影响标志CF、PF、SF、ZF。但不影响CF和AF。算术右移1位,相当于带符号数除以2CF操作数SAR指令操作示意图75(三)循环移位指令(Rotate)1、ROL(Rotate left)指令格式:ROLdest,1或ROL dest,CLROL指令影响标志OF和CF,若循环次数为1,且移位后目标操作数新的最高位与CF不等,则OF1;否则,OF0。若循环次数不为1,则OF不定例如:MOV AL,82H ROL AL,1执行结果为:AL=05H,CF=1,OF=1CF操作数ROL指令操作示意图

43、762、ROR ( Rotate right)指令格式:RORdest,1或ROR dest,CL操作与ROL类似,若右移一位后的最高位和次高位不等,则标志OF1;否则OF0。如果循环次数不等于1,标志OF不定。例如:MOV AL,82H ROR AL,1执行结果为:AL=41H,CF=0,OF=1CF操作数ROR指令操作示意图773、RCL(Rotate left through carry)指令格式:RCL dest,1或RCL dest,CL操作与ROL类似,不同之处在于本指令连同进位标志一起循环移位。例如:RCL BYTE PTR100AH,1设DS=6000H,且指令执行前6100A

44、H=8EH,CF=0.则指令执行后, 6100AH=1CH,CF=1.CF操作数RCL指令操作示意图784、RCR(Rotate right through carry)指令格式:RCR dest,1或RCR dest,CL操作与ROR类似,不同之处在于本指令连同进位标志一起循环移位。CF操作数RCR指令操作示意图79循环移位指令(Rotate)与移位(Shift)指令有所不同,循环移位之后,操作数中原来各数位的信息不会丢失,而只是移到了操作数中的其他位或进位标志位CF上,必要时还可以恢复。利用循环移位指令可以对寄存器或存储器中的任一位进行位测试。例如要求测试AL寄存器中第5位的状态是“0”还

45、是“1”,可利用以下指令实现:80 MOV CL, 3; (CL)=移位次数ROL AL, CL ; (CF)=AL的第5位JNC ZERO; 若(CF)=0,转ZERO ROR AL,CL ; 恢复AL的内容 ZERO: 利用带进位循环移位指令还可以将两个以上的寄存器或存储单元组合起来一起移位。例如要求将DX和AX两个寄存器组合成为一个整体,其中的32位一起向左移1位,AX的最高位(D15)应移到DX的最低位(D0),如下图所示:指令为:SHL AX, 1 ; AX左移1位,CF=AX的最高位RCL DX, 1 ; DX带进位循环左移1位,DX的最 ; 低位CF15 DX 0 15 AX 0

46、81四、串操作指令(String manipulation)串操作指令的特点:串操作指令的特点:串操作指令完成字节串或字串的操作源操作数用SI寻址,缺省段寄存器DS,允许段超越。目标操作数用DI寻址,缺省段寄存器ES,不允许段超越。SI和DI在每一个串操作后自动修改:若标志DF0, SI和DI增量(字节操作为1,字操作为2);若DF1, SI和DI减量可以在串操作指令前使用重复前缀:REP、REPE ( REPZ)和REPNE ( REPNZ)。若使用了重复前缀,在每次串操作 后,CX自动减1,且减1操作不影响标志位使用串操作指令的要点:使用串操作指令的要点:预设源串指针(DS:SI),目标串

47、指针(ES:DI),重复次数CX,操作方向DF82 重复操作前缀 REP:无条件重复前缀,重复执行指令规定的操作,直到CX=0 REPE / REPZ:相等/结果为0时重复,ZF=1而且CX0时重复 和REPNE /REPNZ :不相等/结果不为0时重复,ZF=0而且CX0时重复 重复操作前缀可简化程序编写,并加快串操作指令的执行速度。加重复操作前缀后的串操作指令的执行动作为:执行规定的操作SI和DI自动增量或减量CX内容自动减1根据ZF和CX的内容自动决定是否重复执行831、MOVS(Move string)指令格式:REP MOVS ES: dest_string, sreg: src_s

48、tringREP MOVSBREP MOVSW操作: (ES): (DI) (sreg): (SI)把由SI作为指针的源串中的一个字或字节,传送至由DI作为指针的目标串,且相应地修改指针,指向串中的下一个元素。此指令不影响标志位。84例 传送100个字节,可用以下两种形式实现:85法法2:LEASI, SRCLEADI, DESTMOV CX, 100CLDREPMOVS DEST, SRC法法1:LEA SI, SRCLEA DI, DESTMOV CX, 100CLDAGN:MOVS DEST, SRCDEC CXJNZAGN2、CMPS ( Compare string )指令格式:RE

49、PE/ REPNE CMPS sreg:src_str, ES:dest_strREPE/ REPNE CMPSBREPE/ REPNE CMPSW操作:(DS): (SI)-(ES): (DI)86例 比较字符串STRING1和STRING2,若串相同,在RESULT单元中置0,否则,RESULT单元中置0FFH。串长为200.MOV SI, OFFSET STRING1MOV DI, OFFSET STRING2MOV CX, 200CLDREPZ CMPSB;ZF=0且(CX)0重复JNZUNMAT; 若ZF0,转UNMATMOV AL, 0; 否则,(AL)=0 JMPOUTPUTUN

50、MAT:MOV AL, 0FFHOUTPUT:MOV RESULT, AL ; 输出结果HLT873、SCAS ( Scan string )指令格式:REPE/ REPNE SCAS ES:dest_strREPE/ REPNE SCASBREPE/ REPNE SCASW操作:从目标串中查找某个关键字,要求关键字应先置于AX或AL中,具体操作为:字节串扫描:(AL)-( ( ES ): ( DI ) )字串扫描:(AX)-( ( ES ): ( DI ) )例 在100个字符串中寻找第一个回车符CR(ASCII码为0DH),找到后将其地址保留在(ES:DI)中,并在屏幕上显示字符“Y”,若

51、字符串中没有回车符,则在屏幕上显示字符“N”,该字符串的首地址为STRING。88LEA DI, STRING ; 初始化MOV CX, 100MOV AL, 0DHCLDREPNZ SCASB ; CX0且ZF0继续JZ MATCH ; 若ZF1( 找到 ),转MATCHMOV DL, N ; 否则,(DL)=NJMP DISP ; 转DISPMATCH:DEC DI; (DI)-1MOV DL, Y ; (DL)=YDISP:MOV AH, 2 ; 显示字符INT 21HHLT; 结束894、LODS(Load string)指令格式:LODS sreg:src_stringLODSBLO

52、DSW操作:字节串装入:(AL)(DS): (SI)字串装入: (AX)(DS): (SI)LODS指令不影响标志位,而且一般不带重复前缀90例 内存中以BUFFER为首地址的缓冲区内有10个以未压缩BCD码存放的十进制数,将它们顺序显示在屏幕上。LEASI, BUFFER ; 初始化MOVCX, 10CLDMOVAH, 2NEXT:LODSB ; 取一个BCD码到ALOR AL, 00110000B ; BCD码转换成ASCII码MOVDL, AL ; 显示字符INT21HDECCX; (CX)-1JNZNEXT ; 未循环完,转NEXTHLT; 结束914、STOS(Store strin

53、g)指令格式:REPSTOS ES:dest_stringREPSTOSBREPSTOSW操作:字节串送存: (ES): (DI)(AL)字串送存: (ES): (DI)(AX)STOS指令不影响标志位92例 将字符“#”装入以AREA为首地址的100个字节中LEADI, AREAMOVCX, 100MOVAL, #CLDREPSTOSB HLT93五、控制转移指令(Control transfer)控制转移指令包括4类:转移指令,循环指令,过程调用指令和中断控制指令(一)过程(子程序)调用指令1、CALL ( Call a procedure )CALL指令执行时,CPU先将下一条指令的地址

54、(称为返回地址)压入堆栈保护起来,然后将子程序入口地址赋给IP(段内调用)或CS和IP(段间调用),以便执行子程序。94(1) 段内直接调用指令格式:CALL near_proc操作:SPSP-2, (SP+1: SP)IP IP IP+rel其中rel为CALL的下一条指令于被调用过程入口地址之间的16相对位移量95(2)段内间接调用指令格式:CALL reg16/mem16操作:SPSP-2, (SP+1: SP)IP IP reg16/mem16例如:CALL AX;IP AX, 子程序的入口地址由AX给出CALL WORD PTRBX ; IP (BX+1:BX), 子程序的入口地 址

55、为BX+1和BX单元的字内容96(3) 段间直接调用指令格式:CALL far_proc操作:SPSP-2, (SP+1: SP)CSCS SEG far_proc SPSP-2, (SP+1: SP)IPIP OFFSET far_proc97(4)段间间接调用指令格式:CALL mem32操作:先把CALL指令的下一条指令的地址,即CS和IP的内容压入堆栈,然后把指令中指定的连续4个存储单元的内容送入IP和CS,低地址的两个单元内容为偏移地址,送入IP;地址的两个单元内容为段基址,送入CS98例如:设DS=6000H, SI=560H, 单元60560H开始存放的字节数据为:10H, 20

56、H, 30H, 40H. SS=2000H,SP=50H,则:执行指令CALL DWORD PTRSI后:SP=4CH,IP=2010H,CS=4030H992、RET( Return from procedure)指令格式及操作:(1)从近过程返回RET ;IP (SP+1, SP) , SPSP+2(1)从远过程返回RET ; IP (SP+1, SP) , SPSP+2; CS (SP+1, SP) , SPSP+2近过程返回和远过程返回指令形式相同,但底层操作近过程返回和远过程返回指令形式相同,但底层操作不同不同CALL和和RET指令不影响标志位指令不影响标志位100(二)转移指令1、

57、JMP(Jump):无条件转移(1) 段内直接转移指令格式及操作:JMP near_label ; IP IP+rel16/rel8其中rel16/rel8 为JMP的下一条指令到目标地址之间的16位或8位的相对位移量。若为8位,转移范围为-128+127;若为16位,转移范围为-32768+32767;101转移指令与过程调用指令的区别:转移指令与过程调用指令的区别:过程调用需要从子程序中返回,而转移指令不需要(3) 段内间接转移指令格式及操作:JMPreg16 ; IP reg16JMPmem16; IP mem16(4) 段间直接转移指令格式及操作:JMPfar_label;IP OFF

58、SET far_label; CS SEG far_label(5) 段间间接转移指令格式及操作:JMPmem32; IP (mem32) ;CS (mem322)1022、条件转移指令(、条件转移指令(Conditional jumps) 条件转移指令根据前一条指令执行后标志位的条件转移指令根据前一条指令执行后标志位的状态来决定程序是否转移:若满足条件,则程状态来决定程序是否转移:若满足条件,则程序转移到指令指定的地址去执行从那里开始的序转移到指令指定的地址去执行从那里开始的指令;否则,则顺序执行下一条指令。指令;否则,则顺序执行下一条指令。 所有的条件转移都是直接寻址方式的短转移,所有的条

59、件转移都是直接寻址方式的短转移,即只能在以当前即只能在以当前IP值为中心的值为中心的-128+127字节字节范围内转移。范围内转移。 条件转移不影响标志位条件转移不影响标志位103表2.2.1条件转移指令104表2.2.1(续)条件转移指令指令名称助记符转移条件备注低于/不高于等于转移高于等于/不低于转移高于/不低于等于转移低于等于/不高于转移大于/不小于等于转移大于等于/不小于转移小于/不大于等于转移小于等于/不大于转移CX 等于零转移JB/JNAEJAE/JNBJA/JNBEJBE/JNAJG/JNLEJGE/JNLJL/JNGEJBE/JNGJCXZC=1C=0C=0 且 Z=0C=1

60、或 Z=1S=O 且 Z=0S=OSO 且 Z=0SO 或 Z=1CX0无符号数无符号数无符号数无符号数带符号数带符号数带符号数带符号数105例 在内存的数据段中存放了100个8位带符号数,首地址为TABLE,试统计其中正元素、负元素及零元素的个数,分别存入PLUS、MINUS和ZERO单元中106XORAL, ALMOV PLUS, ALMOV MINUS, ALMOV ZERO, ALLEASI, TABLEMOV CX, 100CLDGOON:LODSBORAL, ALJSX1JZX2INCPLUSJMPAGNX1:INCMINUSJMPAGNX2:INCZEROAGN: LOOP GOONHLT(三)

温馨提示

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

评论

0/150

提交评论