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

下载本文档

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

文档简介

1、第 3 章,教学重点,1.8086寻址方式 2.重点掌握常用指令功能及应用 常用传送指令 算术运算指令(主要是加减法) 逻辑运算和移位指令 控制转移指令 字符(串)输入输出功能调用,3.1 8086的寻址方式,从8086的机器代码格式入手,论述: 立即数寻址方式 寄存器寻址方式 存储器寻址方式 进而熟悉8086汇编语言指令格式,尤其是其中操作数的表达方法;为展开8086指令系统做好准备,建议采用调试程序DEBUG进行实践,调试程序DEBUG,DEBUG是常用的汇编语言级调试工具,为汇编语言程序员提供了分析指令、跟踪程序的有效手段 常用命令: A 汇编U 反汇编 T 单步执行G 断点执行 D 数

2、据显示R 寄存器,感性认识因深刻而显重要,指令的组成,指令由操作码和操作数两部分组成 操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数,指令的操作码和操作数,每种指令的操作码: 用一个唯一的助记符表示(指令功能的英文缩写) 对应着机器指令的一个二进制编码 指令中的操作数: 可以是一个具体的数值 可以是存放数据的寄存器 或指明数据在主存位置的存储器地址 如何指明操作数呢?,寻址方式,指令系统设计了多种操作数的来源 寻址就是

3、寻找操作数的过程 操作数采取哪一种寻址方式,会影响机器运行的速度和效率,如何寻址一个操作数对程序设计很重要,3.1.1 8086的机器代码格式,要求:了解,标准机器代码示例,mov ax,BP+0 ;机器代码是 8B 46 00 前一个字节8B是操作码(含w1表示字操作) 中间一个字节46(01 000 110)是 “mod reg r/m”字节 reg000表示目的操作数为AX mod01和r/m110表示源操作数为BP+D8 最后一个字节就是8位位移量D800,其它机器代码形式,mov al,05 ;机器代码是B0 05 前一个字节B0是操作码(隐含一个操作数AL),后一个字节05是立即数

4、 mov ax,0102H ;机器代码是B8 02 01 前一个字节B8是操作码(隐含一个操作数AX),后两个字节02 01是16位立即数(低字节02在低地址),指令格式,操作码 操作数1,操作数2;注释 操作数2,称为源操作数 src,它表示参与指令操作的一个对象 操作数1,称为目的操作数 dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果 分号后的内容是对指令的解释,示例,传送指令MOV的格式,MOV dest,src;destsrc MOV指令的功能是将源操作数src传送至目的操作数dest,例如: MOV AL,05H;AL05H MOV BX,AX;BXAX M

5、OV AX,SI;AXDS:SI MOV AX,BP+06H;AXSS:BP+06H MOV AX,BX+SI;AXDS:BX+SI,演示,传送指令MOV的功能,源操作数 src,目的操作数 dest,30H,30H,被传送的数据,3.1.2 立即数寻址方式,指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中) 这种操作数被称为立即数imm 它可以是8位数值i8(00HFFH) 也可以是16位数值i16(0000HFFFFH) 立即数寻址方式常用来给寄存器赋值,立即数寻址指令,MOV AL,05H;AL05H MOV AX,0102H;AX

6、0102H,立即寻址,立即数寻址的特点: 1)取指令时,操作码与操作数同时被取出,不需再访问存储器,可提高执行速度 2)缺点是操作数在程序中是固定的,灵活性差,只适用于操作数固定的情况,如给寄存器或存储器变量赋初值等。例如 mov cx, 1 mov ax, 0 mov x, 50h,3.1.3 寄存器寻址方式,操作数存放在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,1234H;AX1234

7、H MOV BX,AX;BXAX,寄存器寻址,设DH=78H ,则执行 DEC DH 的结果是: DH=?,寄存器寻址的特点: 地址码短、速度快,适用于存放程序中频繁使用的操作数 缺点是寄存器数量有限,3.1.4 存储器寻址方式,指令中给出操作数的主存地址信息(偏移地址,称之为有效地址EA),而段地址在默认的或用段超越前缀指定的段寄存器中 8086设计了多种存储器寻址方式 1、直接寻址方式 2、寄存器间接寻址方式 3、寄存器相对寻址方式(即变址寻址) 4、基址变址寻址方式 5、相对基址变址寻址方式,直接寻址方式,指令中直接给出操作数在存储器中的 偏移地址 默认的段地址在DS段寄存器 例如: M

8、OV AX,2000H ;指令代码:A10020 功能: AXDS:2000H MOV AX,ES:2000H ;AXES:2000H 指令代码:26A10020,直接寻址,直接寻址方式,另一种格式:用含有变量的表达式表示操作数的偏移地址,例如 MOV AX, BUFA ;将变量BUFA的内容送AX MOV DX, A3+2 ;将数据段中偏移地址为A3+2的单元的内容送DX 举例:假设执行该指令前(DS)=1000H,变量A3在数据段中的定义如下,分析以上两指令的执行结果: .DATA A1 DB 0 BUFA DB 12,13, 90 A3 DB 20,30,40,直接寻址方式,直接寻址的特

9、点: 可以直接计算有效地址,只需访问一次存储器即可取得操作数,速度较快 特别适合处理单个变量 但直接寻址的存储器范围有限,寄存器间接寻址方式,寄存器中存放的是操作数的偏移地址EA 可用寄存器有:BX、SI、DI、BP 提示: 当寄存器为BX、SI、DI时,默认的段地址在DS段寄存器中; 当寄存器为BP时,默认的段寄存器是SS;也可使用段超越前缀改变。 例如:MOV AX,SI;AXDS:SI,间接寻址,寄存器间接寻址方式,例1:MOV AX, SI 分析源操作数的有效地址的计算 设执行前,(AX)=0050H, (SI)=200H, (DS)=1000H,(10200H)=F000H,则指令的

10、执行过程如下: 首先计算有效地址PA=10000H+200H=10200H 然后执行: (10200H)-AX 例2:MOV AX, BP 设执行前,(AX)=50H,(BP)=100H, (SS)=3000H, (30100H)00FCH,分析执行过程,寄存器间接寻址方式,特点: 地址码中的寄存器中的内容位操作数的偏移地址 用于存取存储器中的数据,方便灵活 可以有效的缩短指令长度 很常用,阶段综合练习,练习分析前面的几种寻址方式 例题:见寻址综合练习1,寄存器相对寻址方式(即变址寻址),操作数的偏移地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP、SI、DI 偏移地址B

11、X/BP/SI/DI8/16位位移量 BX/SI/DI寄存器对应的默认段寄存器是DS,即PA=(DS)左移4位+(EA) BP寄存器对应的默认段寄存器是SS 也可用段超越前缀改变,寄存器相对寻址指令,MOV AX,DI+06H ;AXDS:DI+06H MOV AX,BP+06H ;AXSS:BP+06H MOV CX, SI-6H MOV DX, BX+8H 分析有效地址的计算,相对寻址,寄存器相对寻址指令,应用: 常用于访问数组 例如:求数组BUF的前10个元素之和的程序段 MOV AX, 0 MOV BX, 0 MOV CX, 10 LOOPA: ADD AX, BX+BUF INC B

12、X DEC CX JNZ LOOPA,基址变址寻址方式,偏移地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成: 偏移地址BX/BPSI/DI 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变,基址变址寻址指令,MOV AX,BX+SI ;AXDS:BX+SI MOV AX,BP+DI ;AXSS:BP+DI MOV AX,DS:BP+DI ;AXDS:BP+DI,基址变址,相对基址变址寻址方式,偏移地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和: 偏移地址BX/BPSI/DI8/16位位移量 段

13、地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变,相对基址变址寻址指令,MOV AX,BX+SI+06H ;AXDS:BX+SI+06H,位移量可用符号表示 同一寻址方式有多种表达形式,相对基址变址,用符号表示位移量,在寄存器相对寻址或相对基址变址寻址方式中,位移量可用符号表示: MOV AX,SI+COUNT ;COUNT是事先定义的变量或常量(就是数值) MOV AX,BX+SI+WNUM ;WNUM也是变量或常量,多种表达形式,同一寻址方式可以写成不同的形式: MOV AX,BXSI ;等同于 MOV AX,BX+SI MOV AX,COUNTSI ;等

14、同于 MOV AX,SI+COUNT MOV AX,WNUMBXSI ;等同于 MOV AX,WNUMBX+SI ;等同于 MOV AX,BX+SI+WNUM,指令操作数的表达寄存器,r8任意一个8位通用寄存器 AH AL BH BL CH CL DH DL r16任意一个16位通用寄存器 AX BX CX DX SI DI BP SP reg代表r8或r16 seg段寄存器 CS/DS/ES/SS,一定要熟悉噢!,指令操作数的表达存储器,m8一个8位存储器操作数单元(所有主存寻址方式) m16一个16位存储器操作数单元(所有主存寻址方式) mem代表m8或m16,一定要熟悉噢!,指令操作数的

15、表达立即数,i8一个8位立即数 i16一个16位立即数 imm代表i8或i16 dest目的操作数 src源操作数,一定要熟悉噢!,寻址方式综合练习2,见寻址综合练习2,什么是指令系统,计算机的指令系统就是指该计算机能够执行的全部指令的集合 每种计算机都有它支持的指令集合 16位8086指令系统是Intel 80 x86系列微处理器指令系统的基础,8086指令系统概述,Intel 8086指令系统共有117条基本指令,可分成6个功能组 数据传送类指令 算术运算类指令 位操作类指令(含逻辑运算指令) 串操作类指令 控制转移类指令 处理机控制类指令 说明:重点掌握 ,其他以后逐渐掌握,如何学习,学

16、习指令的要点,指令的功能该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式 指令支持的寻址方式该指令中的操作数可以采用何种寻址方式 指令对标志的影响该指令执行后是否对各个标志位有影响,以及如何影响 其他方面该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等,汇编语言指令格式,由4部分组成: 标号:指令助记符 目的操作数,源操作数;注释,标号表示该指令在主存中的逻辑地址,每个指令助记符就代表一种指令,目的和源操作数表示参与操作的对象,注释是对该指令或程序段功能的说明,其中,标号、操作数、注释根据指令的功能可选,教学提示,全面而准确地理解

17、每条指令的功能和应用,是编写汇编语言程序的关键,逐个展开指令,2.1 数据传送类指令,数据传送指令是计算机中最基本、最重要、最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置 除标志寄存器传送指令外,均不影响标志位 重点掌握 MOV XCHG XLAT PUSH POP LEA,2.1.1 通用数据传送指令,3条指令 MOV XCHG XLAT,MOV,XCHG,XLAT,1. 传送指令MOV(move),把一个字节或字的操作数从源地址传送至目的地址,MOV reg/mem,imm ;立即数送寄存器或主存,MOV,例题2.1,MOV reg/mem/seg,reg ;寄存器送(段)寄

18、存器或主存,例题2.2,MOV reg/seg,mem ;主存送(段)寄存器,例题2.3,MOV reg/mem,seg ;段寄存器送寄存器或主存,例题2.5,重点,例3.1:立即数传送,mov al,4;al4,字节传送 mov cx,0ffh;cx00ffh,字传送 mov si,200h;si0200h,字传送 mov byte ptr si,0ah ;byte ptr 说明是字节操作 mov word ptr si+2,0bh ;word ptr 说明是字操作,注意立即数是字节量还是字量 明确指令是字节操作还是字操作,MOV,例3.2:寄存器传送,mov ax,bx;axbx,字传送

19、mov ah,al;ahal,字节传送 mov ds,ax;dsax,字传送 mov bx,al;bxal,字节传送,MOV,例3.3:存储器传送,mov al,bx mov dx,bp;dxss:bp mov es,si;esds:si,不存在存储器向存储器的传送指令,MOV,例3.5:段寄存器传送,mov si,ds mov ax,es;axes mov ds,ax;dsaxes,对段寄存器的操作有一些限制,MOV,MOV指令传送功能,MOV也并非任意传送,非法传送:,两个操作数的类型不一致 例如源操作数是字节,而目的操作数是字;或相反 两个操作数不能都是存储器 传送指令很灵活,但主存之间

20、的直接传送却不允许 段寄存器的操作有一些限制 段寄存器属专用寄存器,对他们的操作能力有限,示例,示例,示例,两个操作数的类型要一致,绝大多数双操作数指令,除非特别说明,目的操作数与源操作数必须类型一致,否则为非法指令 MOV AL,050AH ;非法指令:050Ah为字,而AL为字节 寄存器有明确的字节或字类型,有寄存器参与的指令其操作数类型就是寄存器的类型 对于存储器单元与立即数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr指示字类型,两个操作数不能都是存储器,8086指令系统不允许两个操作数都是存储单元(除串操作指令),要实现这种传送,可通过寄存器间接实

21、现 mov ax,buffer1 ;axbuffer1(将buffer1内容送ax) mov buffer2,ax ;buffer2ax ;这里buffer1和buffer2是两个字变量 ;实际表示直接寻址方式,要小心段寄存器的操作,不允许立即数传送给段寄存器 MOV DS,100H ;非法指令:立即数不能传送段寄存器 不允许直接改变CS值 MOV CS,SI;不允许使用的指令 不允许段寄存器之间的直接数据传送 MOV DS,ES ;非法指令:不允许段寄存器间传送,2. 交换指令XCHG(exchange),把两个地方的数据进行互换,寄存器与寄存器之间对换数据 寄存器与存储器之间对换数据 不能

22、在存储器与存储器之间对换数据,XCHG,XCHG reg,reg/mem ;reg reg/mem,例题2.7,例题2.6,重点,例3.6:寄存器间交换,mov ax,1234h;ax=1234h mov bx,5678h;bx=5678h xchg ax,bx ;ax=5678h,bx=1234h xchg ah,al;ax=7856h,XCHG,例3.7:寄存器与存储器交换,xchg ax,2000h;字交换 ;等同于 xchg 2000h,ax xchg al,2000h ;字节交换 ;等同于 xchg 2000h,al,XCHG,应用: 换码指令执行前: 在主存建立一个字节量表格,内含

23、要转换成的目的代码。 表格首地址存放于BX,AL存放相对表格首地址的位移量 换码指令执行后: 将AL寄存器的内容转换为目标代码,3. 换码指令XLAT(translate),即查表转换指令:将BX指定的缓冲区中、AL指定的位移处的一个字节数据取出赋给AL,XLAT,XLAT;alds:bx+al,例题2.8,重点,例3.8:代码转换,假设自数据段100h初开始存放一下数据:10、20、30、40、50、90则执行以下指令后al的值? mov bx,100h mov al,03h xlat,换码指令没有显式的操作数,但使用了BX和AL;因为换码指令使用了隐含寻址方式采用默认操作数,XLAT,2.

24、1.2 堆栈操作指令,堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 栈顶是地址较小的一端(低端),栈底不变,堆栈和队列,堆栈:按照后进先出(LIFO)的原则组织的存储器空间(栈) 队列:按照先进先出(FIFO)的原则组织的存储器空间,堆栈的操作,堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP,PUSH ;进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部,POP ;出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2,重点,1. 进栈指

25、令PUSH,PUSH,push ax push 2000h,PUSH r16/m16/seg ;SPSP2 ;SS:SPr16/m16/seg,2. 出栈指令POP,pop ax pop 2000h,POP r16/m16/seg ;r16/m16/segSS:SP ;SPSP2,POP,堆栈的特点,堆栈操作的单位是字,进栈和出栈只对字量 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 堆栈常用来 临时存放数据 传递参数 保存和恢复寄存器,例题2.11,例3.11:现场保护恢复,push ax;进入子程

26、序后 push bx push ds . pop ds;返回主程序前 pop bx pop ax,2.1.3 标志传送指令,标志寄存器传送指令用来传送标志寄存器FLAGS的内容 标志位操作指令直接对CF、DF、IF标志进行复位或置位,1. 标志寄存器传送,标志寄存器传送指令用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作 有2对4条指令 低8位传送:LAHF和SAHF 16位传送:PUSHF和POPF,标志低字节进出AH指令,LAHF ;AHFLAGS的低字节 LAHF指令将标志寄存器的低字节送寄存器AH SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/

27、0位,而AH的第5/3/1位任意,SAHF ;FLAGS的低字节AH SAHF将AH寄存器内容送FLAGS的低字节 用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志,标志寄存器进出堆栈指令,PUSHF ;SPSP2 ;SS:SPFLAGS PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2,POPF ;FLAGSSS:SP ;SPSP2 POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2,例题2.12,思考:将标志寄存器的内容送ax,如何实现?,例3.12:置位单步标志,pushf;保存全部标志到堆栈 pop ax;从堆栈中取出全部标志 or a

28、x,0100h;设置D8=TF=1, ;ax其他位不变 push ax;将ax压入堆栈 popf;FLAGSAX ;将堆栈内容取到标志寄存器,2. 标志位操作,标志位操作指令直接对CF、DF、IF标志进行复位或置位,常用于特定的情况 对标志位进行设置的指令 CLC STC CMC CLD STD CLI STI (了解),进位标志操作指令,用于任意设置进位标志 CLC;复位进位标志:CF0 STC;置位进位标志:CF1 CMC;求反进位标志:CFCF,方向标志操作指令,串操作指令中,需要使用 CLD;复位方向标志:DF0 STD;置位方向标志:DF1,中断标志操作指令,在编写中断服务程序时,需

29、要控制可屏蔽中断的允许和禁止 CLI;复位中断标志:DF0 STI;置位中断标志:DF1,2.1.4 地址传送指令,地址传送指令将存储器单元的逻辑地址送至指定的寄存器 偏移地址传送指令 LEA(重点掌握) 指针传送指令 LDS和LES 特别注意: 不是获取存储器单元的内容,有效地址传送指令LEA(load EA),将存储器操作数的偏移地址传送至指定的16位寄存器中,例题2.13,LEA r16,mem ;r16mem的偏移地址EA,LEA,重点,例3.13:获取偏移地址,.data x db 20h num db 11h,33h,45h lea bx,num 等价于 mov bx,offset

30、 num,获得主存单元的有效地址;不是物理地址,也不是该单元的内容,LEA,指针传送指令(了解),LDS r16,mem ;r16mem, ;DSmem+2 LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器,LES r16,mem ;r16mem, ;ESmem+2 LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器,例题2.14,例3.14:地址指针传送,mov word ptr 3060h,0100h mov word ptr 3062h,1450h les di,3060h;es=1450h,di=0100h lds si,3060h;d

31、s=1450h,si=0100h,mem指定主存的连续4个字节作为逻辑地址(32位的地址指针),送入DS:r16或ES:r16,2.1.5 输入输出指令(熟悉),8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地址 8086用于寻址外设端口的地址线为16条,端口最多为21665536(64K)个,端口号为0000HFFFFH 每个端口用于传送一个字节的外设数据,输入输出寻址方式,8086的端口有64K个,无需分段,设计有两种寻址方式 直接寻址:只用于寻址00HFFH前256个端口,操作数i8表示端口号 间接寻址:可用于寻址全部64K个端口,DX寄存器的值

32、就是端口号 注:对大于FFH的端口只能采用间接寻址方式,输入指令IN,将外设数据传送给CPU内的AL/AX,IN AL,i8 ;字节输入:ALI/O端口(i8直接寻址) IN AL,DX ;字节输入:ALI/O端口(DX间接寻址) IN AX,i8 ;字输入:AXI/O端口(i8直接寻址) IN AX,DX ;字输入:AXI/O端口(DX间接寻址),IN,例题2.15,例3.15:输入字量,;直接寻址,字节量输入 in al,21h mov ah,al in al,20h ;直接寻址,字量输入 in ax,20h ;间接寻址,字量输入 mov dx,20h in ax,dx,两段功能相同 字量

33、数据传送实际上实现了连续的两个端口地址的字节量传送,IN,输出指令OUT,将CPU内的AL/AX数据传送给外设,OUT i8,AL ;字节输出:I/O端口AL(i8直接寻址) OUT DX,AL ;字节输出:I/O端口AL(DX间接寻址) OUT i8,AX ;字输出:I/O端口AX(i8直接寻址) OUT DX,AX ;字输出:I/O端口AX(DX间接寻址),OUT,例题2.16,例3.16:输出字节量,;间接寻址,字节量输出 mov dx,3fch mov al,80h out dx,al,OUT,阶段练习1,编写程序段并用debug调试: 2.1 2.3 2.5 2.26 (1)至少用2

34、种方法 (作业),2.2 算术运算类指令,问题:在汇编语言中,数学表达式 A*B+C-12 如何描述? 答案:用算术运算指令实现二进制(和十进制)数据的四则运算 学习提示: 注意算术运算类指令对标志的影响 重点掌握:ADD/ADC/INC、SUB/SBB/DEC/ NEG/CMP 熟悉:MUL/IMUL、DIV/IDIV 、CBW/CWD 了解:DAA/DAS、 AAA/ AAS/AAM/AAD,加法指令ADD,ADD指令将源与目的操作数相加,结果送到目的操作数 ADD指令影响标志位,ADD,ADD reg,imm/reg/mem ;regregimm/reg/mem ADD mem,imm/

35、reg ;memmemimm/reg,例题2.17a,例3.17a:加法运算,mov al,0fbh;al=0fbh add al,07h;al=02h mov word ptr 200h,4652h ; 200h=4652h mov bx,1feh;bx=1feh add al,bl;al=00h add word ptr bx+2,0f0f0h ;200h=3742h,ADD,带进位加法指令ADC,ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数 ADC指令影响状态标志位 应用:ADC指令主要与ADD配合,实现多精度加法运算(即多字节数相加,如双字),ADC,ADC

36、reg,imm/reg/mem ;regregimm/reg/memCF ADC mem,imm/reg ;memmemimm/regCF,例题2.17b,Tip:双字加法中,一般用ax保存低位,dx保存高位,例3.17b:双字加法,mov ax,4652h;ax=4652h add ax,0f0f0h;ax=3742h,CF=1 mov dx,0234h;dx=0234h adc dx,0f0f0h;dx=f325h,CF=0 ;DX.AX0234 4652H F0F0 F0F0H F325 3742H,ADC,增量指令INC(increment),INC指令对操作数加1(增量) INC指令

37、不影响进位CF标志,按定义设置其他状态标志,INC,INC reg/mem ;reg/memreg/mem1,inc bx inc byte ptr bx,减法指令SUB(subtract),SUB指令将目的操作数减去源操作数,结果送到目的操作数 SUB指令按照定义相应设置状态标志,SUB,SUB reg,imm/reg/mem ;regregimm/reg/mem SUB mem,imm/reg ;memmemimm/reg,例题2.18a,例3.18a:减法运算,mov al,0fbh;al=0fbh sub al,07h;al=0f4h,CF0 mov word ptr 200h,465

38、2h ;200h=4652h mov bx,1feh;bx=1feh sub al,bl;al=0f6h sub word ptr bx+2,0f0f0h ;200h=5562h,CF1 注:补码运算 X-Y补=X补+-Y补,SUB,带借位减法指令SBB,SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。 SBB指令影响状态标志 应用:SBB指令主要与SUB配合,实现多精度减法运算(即多字节减法),SBB,SBB reg,imm/reg/mem ;regregimm/reg/memCF SBB mem,imm/reg ;memmemimm/regCF,例题2.18

39、b,例3.18b:双字减法,mov ax,4652h;ax=4652h sub ax,0f0f0h;ax=5562h,CF=1 mov dx,0234h;dx=0234h sbb dx,0f0f0h;dx=1143h,CF=1 ;DX.AX0234 4652H F0F0 F0F0H 1143 5562H,SBB,注意AX、DX的使用,减量指令DEC(decrement),DEC指令对操作数减1(减量) DEC指令不影响进位CF标志,按定义设置其他状态标志,DEC,DEC reg/mem ;reg/memreg/mem1,dec cx dec word ptr si,INC指令和DEC指令都是单

40、操作数指令 主要用于对计数器和地址指针的调整,求补指令NEG(negative),NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数 求补运算也可以表达成:将操作数按位取反后加1 影响标志位 用于求一个数的相反数,NEG,NEG reg/mem ;reg/mem0reg/mem,例题2.19,例3.19:求补运算,mov ax,0ff64h neg al ;ax=ff9ch,OF=0、SF=1、ZF=0、PF=1、CF=1 sub al,9dh ;ax=ffffh,OF=0、SF=1、ZF=0、PF=1、CF=1 neg ax ;ax=0001h,OF=0、SF=0、ZF=0、

41、PF=0、CF=1 dec al ;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=1 neg ax ;ax=0000h,OF=0、SF=0、ZF=1、PF=1、CF=0,NEG,比较指令CMP(compare),CMP指令将目的操作数减去源操作数,但结果不回送目的操作数(与SUB指令不同) 影响状态标志位,CMP reg,imm/reg/mem ;regimm/reg/mem CMP mem,imm/reg ;memimm/reg,例题2.20,CMP,很常用,例3.20:比较AL与100,cmp al,100;al-100 jb below ;al100,跳转到below执

42、行 sub al,100 ;al100,alal-100 inc ah;ahah+1 below:.,执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等,CMP,2.2.3 乘法指令,MUL r8/m8 ;无符号字节乘法 ;AXALr8/m8 MUL r16/m16 ;无符号字乘法 ;DX.AXAXr16/m16,IMUL r8/m8 ;有符号字节乘法 ;AXALr8/m8 IMUL r16/m16 ;有符号字乘法 ;DX.AXAXr16/m16,例题2.21,说明,乘法指令的功能,乘法指令分无符号和有符号乘法指令 乘法指令的源操作数显式给出,隐含使用另一个操作数AX和DX 字节量相

43、乘:AL与r8/m8相乘,得到16位的结果,存入AX 字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX 乘法指令利用OF和CF判断乘积的高一半是否具有有效数值,乘法指令对标志的影响,乘法指令影响OF和CF标志: MUL指令若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1 IMUL指令若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1 乘法指令对其他状态标志没有定义,对标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1) 对标志没有影响:指令执行不改变标志状态,了解,例3.21:乘法运算,mov al,

44、0b4h;al=b4h=180 mov bl,11h;bl=11h=17 mul bl;ax=Obf4h=3060 ;OF=CF=1,AX高8位不为0 mov al,0b4h;al=b4h=76 mov bl,11h;bl=11h=17 imul bl;ax=faf4h=1292 ;OF=CF=1,AX高8位含有效数字,2.2.4 除法指令,DIV r8/m8;无符号字节除法: ALAXr8/m8的商,AhAXr8/m8的余数 DIV r16/m16;无符号字除法: ;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数,IDIV r8/m8;有符号字节除法: ALAXr8/m

45、8的商,AhAXr8/m8的余数 IDIV r16/m16;有符号字除法: ;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数,例题2.22,说明,除法指令的功能,除法指令分无符号和有符号除法指令 除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数 字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH 字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX 除法指令对标志没有定义 除法指令会产生结果溢出,除法错中断溢出中断,当被除数远大于除数时,所得的商就有可能超出它所能表达的范围。如果存放商的寄存器AL/AX不能表达,便产生

46、溢出,8086CPU中就产生编号为0的内部中断除法错中断 对DIV指令,除数为0,或者在字节除时商超过8位,或者在字除时商超过16位,则发生除法溢出 对IDIV指令,除数为0,或者在字节除时商不在-128127范围内,或者在字除时商不在-3276832767范围内,则发生除法溢出,例3.22:除法运算,mov ax,0400h;ax=400h=1024 mov bl,0b4h;bl=b4h=180 div bl;商al05h5 ;余数ah7ch124 mov ax,0400h;ax=400h=1024 mov bl,0b4h;bl=b4h=76 idiv bl;商alf3h13 ;余数ah24

47、h36,问题: 当被除数与除数都是8位/16位的数据时,如何使用除法指令进行运算? 措施:将被除数进行符号扩展,2.2.5 符号扩展指令,CBW;将AL的符号扩展至AH ;如AL的最高有效位是0,则AH00 ;AL的最高有效位为1,则AHFFH。AL不变,CWD;将AX的符号扩展至DX ;如AX的最高有效位是0,则DX00 ;AX的最高有效位为1,则DXFFFFH。AX不变,什么是符号扩展 符号扩展指令常用于获得倍长的数据,不影响标志位,例题2.23,例题2.24,符号扩展的概念,符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数中扩展后的各位是全0(正数)或全1(负数

48、)。 符号扩展不改变数据大小 对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100) 对于数据0f7H(表示有符号数9),其最高位D7为1,符号扩展后高8位都是1,成为fff7H(仍表示有符号数9),例3.23:符号扩展,mov al,80h;al=80h cbw;ax=ff80h add al,255;al=7fh cbw;ax=007fh,例3.24:AXBX,cwd;DX.AXAX idiv bx;AXDX.AXBX,对于有符号数:利用符号扩展指令得到除法指令所需要的倍长于除数的被除数 对无符号数:应该采用直接使高8位或高16位清0

49、的方法,获得倍长的被除数,2.2.6 十进制调整指令,压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即0099,非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位09,高4位任意,通常默认为0,十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果 分成压缩BCD码和非压缩BCD码调整,BCD码(Binary Coded Decimal),二进制编码的十进制数:一位十进制数用4位二进制编码来表示 8086支持压缩BCD码和非压缩BCD码的调整运算 真值864 二进制编码08H40H 压缩BCD码

50、08H64H 非压缩BCD码08H0604H,区分:压缩BCD码和非压缩BCD码,压缩BCD码加、减调整指令,(ADD AL,i8/r8/m8) (ADC AL,i8/r8/m8) DAA ;AL将AL的加和调整为压缩BCD码,(SUB AL,i8/r8/m8) (SBB AL,i8/r8/m8) DAS ;AL将AL的减差调整为压缩BCD码,使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令 DAA和DAS指令对OF标志无定义,按结果影响其他标志,例如CF反映压缩BCD码相加或减的进位或借位状态,例题2.25a,例题2.25b,例题2.26,例3.25a:压缩BCD加法,m

51、ov al,68h ;al=68h,压缩BCD码表示真值68 mov bl,28h ;bl=28h,压缩BCD码表示真值28 add al,bl ;二进制加法:al=68h+28h=90h daa;十进制调整:al=96h ;实现压缩BCD码加法:682896,例3.25b:压缩BCD减法,mov al,68h ;al=68h,压缩BCD码表示真值68 mov bl,28h ;bl=28h,压缩BCD码表示真值28 sub al,bl ;二进制减法:al=68h-28h=40h das;十进制调整:al=40h ;实现压缩BCD码加法:68-2840,例3.26:压缩BCD减法,mov ax,1234h mov bx,4612h sub al,bl das;34-1222,CF0 xchg al,ah sbb al,bh das;12-4666,CF=1 xchg al,ah;1 123446126622,非压缩BCD码加、减调整指令,(ADD AL,i8/r8/m8) (ADC AL,i8/r8/m8) AAA ;AL将AL的加和调整为非压缩BCD码 ;AHAH调整的进位,(SUB AL,i8

温馨提示

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

评论

0/150

提交评论