微机原理 第3章 8086的指令系统和寻址方式1.ppt_第1页
微机原理 第3章 8086的指令系统和寻址方式1.ppt_第2页
微机原理 第3章 8086的指令系统和寻址方式1.ppt_第3页
微机原理 第3章 8086的指令系统和寻址方式1.ppt_第4页
微机原理 第3章 8086的指令系统和寻址方式1.ppt_第5页
已阅读5页,还剩168页未读 继续免费阅读

下载本文档

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

文档简介

1、第3章,第3章:8086指令系统-教学重点,8088/8086的寻址方式 8088/8086的基本指令 数据传送 加减运算 逻辑运算、移位 控制转移、功能调用,3.1 基本数据类型,3.2 指令格式,从8088/8086的指令格式入手,学习: 立即数寻址方式 寄存器寻址方式 存储器寻址方式 进而熟悉8088/8086汇编语言指令格式,尤其是其中操作数的表达方法 为展开8088/8086指令系统做好准备,3.2 指令的组成,操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有

2、一个或两个操作数,也有个别指令有3个甚至4个操作数,指令由操作码和操作数两部分组成,3.2 指令的助记符格式,操作数2,常被称为源操作数src,它表示参与指令操作的一个对象 操作数1,常被称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果 分号后的内容是对指令的解释,操作码 操作数1,操作数2 ;注释,汇编语句格式,3.2 指令的操作码和操作数,每种指令的操作码: 用一个助记符表示(指令功能的英文缩写) 对应着机器指令的一个或多个二进制编码 指令中的操作数: 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址,3.3 操作数的寻址

3、方式,指令系统设计了多种操作数的来源 寻找操作数的过程就是操作数的寻址 寻找操作数的方式叫做(操作数)寻址方式 理解操作数的寻址方式是理解指令功能的前提 操作数采取哪一种寻址方式 一方面,会影响处理器执行指令的速度和效率 另一方面,对程序设计也很重要,MOV指令,3.3.1 立即数寻址方式,指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中) 这种操作数被称为立即数imm 可以是8位数值i8(00HFFH) 也可以是16位数值i16(0000HFFFFH) 立即数寻址方式常用来给寄存器和存储单元赋值,多以常量形式出现,演示,MOV AX,

4、0102H;AX0102H,3.3.2 寄存器寻址方式,操作数存放在CPU的内部寄存器reg中: 8位寄存器r8: AH、AL、BH、BL、CH、CL、DH、DL 16位寄存器r16: AX、BX、CX、DX、SI、DI、BP、SP 4个段寄存器seg: CS、DS、SS、ES 寄存器名表示其内容(操作数),演示,MOV AX, BX;AXBX,3.3.3 存储器寻址方式,操作数在主存储器中,用主存地址表示 程序设计时,8088采用逻辑地址表示主存地址 段地址在默认的或用段超越前缀指定的段寄存器中 指令中只需给出操作数的偏移地址(有效地址EA) 8086设计了多种存储器寻址方式 1、直接寻址方

5、式 2、寄存器间接寻址方式 3、寄存器相对寻址方式 4、基址变址寻址方式 5、相对基址变址寻址方式,3.3.3 1.直接寻址方式,直接寻址方式的有效地址在指令中直接给出 默认的段地址在DS段寄存器,可使用段超越前缀改变 用中括号包含有效地址,表达存储单元的内容,演示,MOV AX, 2000H;AXDS:2000H,MOV AX, ES: 2000H;AXES:2000H,3.3.3 2. 寄存器间接寻址方式,有效地址存放在基址寄存器BX或变址寄存器SI、DI中 默认的段地址在DS段寄存器,可使用段超越前缀改变,演示,MOV AX, BX;AXDS:BX,3.3.3 3. 寄存器相对寻址方式,

6、有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI 有效地址BX/BP/SI/DI8/16位位移量 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变,演示,MOV AX, SI+06H;AXDS:SI+06H,MOV AX, 06HSI;AXDS:SI+06H,3.3.3 4. 基址变址寻址方式,有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成: 有效地址BX/BPSI/DI 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变,演示,MOV AX, BX+

7、SI;AXDS:BX+SI,MOV AX, BXSI;AXDS:BX+SI,3.3.3 5. 相对基址变址寻址方式,有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和: 有效地址BX/BPSI/DI8/16位位移量 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变,演示,MOV AX, BX+DI+6;AXDS:BX+DI+6,MOV AX, 6BX+DI,MOV AX, 6BXDI,隐含寻址 MUL BL,3.3.3 存储器寻址方式中的变量,变量指示内存中的数据,变量名具有地址属性。存储器寻址方式中经常采用变量形式 变

8、量的定义 WVAR DW 1234H ;定义16位变量WVAR,具有初值1234H 单独引用变量名是直接寻址方式 MOV AX,WVAR ;指令功能:AX1234H 相对寻址方式中,变量名表示其偏移地址,相当于位移量 MOV AX, DI+WVAR ; MOV AX,WVARDI,3.3.3 相对寻址方式中的位移量,在寄存器相对和相对基址变址寻址方式中,其位移量不仅可用常量表示,也可用符号表示 这个符号可以是变量名,例如WVAR变量,而且支持多种表达形式 MOV AX, DI+WVAR ; ;等同于 MOV AX, WVARDI MOV AX,BX+SI+WVAR ;等同于 MOV AX, S

9、I+WVAR BX ;等同于 MOV AX, WVARBX+SI ;等同于 MOV AX, WVARBXSI,3.3.4 操作数的表达符号(1),3.3.4 操作数的表达符号(2),3.4. 通用指令,数据传送是计算机中最基本、最重要的一种操作,传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位 重点掌握 MOV XCHG XLAT PUSH POP LEA,3.4.1 数据传送类指令,提供方便灵活的通用传送操作 有3条指令 MOV XCHG XLAT,3.4.1.1 通用数据传送指令,MOV,XCHG,XLAT,1. 传送指令MO

10、V(move),把一个字节或字的操作数从源地址传送至目的地址,MOV reg/mem,imm ;立即数送寄存器或主存,MOV reg/mem/seg,reg ;寄存器送(段)寄存器或主存,MOV reg/seg,mem ;主存送(段)寄存器,MOV reg/mem,seg ;段寄存器送寄存器或主存,演示,(1)、MOV指令立即数传送,mov cl,4;cl4,字节传送 mov dx,0ffh;dx00ffh,字传送 mov si,200h;si0200h,字传送 mov bvar,0ah;字节传送 ;假设bvar是一个字节变量,定义如下:bvar db 0 mov wvar,0bh;字传送 ;

11、假设wvar是一个字变量,定义如下:wvar dw 0,明确指令是字节操作还是字操作,(2)、MOV指令寄存器传送,mov ah,al;ahal,字节传送 mov bvar,ch;bvarch ,字节传送 mov ax,bx;axbx,字传送 mov ds,ax;dsax,字传送,寄存器具有明确的字节和字类型,(3)、MOV指令存储器传送,mov al,bx;alds:bx mov dx,bp;dxss:bp+0 mov dx,bp+4;dxss:bp+4 mov es,si;esds:si,不存在存储器向存储器的传送指令,(4)、MOV指令段寄存器传送,mov ax,ds;axds mov

12、es,ax;esaxds,对段寄存器的操作不灵活,(5)、MOV指令传送功能图解,MOV指令并非任意传送!,非法指令的主要现象: 两个操作数的类型不一致 无法确定是字节量还是字量操作 两个操作数都是存储器 段寄存器的操作有一些限制,*非法指令两个操作数类型不一致,在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令 MOV AL, 050AH;非法指令,修正: ;mov ax,050ah MOV SI, DL;非法指令,修正: ;mov dh,0 ;mov si,dx,*非法指令无法确定是字节量还是字量操作,当无法通过任一个操作数确

13、定是操作类型时,需要利用汇编语言的操作符显式指明 MOV BX+SI, 255;非法指令,修正: ;mov byte ptr bx+si,255 ;byte ptr 说明是字节操作 ;mov word ptr bx+si,255 ;word ptr 说明是字操作,*非法指令两个操作数都是存储器,8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数) MOV buf2, buf1;非法指令,修正: ;假设buf2和buf1是两个字变量 ;mov ax,buf1 ;mov buf2,ax ;假设buf2和buf1是两个字节变量 ;mov al,buf1 ;mov buf2,a

14、l,*非法指令段寄存器的操作有一些限制,8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活 MOV DS, ES;非法指令,修正: ;mov ax,es ;mov ds,ax MOV DS, 100H;非法指令,修正: ;mov ax,100h ;mov ds,ax MOV CS, SI;非法指令 ;指令存在,但不能执行,2. 交换指令XCHG(exchange),XCHG reg,reg/mem ;reg reg/mem,把两个地方的数据进行互换,寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据 不能在存储器与存储器之间对换数据,演示,例 数据交换,mo

15、v ax,1199h;ax=1199h xchg ah,al;ax=9911h ;等同于 xchg al,ah mov wvar,5566h;wvar是一个字型变量 xchg ax,wvar ;ax=5566h,wvar=9911h ;等同于 xchg wvar,ax,3. 换码指令XLAT(translate),将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL,XLAT;alds:bx+al,换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量 换码指令执行后: 将AL寄存器的内容转换为目标代码,演示,3.4

16、.1.2 堆栈操作指令,堆栈是一个“先进后出” (或说“后进先出” )的主存区域,位于堆栈段中;SS段寄存器记录其段地址 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP,图示,1.进栈指令PUSH,进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部,PUSH r16/m16/seg ;SPSP2 ;SS:SPr16/m16/seg,演示,push ax push 2000h,2.出栈指令POP,出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2,POP r16/m16/seg ; r16/m16/

17、segSS:SP ;SPSP2,演示,pop ax pop wvar,3.堆栈操作的特点,堆栈操作的单位是字,进栈和出栈只对字量 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 堆栈段是程序中不可或缺的一个内存区,常用来 临时存放数据 传递参数 保存和恢复寄存器,3.4.1.3 标志操作指令,1. 标志位操作指令 CLC;复位进位标志:CF0 STC;置位进位标志:CF1 CMC;求反进位标志:CFCF CLD;复位方向标志:DF0 STD;置位方向标志:DF1 CLI;复位中断标志:IF0 STI;置

18、位中断标志:IF1 2. 标志寄存器低字节与AH的传送指令 LAHF SAHF 3. 标志寄存器出入堆栈指令 PUSHF POPF,3.4.1.4 地址传送指令,地址传送指令包括3条指令: 1.取有效地址指令LEA; 2.将地址指针装入DS(数据段寄存器)指令LDS; 3.将地址指针装入ES(附加段寄存器)指令LES。,1.有效地址传送指令LEA(load effective address),将存储器操作数的有效地址送至指定的16位通用寄存器,LEA r16, mem ;r16mem的有效地址EA,例 有效地址的获取 mov bx,400h mov si,3ch lea bx,bx+si+0

19、f62h ;BX400H3CH0F62H139EH,2.地址指针装入DS指令 LDS,功能:把源操作数有效地址所对应的双字长的内存单元中的高字内容(一般为16位段地址)送入DS,低字内容(一般为偏移地址)送入指令所指定的寄存器中。 格式: LDS REG, MEM 例:LDS DI, 2130H ; 执行此指令后,将2130H和2131H 中的内容(偏移量)送到DI中,而将2132H和2133H中的内容(段值)送到DS中。,3.将地址指针装入ES(附加段寄存器)指令LES,功能:把源操作数有效地址所对应的双字长的内存单元中的高字内容(一般为16位段地址)送入ES, 低字内容(一般为偏移地址)送

20、入指令所指定的寄存器中。LES与LDS的指令格式及使用方法是相似的。 格式: LES REG, MEM 例: LES DI, 2130H ; 执行此指令后,将2130H和2131H中的内容(偏移量)送到DI中,而将2132H和2133H中的内容(段值)送到ES中。,3.4.2 算术运算类指令,算术运算类指令用来执行二进制的算术运算:加减乘除。 这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用它们时请留心有关状态标志 重点掌握 加法指令:ADD、ADC、INC 减法指令:SUB 、SBB、DEC、CMP、NEG,3.4.2.1 加法和减法指令,加法指令:ADD, A

21、DC和INC 减法指令:SUB, SBB, DEC, NEG和CMP 它们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其它按定义影响全部状态标志位 操作数组合: 助记符 reg, imm/reg/mem 助记符 mem, imm/reg,1. 加和减指令,ADD dest,src ;加法:destdestsrc ;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数 SUB dest,src ;减法:destdestsrc ;SUB指令使目的操作数减去源操作数,差的结果送到目的操作数,例 加法,mov ax,7348h;AX7348H add al,27h ;AL

22、48H27H6FH,AX736FH ;OF0,SF0,ZF0,PF1,CF0 add ax,3fffh ;AX736FH3FFFHB36EH ;OF1,SF1,ZF0,PF0,CF0,例 减法,sub ah,0f0h ;AHB3HF0HC3H,AXC36EH ;OF0,SF1,ZF0,PF1,CF1 mov word ptr200h,0ef00h ;200HEF00H,标志不变 sub 200h,ax ;200HEF00HC36EH2B92H ;OF0,SF0,ZF0,PF0,CF0 sub si,si;SI0 ;OF0,SF0,ZF1,PF1,CF0,2. 带进位加和减指令,ADC dest

23、,src ;加法:destdestsrcCF ;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数 SBB dest,src ;减法:destdestsrcCF ;SBB指令除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数,例 无符号双字加法和减法,mov ax,7856h;AX7856H mov dx,8234h;DX8234H add ax,8998h;AX01EEH,CF1 adc dx,1234h;DX9469H,CF0 sub ax,4491h;AXBD5DH,CF1 sbb dx,8000h;DX1468H,CF0,3. 比较指令CMP(compar

24、e),CMP dest,src ;做减法运算:destsrc ;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数 比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系,cmp ax,bx cmp al,100,操作数为正数:若SF=0,OPRD1ORD2 若SF=1,OPRD1ORD2 若CF=1, OPRD1ORD2 SF=1, OPRD1ORD2,4. 增量和减量指令,INC reg/mem ;增量(加1):reg/memreg/mem1 DEC reg/mem ;减量(减1):reg/memreg/mem1 INC指令和DEC指令是单操作数指令 与加法和减法指令实现的

25、加1和减1不同的是:INC和DEC不影响CF标志,inc si;sisi1,5. 求补指令NEG(negtive),NEG reg/mem ;reg/mem0reg/mem NEG指令对操作数执行求补运算,即用零减去操作数,然后结果返回操作数 求补运算也可以表达成:将操作数按位取反后加1 NEG指令对标志的影响与用零作减法的SUB指令一样 NEG指令也是一个单操作数指令,例 求补运算,mov ax,0ff64h neg al;AL064H9CH,AXFF9CH ;OF0SF1,ZF0,PF1,CF1 sub al,9dh;AL9CH9DHFFH,AXFFFFH ;OF0,SF1,ZF0,PF1

26、,CF1 neg ax;AX0FFFFH0001H ;OF0,SF0,ZF0,PF0,CF1 dec al;AL01H10,AX0000H ;OF0,SF0,ZF1,PF1,CF1 neg ax;AX000 ;OF0,SF0,ZF1,PF1,CF0,6.十进制调整指令,十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果,以此实现十进制BCD码运算 8088指令系统支持两种BCD码调整运算 压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即0099 非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进

27、制位09,高4位任意,通常默认为0,编码的比较,真值(十进制)864 二进制编码08H40H 压缩BCD码08H64H 非压缩BCD码08H0604H ASCII码38H3634H,压缩BCD码加减法调整指令 DAA DAS 非压缩BCD码加减乘除法调整指令 AAA AAS AAM AAD,.压缩BCD码加减法调整指令,DAA:调整组合十进制数加法 注意:在ADD后使用,影响AF、CF、PF、SF、ZF 规则:1、若AL的低4位大于9,或AF=1,则: AL AL+6,CF 1 2、若AL9FH或C=1,则: AL AL+60H,CF 1 DAS:调整组合十进制数减法 注意:在SUB后使用,影

28、响AF、CF、PF、SF、ZF 规则:1、若AL的低4位大于9,或AF=1,则: AL AL-6,CF 1 2、若AL9FH或C=1,则: AL AL-60H,CF 1,.非压缩BCD码加减乘除法调整指令,AAA AAS AAM AAD AAA:调整AL中两个未组合十进制数的和,产生一未组合十进制数。 注意:在ADD后使用,影响AF、CF、PF、SF、ZF 规则:若AL的低4位大于9,或AF=1,则: AL AL+6,同时AL的高4位清零, AH AH+1, AF 1,CF AF 例:设AL=7,BL=9 MOV AL,07H MOV BL,09H ADD AL,BL AAA 结果:AX=00

29、010110B,AAS:调整AL中两个未组合十进制数的差,产生一未组合十进制数。 注意:在SUB后使用,影响AF、CF 规则:若AL的低4位大于9,或AF=1,则: AL AL-6,同时AL的高4位清零, AH AH-1, AF 1,CF AF,AAM:调整AX中未组合十进制数相乘结果 注意:影响PF、SF、ZF,用在MUL后 规则: AH AL/0AH(商) ,AL AL%AH(余数),AAD:调整AX中未组合十进制数(相除前) 注意:用在DIV前 规则:AL AH*0AH=AL,3.4.2.2 符号扩展指令,符号扩展是指用一个操作数的符号位(最高位)形成另一个操作数,后一个操作数的高位是全

30、0(正数)或全1(负数) 符号扩展虽然使数据位数加长,但数据大小并没有改变,扩展的高部分仅是低部分的符号扩展 符号扩展指令有两条,用来将字节转换为字,字转换为双字 CBW;AL符号扩展成AX CWD;AX符号扩展成DX,例 符号扩展,mov al,64h ;AL64H (机器数) ,表示十进制数100(真值) cbw ;将符号0扩展,AX0064H,仍然表示100 mov ax,0ff00h ;AXFF00H,表示有符号十进制数256 cwd ;将符号位“1”扩展,DX.AX0FFFFFF00H ;仍然表示256,3.4.2.3 乘法和除法指令,乘法指令分无符号和有符号乘法指令 MUL reg

31、/mem;无符号乘法 IMUL reg/mem;有符号乘法 除法指令分无符号和有符号除法指令 DIV reg/mem;无符号除法 IDIV reg/mem;有符号除法,1. 逻辑运算指令,双操作数逻辑指令AND、OR、XOR和TEST设置CFOF0,根据结果设置SF、ZF和PF状态,而对AF未定义;它们的操作数组合与ADD、SUB等一样: 运算指令助记符 reg, imm/reg/mem 运算指令助记符 mem, imm/reg 单操作数逻辑指令NOT不影响标志位,操作数与INC、DEC和NEG一样: NOT reg/mem,.逻辑与指令AND,对两个操作数执行逻辑与运算,结果送目的操作数,A

32、ND dest,src;destdestsrc,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,.逻辑或指令OR,对两个操作数执行逻辑或运算,结果送目的操作数,OR dest,src;destdestsrc,只要相“或”的两位有一位是1,结果就是1;否则,结果为0,.逻辑异或指令XOR,对两个操作数执行逻辑异或运算,结果送目的操作数,XOR dest,src;destdestsrc,只有相“异或”的两位不相同,结果才是1;否则,结果为0, .测试指令TEST,对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志,TEST dest,src;destsrc,AN

33、D与TEST 指令的关系, 同SUB与CMP 指令的关系一样,.逻辑非指令NOT,对一个操作数执行逻辑非运算,NOT reg/mem;reg/memreg/mem,按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”,例 逻辑运算,mov al,75h;AL75H and al,32h;AL30H ;CFOF0, SF0,ZF0,PF1 or al,71h;AL71H ;CFOF0,SF0,ZF0,PF1 xor al,0f1h;AL80H ;CFOF0,SF1,ZF0,PF0 not al;AL7FH,标志不变,例 逻辑运算指令的应用,and bl,11110110b ;BL中D

34、0和D3清0,其余位不变 or bl,00001001b ;BL中D0和D3置1,其余位不变,AND指令可用于复位某些位(与0相与),不影响其它位,OR指令可用于置位某些位(与1相或),不影响其它位,2.移位指令,将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作 移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数: 该操作数为1,表示移动一位 该操作数为CL,CL寄存器值 表示移位位数 (移位位数大于1只能用CL表示) 按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF,.逻辑左移指令SHL,SH L reg/m

35、em,1/C L ;reg/mem左移1或CL位 ;最低位补0,最高位进入CF,演示,.逻辑右移指令SHR,SH R reg/mem,1/CL ;reg/mem右移1/CL位 ;最高位补0,最低位进入CF,演示,.算术右移指令SAR,SAR reg/mem,1/CL ;reg/mem右移1/CL位 ;最高位不变,最低位进入CF,演示,.算术左移指令SAL,SAL reg/mem,1/CL ;与SH L是同一条指令,演示,例 数据移位,mov dx,60 75h;DX01100000 01110101B shl dx,1;DX11000000 11101010B ;CF0,SF1、ZF0、PF0

36、 sar dx,1;DX11100000 01110101B ;CF0,SF1、ZF0、PF0 shr dx,1;DX01110000 00111010B ;CF1,SF0、ZF0、PF1 mov cl,4;CL4,标志不变 sar dx,cl;DX00000111 00000011B ;CF1,SF0、ZF0、PF1,例 将AL寄存器中的无符号数乘以10,xor ah,ah;实现AH0,同时使CF0 shl ax,1;AX2AL mov bx,ax;BXAX2AL shl ax,1;AX4AL shl ax,1;AX8AL add ax,bx;AX8AL2AL10AL,逻辑左移一位相当于无符

37、号数乘以2 逻辑右移一位相当于无符号数除以2,3.循环移位指令,循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为: ROL reg/mem,1/CL;不带进 位循 环左 移 ROR reg/mem,1/CL;不带进 位循 环右 移 RCL reg/mem,1/CL;带进 位循 环左 移 RCR reg/mem,1/CL;带进 位循 环右 移 循环移位指令的操作数形式 与 移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF 标 志,演示,演示,演示,演示,3.4.4 串操作指令,串操作指令是8086指令系统中比较独特的一类指令,采用比较特殊的数据串寻

38、址方式,在操作主存连续区域的数据时,特别好用,因而常用 重点掌握:MOVS STOS LODS CMPS SCAS REP 一般了解:REPZ/REPE REPNZ/REPNE,1、串数据类型,串操作指令的操作数是主存中连续存放的数据串(String)即在连续的主存区域中,字节或字的序列 串操作指令的操作对象是以字(W)为单位的字串,或是以字节(B)为单位的字节串,2、串寻址方式,源操作数用寄存器SI寻址,默认在数据段DS中,但允许段重设:DS:SI 目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段重设:ES:DI 每执行一次串操作指令,SI和DI将自动修改: 1(对于字节串)或2(对

39、于字串) 执行指令CLD指令后,DF = 0,地址指针增1或2 执行指令STD指令后,DF = 1,地址指针减1或2,3、串传送MOVS(move string),把字节或字操作数从主存的源地址传送至目的地址,MOVSB ;字节串传送:ES:DIDS:SI ;SISI1,DIDI1,MOVSW ;字串传送:ES:DIDS:SI ;SISI2,DIDI2,演示,演示,例:字节串传送,mov si,offset source mov di,offset destination mov cx,100;cx传送次数 cld;置DF=0,地址增加 again:movsb;传送一个字节 dec cx;传送

40、次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束,演示,例:字串传送,mov si,offset source mov di,offset destination mov cx,50;cx传送次数 cld;置DF=0,地址增加 again:movsw;传送一个字 dec cx;传送次数减1 jnz again ;判断传送次数cx是否为0 ;不为0,则到again位置执行指令 ;否则,结束,4、串比较CMPS(compare string),将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系,CMPSB ;字节

41、串比较:DS:SIES:DI ;SISI1,DIDI1,CMPSW ;字串比较:DS:SIES:DI ;SISI2,DIDI2,例:比较字符串,mov si,offset string1 mov di,offset string2 mov cx,count cld again:cmpsb;比较两个字符 jnz unmat;有不同字符,转移 mov al,0;字符串相等,设置00h jmp output;转向output dec cx jnz again;进行下一个字符比较 unmat:mov al,0ffh;设置ffh output:mov result,al;输出结果标记,5、串扫描SCAS

42、(scan string),将AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系,SCASB ;字节串扫描:ALES:DI ;DIDI1,SCASW ;字串扫描:AXES:DI ;DIDI2,例:查找字符串,mov di,offset string mov al,20h mov cx,count cld again:scasb;搜索 jz found;为0(ZF=1),发现空格 dec cx;不是空格 jnz again;搜索下一个字符 .;不含空格,则继续执行 found:.,6、串装入LODS(load string),把指定主存单元的数据传送给AL或AX,LO

43、DSB ;字节串读取:ALDS:SI ;SISI1,LODSW ;字串读取:AXDS:SI ;SISI2,7、串存储STOS(store string),把AL或AX数据传送至目的地址,STOSB ;字节串存储:ES:DIAL ;DIDI1,STOSW ;字串存储:ES:DIAX ;DIDI2,例:串存储,mov ax,0 mov di,0 mov cx,8000h;cx传送次数(321024) cld;DF=0,地址增加 again:stosw;传送一个字 dec cx;传送次数减1 jnz again;传送次数cx是否为0,8、重复前缀指令(repeat),串操作指令执行一次,仅对数据串中

44、的一个字节或字量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在CX寄存器中 重复前缀分两类,3条指令: 配合不影响标志的MOVS、STOS(和LODS)指令的REP前缀 配合影响标志的CMPS和SCAS指令的REPZ和REPNZ前缀,、REP重复前缀指令,REP;每执行一次串指令,CX减1 ;直到CX0,重复执行结束,REP前缀可以理解为:当数据串没有结束(CX0 ),则继续传送,重复串传送,mov si,offset source mov di,offset destination mov cx,100;cx传送次数 cld rep movsb,aga

45、in:movsb;传送一个字节 dec cx;传送次数减1 jnz again;判断传送次数cx是否为0 ;不为0(ZF=0),则转移again位置执行 ;否则,结束,演示,重复串存储,mov ax,0 mov di,0 mov cx,8000h cld rep stosw,again:stosw;传送一个字 dec cx;传送次数减1 jnz again;判断传送次数cx是否为0,、REPZ重复前缀指令,REPZ;每执行一次串指令,CX减1 ;并判断ZF是否为0, ;只要CX0或ZF0,重复执行结束,REPZ/REPE前缀可以理解为:当数据串没有结束(CX0),并且串相等(ZF1),则继续比

46、较,、REPNZ重复前缀指令,REPNZ;每执行一次串指令,CX减1 ;并判断ZF是否为1, ;只要CX0或ZF1,重复执行结束,REPNZ/REPNE前缀可以理解为:当数据串没有结束(CX0 ),并且串不相等(ZF 0 ),则继续比较,例:比较字符串,mov si,offset string1 mov di,offset string2 mov cx,count cld repz cmpsb;重复比较两个字符 jnz unmat;字符串不等,转移 mov al,0;字符串相等,设置00h jmp output;转向output unmat:mov al,0ffh;设置ffh output:m

47、ov result,al;输出结果标记,例:查找字符串,mov di,offset string mov al,20h mov cx,count cld repnz scasb;搜索 jz found;为0(ZF=1),发现空格 .;不含空格,则继续执行 found:.,3.4.5 控制传送类指令,控制传送类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的常用指令,控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变,目标地址的寻址方式,相对寻址方式 指令代码中提供目的地址相对于当前IP的位移量,转移到的目的地址(转移后的IP值)就是当前IP值加上位移量 直接寻址方式 指令

48、代码中提供目的逻辑地址,转移后的CS和IP值直接来自指令操作码后的目的地址操作数 间接寻址方式 指令代码中指示寄存器或存储单元,目的地址从寄存器或存储单元中间接获得,目标地址的寻址范围:段内寻址,段内转移近转移(near) 在当前代码段64KB范围内转移( 32KB范围) 不需要更改CS段地址,只要改变IP偏移地址 段内转移短转移(short) 转移范围可以用一个字节表达,在段内128127范围的转移,目标地址的寻址范围:段间寻址,段间转移远转移(far) 从当前代码段跳转到另一个代码段,可以在1MB范围 需要更改CS段地址和IP偏移地址 目标地址必须用一个32位数表达,叫做32位远指针,它就

49、是逻辑地址,实际编程时,汇编程序会根据目标地址的属性,自动处理成短转移、近转移或远转移 程序员可用操作符short、near ptr 或far ptr 强制成为需要的转移类型,代码段,代码段,1.子程序指令,子程序是完成特定功能的一段程序 当主程序(调用程序)需要执行这个功能时,采用CALL调用指令转移到该子程序的起始处执行 当运行完子程序功能后,采用RET返回指令回到主程序继续执行,转移指令有去无回 子程序调用需要返回, 其中利用堆栈保存返回地址,演示,. 子程序调用指令CALL,CALL指令分成4种类型 CALL label;段内调用、直接寻址 CALL r16/m16;段内调用、间接寻址

50、 CALL far ptr label;段间调用、直接寻址 CALL far ptr mem;段间调用、间接寻址 CALL指令需要保存返回地址: 段内调用入栈偏移地址IP SPSP2,SS:SPIP 段间调用入栈偏移地址IP和段地址CS SPSP2,SS:SPCS SPSP2,SS:SPIP,. 子程序返回指令RET,根据段内和段间、有无参数,分成4种类型 RET;无参数段内返回 RET i16;有参数段内返回 RET;无参数段间返回 RET i16;有参数段间返回 需要弹出CALL指令压入堆栈的返回地址 段内返回出栈偏移地址IP IPSS:SP, SPSP2 段间返回出栈偏移地址IP和段地址

51、CS IPSS:SP,SPSP2 CSSS:SP,SPSP2,2.无条件转移指令,JMP label;程序转向label标号指定的地址,只要执行无条件转移指令JMP,就使程序转到指定的目标地址,从目标地址处开始执行指令 操作数label是要转移到的目标地址(目的地址、转移地址) JMP指令分成4种类型: 段内转移、相对寻址 段内转移、间接寻址 段间转移、直接寻址 段间转移、间接寻址,无条件转移指令JMP(jump),JMP label;段内转移、相对寻址 ;IPIP位移量 JMP r16/m16;段内转移、间接寻址 ;IPr16/m16 JMP far ptr label;段间转移、直接寻址

52、;IP偏移地址,CS段地址 JMP far ptr mem;段间转移,间接寻址 ;IPmem,CSmem2,演示,演示,演示,演示,演示,3.条件转移指令,条件转移指令Jcc根据指定的条件确定程序是否发生转移。其通用格式为: Jcc label;条件满足,发生转移 ;IPIP8位位移量; ;否则,顺序执行 label是一个标号、一个8位位移量,表示Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移 label只支持短转移的相对寻址方式,4.Jcc指令,Jcc指令不影响标志,但要利用标志(表) 根据利用的标志位不同,分成三种情况: 判断单个标志位状态 比较无符号数高低 比较有符号数

53、大小,(1).判断单个标志位状态,JZ/JE和JNZ/JNE 利用 零标志 ZF,判断结果是否为零(或相等) JS和JNS 利用符号标志SF,判断结果是正是负 JO和JNO 利用溢出标志OF,判断结果是否产生溢出 JP/JPE和JNP/JPO 利用奇偶标志PF,判断结果中“1”的个数是偶是奇 JC/JB/JNAE和JNC/JNB/JAE 利用进位标志CF,判断结果是否进位或借位,例题,题目:将AX中存放的无符号数除以2,如果是奇数则加1后除以2 问题:如何判断AX中的数据是奇数还是偶数? 解答:判断AX最低位是“0”(偶数),还是“1”(奇数)。可以用位操作类指令 1:用逻辑与指令将除最低位外

54、的其他位变成0,保留最低位不变。判断这个数据是0,AX就是偶数;否则,为奇数 2:将最低位用移位指令移至进位标志,判断进位标志是0,AX就是偶数;否则,为奇数 3:将最低位用移位指令移至最高位(符号位),判断符号标志是0,AX就是偶数;否则,为奇数,例题解答1 :用JZ指令实现,test ax,01h ;测试AX的最低位D0(不用AND指令,以免改变AX) jz even ;标志ZF1,即D00:AX内是偶数,程序转移 add ax,1 ;标志ZF0,即D01:AX内的奇数,加1 even:shr ax,1;AXAX2,例题解答2 :用JNC指令实现,mov bx,ax shr bx,1 ;将

55、AX的最低位D0移进CF jnc even ;标志CF0,即D00:AX内是偶数,程序转移 add ax,1 ;标志CF1,即D01:AX内的奇数,加1 even:shr ax,1;AXAX2,还可用SAR、ROR和RCR指令,例题解答3 :用JNS指令实现,mov bx,ax ror bx,1 ;将AX的最低位D0移进最高位 jns even ;标志SF0,即D00:AX内是偶数,程序转移 add ax,1 ;标志SF1,即D01:AX内的奇数,加1 even:shr ax,1;AXAX2,错误!循环指令不影响SF等标志,例:判断是否为字母Y,;寄存器AL中是字母Y(含大小写),则令AH0,

56、否则令AH1 cmp al,y;比较AL与小写字母y je next;相等,转移 cmp al,Y ;不相等, ;继续比较AL与大写字母Y je next;相等,转移 mov ah,-1;不相等,令AH1 jmp done;无条件转移指令 next:mov ah,0;相等的处理:令AH0 done:,(2). 比较无符号数高低,无符号数的大小用高(Above)、低(Below)表示,需要利用CF确定高低、利用ZF标志确定相等(Equal) 两数的高低分成4种关系,对应4条指令 JB(JNAE):目的操作数低于(不高于等于)源操作数 JNB(JAE):目的操作数不低于(高于等于)源操作数 JBE

57、(JNA):目的操作数低于等于(不高于)源操作数 JNBE(JA):目的操作数不低于等于(高于)源操作数,(3). 比较有符号数大小,判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否 两数的大小分成4种关系,分别对应4条指令 JL(JNGE):目的操作数小于(不大于等于)源操作数 JNL(JGE):目的操作数不小于(大于等于)源操作数 JLE(JNG):目的操作数小于等于(不大于)源操作数 JNLE(JG):目的操作数不小于等于(大于)源操作数,例:求较大值,cmp ax,bx;比较AX和BX jae next;若AXBX,转移 xchg

58、ax,bx;若AXBX,交换 next:mov wmax,ax,如果AX和BX存放的是有符号数, 则条件转移指令应采用JGE指令,例:求较大值(另解),cmp ax,bx;比较AX和BX jae next mov wmax, bx ;若AXBX,wmaxBX jmp done next:mov wmax,ax ;若AXBX,wmaxAX done:,例:求较大值(另解对比),cmp ax,bx;比较AX和BX jbe next mov wmax, ax ;若AXBX,wmaxAX jmp done next:mov wmax,bx ;若AXBX,wmaxBX done:,5.循环指令,一段代码

59、序列多次重复执行就是循环 8088设计有针对CX计数器的计数循环指令 LOOP label;循环指令 ;首先CXCX1;然后判断;若CX0,转移 JCXZ label;为0循环指令 :如果CX0,则转移 label操作数采用相对短寻址方式 还有LOOPZ/LOOPE和LOOPNZ/LOOPNE两条指令,例:数据块传送(字节),mov cx,400h ;设置循环次数:1K1024400H mov si,offset sbuf ;设置循环初值:SI指向数据段源缓冲区开始 mov di,offset dbuf ;DI指向附加段目的缓冲区开始(附加段) again:mov al,si;循环体:实现数据传送 mov es:di,al;每次传送一个字节 inc si;SI和DI指向下一个单元 inc di loop again ;循环条件判定:循环次数减1,不为0转移(循环),

温馨提示

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

评论

0/150

提交评论