




已阅读5页,还剩137页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理与接口技术,第三章 指令系统,主要内容,指令格式及寻址方式 8086/8088的基本指令 执行时间,基本概念,指令与指令系统 指令是微处理器能执行的操作命令,是由一系列二进制代码组成的。不同的微处理器,可以识别的指令系列不同,一个微机系统能执行的所有指令的集合称为指令系统。指令时二进制代码,不易编写和检查,所以每条指令都用一定格式的助记符来代替,这种助记符就叫做汇编语言。运行汇编语言编写的程序时,先将其编译为机器码(二进制),然后执行机器码。,3.1 指令的格式和寻址方式,操作码说明计算机要执行哪种操作,即操作类型,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分 操作数是指令执行的参与者,即各种操作的对象 有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数 有些指令隐含操作数,指令由操作码和操作数两部分组成,指令的助记符格式,标号,表示的是内存中存放该指令的第一个字节的地址。当需要跳转时,该标号指出跳转的具体目的地址 操作数2,常被称为源操作数src,它表示参与指令操作的一个对象 操作数1,常被称为目的操作数dest,它不仅可以作为指令操作的一个对象,还可以用来存放指令操作的结果 分号后的内容是对指令的解释,标号操作码操作数1,操作数2 ;注释,指令的操作码和操作数,每种指令的操作码 用一个助记符表示(指令功能的英文缩写) 对应着机器指令的一个或多个二进制编码 指令中的操作数 可以是一个具体的数值,包含在指令中。 可以是存放数据的寄存器 指明数据在主存位置的存储器地址或者数据所在IO端口的地址,寻址与寻址方式 操作数寻址,指令系统设计了多种操作数的来源 寻找操作数的过程就是操作数的寻址 把寻找操作数的方式叫做操作数的寻址方式 理解操作数的寻址方式是理解指令功能的前提 操作数采取哪一种寻址方式 一方面,会影响处理器执行指令的速度和效率 另一方面,对程序设计也很重要,操作数的来源,指 令,寄 存 器,内 存,I/O设备或端口,操作数,立即数寻址方式,指令中的操作数直接存放在机器代码中,紧跟在操作码之后(操作数作为指令的一部分存放在操作码之后的主存单元中) 这种操作数被称为立即数imm 可以是8位数值i8(00HFFH) 也可以是16位数值i16(0000HFFFFH) 立即数寻址方式常用来给寄存器和存储单元赋值 书上P54,图3-1 示意图 立即数只能做原操作数,不能做目的操作数 包含在指令中,不需要访存,执行速度快,MOV AX, 2030H ;AX2030H 指令机器码:B8 20 30,寄存器寻址方式,操作数存放在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,存储器寻址方式,操作数在主存储器中,用主存地址表示 程序设计时,8086采用逻辑地址表示主存地址 段地址在默认的或用段超越前缀指定的段寄存器中 指令中只需给出操作数的偏移地址(有效地址EA 可以由几部分构成) PA(物理地址)(段寄存器)10H + EA 8086设计了多种存储器寻址方式 1、直接寻址方式 2、寄存器间接寻址方式 3、寄存器相对寻址方式 4、基址变址寻址方式 5、相对基址变址寻址方式,(1) 直接寻址方式,直接寻址方式的有效地址在指令中直接给出 默认的操作数的段地址在DS段寄存器,可使用段超越前缀改变,即操作数可以在代码段、堆栈段或附加段 用中括号包含有效地址,表示取存储单元的内容 P55,例子3-2 把数据段内偏移地址为1006和1007的单元内容移动到AX,MOV AX, 1006H ;AXDS:1006H,MOV AX, ES: 2000H ;AXES:2000H,MOV AX,BUFFER ; BUFFER:符号地址,(2) 寄存器间接寻址方式,有效地址存放在基址寄存器BX、BP或变址寄存器SI、DI中 对于BX、SI、DI,默认的段地址在DS段寄存器,可使用段超越前缀改变 对于BP,默认的段地址在SS段寄存器,可使用段超越前缀改变 P56 3-6 注意:间接寻址可用寄存器只有4个。必须加上方括号,以免与寄存器寻址搞混。可以通过修改寄存器值,来对不同存储单元进行同一种操作。数组操作。,MOV AX, BX ;AXDS:BX,MOV AX, ES:BX ;AXES:BX,(3) 寄存器相对寻址方式(基址、变址寻址),有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI 有效地址BX/BP/SI/DI8/16位偏移量 段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前 缀改变 P57 例子:3-8,3-9。 相对寻址可以表示成几种不同形式。,MOV AX, SI+06H ;AXDS:SI+06H,MOV AX, 06HSI ;AXDS:SI+06H,MOV AX, SI 06H ;AXDS:SI+06H,MOV AX, SI +06H ;AXDS:SI+06H,(4) 基址变址寻址方式,有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成: 有效地址BX/BPSI/DI 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变 不允许把两个基址或变址组合在一起。 例子P91 3-12、3-13,MOV AX, BX+SI ;AXDS:BX+SI,MOV AX, BXSI ;AXDS:BX+SI,(5) 相对基址变址寻址方式,有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和: 有效地址BX/BPSI/DI8/16位偏移量 段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变 不允许把两个基址或变址组合在一起。 例子3-11 如果偏移地址经过计算,结果超过了16位数据,则超过部分舍弃。如例子3-12,相对寻址方式中的偏移量,在寄存器相对和相对基址变址寻址方式中,其偏移量不仅可用常量表示,也可用符号表示 这个符号可以是变量名,例如WVAR变量,而且支持多种表达形式 MOV AX, DI+WVAR ;等同于 MOV AX, WVARDI MOV AX,BX+SI+WVAR ;等同于 MOV AX, BXSI+WVAR ;等同于 MOV AX, WVARBX+SI ;等同于 MOV AX, WVARBXSI 各种存储器操作约定的隐含段寄存器、允许超越的段寄存器以及指令的有效地址所在寄存器见P93 表3-1,IO端口寻址,IO端口寻址 采用独立编址方式,可有64K个字节端口或32K个字端口。 设有专用的输入、输出指令IN 、OUT来访问 直接端口寻址(直接用一个8位二进制,最大256)和间接端口寻址(超出256时,地址用DX指定)两种 隐含寻址 指令部分操作数被隐含,没有直接出现在指令中如DAA 将AL中的加和调整为压缩BCD码 在书上 P93 例子3-16、17、18、19,寻址与寻址方式 转移地址寻址,程序转移指令的寻址方式称为转移地址寻址,只要是确定转移的目标地址,目标地址可以在段内,也可以跨段。P94 段内直接 段内间接 段间直接 段内间接,举例,若(BX) 0313H,(SI)1123H,(DI)0606H,(DS) 2000H,(SS) 6800H,(BP) 0100H。指出下列指令中画线的操作数的寻址方式,如果为存储器操作数,请计算该操作数的有效地址与物理地址。,;立即寻址, MOV AX,1117H MOV BX,SP MOV DX,BX,;寄存器寻址,EA0313H,PA20000H+0313H20313H,;寄存器间接寻址,举例,若(BX) 0313H,(SI)1123H,(DI)0606H,(DS) 2000H,(SS) 6800H,(BP) 0100H。指出下列指令中画线的操作数的寻址方式,如果为存储器操作数,请计算该操作数的有效地址与物理地址。,;寄存器相对寻址, MOV AX,BP100H MOV AX,100HSI,;寄存器相对寻址,EA0100H+100H0200H, PA68000H+0200H68200H,EA1123H+100H1223H, PA20000H+1223H21223H,举例,若(BX) 0313H,(SI)1123H,(DI)0606H,(DS) 2000H,(SS) 6800H,(BP) 0100H。指出下列指令中画线的操作数的寻址方式,如果为存储器操作数,请计算该操作数的有效地址与物理地址。,;基址变址寻址, MOV AL,BXSI MOV AX,BP+SI+100H,;相对基址加变址寻址,EA0313H+1123H1436H, PA20000H+1436H21436H,EA0100H+1123H+100H1323H, PA68000H+1323H69323H,8086、8088指令系统 数据传送、算术运算、逻辑运算和移位、串操作、控制转移、处理器控制,数据传送是计算机中最基本、最重要的一种操作。传送指令也是最常使用的一类指令 传送指令把数据从一个位置传送到另一个位置,实现寄存器之间、寄存器与内存之间的数据多方式传送 重点掌握 MOV XCHG XLAT PUSH POP,3.2 数据传送指令,数据传送指令,提供方便灵活的通用传送操作 有5条指令 MOV XCHG 数据交换 XLAT 查表转换 PUSH 压栈 POP 出栈,MOV,XCHG,XLAT,PUSH,POP,3.2.1 通用数据传送指令MOV(move),MOV dst ,src ; dst 目的,src 源 把一个字节或字的操作数从源地址传送至目的地址 可使用各种寻址方式,MOV reg/mem , imm ;立即数送寄存器或主存,MOV reg/mem/seg , reg;寄存器送(段)寄存器或主存,MOV reg/seg , mem ;主存送(段)寄存器,MOV reg/mem , seg;段寄存器送寄存器或主存,MOV指令传送功能图解,MOV指令也并非任意传送!,立即数,段寄存器 CS DS ES SS,通用寄存器 AX BX CX DX BP SP SI DI,存 储 器,注意 MOV指令不改变标志寄存器FR的标志位 CS、IP不能作为目的操作数,但CS可以为源 段寄存器之间不能用MOV传送 不能用立即数给段寄存器传数 不能实现存储单元和存储单元的间MOV传送 立即数不能做目的操作数 源与目的操作数类型必须匹配,不能一个是字,另一个是字节 传送字单元时遵循“高字节高地址,低字节低地址” P60 例3-13,非法指令两个操作数类型不一致,在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令 MOV AL, 050AH ;非法指令,修正: ;MOV AX,050AH MOV SI, DL ;非法指令,修正: ;mov dh,0 ;mov si,dx,非法指令无法确定是字节还是字操作,当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明 MOV BX+SI, 25 ;非法指令,修正: ;mov byte ptr bx+si,25 ;byte ptr 说明是字节操作 ;mov word ptr bx+si,25 ;word ptr 说明是字操作,非法指令两个操作数都是存储器,8086/8088指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数) MOV 0200H, 0100H ;非法指令,修正: ;假设是字操作 ;mov ax,0100H ;mov 0200H,ax,非法指令段寄存器的操作有一些限制,8086/8088指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活 MOV DS, ES ;非法指令(两个段寄存器不能直接传送) 修正: ;mov ax,es ;mov ds,ax MOV DS, 100H ;非法指令(立即数不能直接给段寄存器赋值) 修正: ;mov ax,100h ;mov ds,ax MOV CS, SI ;非法指令(CS和IP不能作为目的操作数) ;指令存在,但不能执行,3.2.2 堆栈操作指令,堆栈是一个“后进先出”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地址 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定 堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP,堆栈的图示,存储器,地址增加,SP,已有数据,堆 栈 段,SS,栈底,栈顶,(堆栈初始化时,无数据 堆栈段的最大偏移地址),SP,(a)堆栈的建立,堆栈的建立就是初始化SS和SP,MOV AX,2000H MOV SS,AX ;初始化SS MOV SP,0080H ;初始化SP,(b)进栈指令PUSH,将指定的寄存器或存储单元的内容存入栈顶 进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部 操作数不能是立即数,必须是16位 第一步:SP-1SP 操作数高位字节送SP指向单元 第二步:SP-1 SP 操作数低位字节送SP指向单元,PUSH r16/m16/seg ;SPSP2 ;SS:SPr16/m16/seg,push ax P61 例子3-14,(c)出栈指令POP,出栈指令把栈顶的一个字传送至指定的寄存器或内存单元,然后堆栈指针SP加2 操作数不能是CS,出栈的数据是16位的 第一步:SP指向的单元送操作数的低字节 SP+1SP 第二步: SP指向的单元送操作数的高字节 SP+1SP,POP r16/m16/seg(除了CS) ; r16/m16/segSS:SP ;SPSP2,pop BX P61 例子3-15,(d)标志进栈指令和出栈指令,PHSHF 将标志寄存器FR的内容存入栈顶 指令执行对标志寄存器各位没有影响 POPF 将SP指向的栈顶字单元的内容送至标志寄存器FR 对标志寄存器有影响,堆栈操作的特点,堆栈操作的单位是字,进栈和出栈只针对字操作 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 堆栈段是程序中不可或缺的一个内存区,常用来 临时存放数据 传递参数 保存和恢复寄存器,保存和恢复寄存器,push ax ;进入子程序后 push bx push ds . pop ds ;返回主程序前 pop bx pop ax,3.2.3交换指令XCHG(exchange),把两个地方的数据进行互换,寄存器与寄存器之间交换数据 寄存器与存储器之间交换数据 不能在存储器与存储器之间对换数据 段寄存器不能参加交换,XCHG reg , reg/mem; reg reg/mem,举例,mov 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.2.4 地址传送指令,传送操作数的段地址或偏移地址 有3条指令 LEA LDS LES,LEA,LDS,LES,取有效地址指令LEA(load effective address),将存储器操作数的有效地址送至指定的16位通用寄存器 源操作数必须是一个内存操作数,目的操作数必须为16位通用寄存器,对标志位没有影响,LEA r16, mem ;r16mem的有效地址EA,举例 有效地址的获取 mov bx,400h mov si,3ch lea bx,bx+si+0f62h,;BX400H3CH0F62H139EH,举例 地址传送与内容传送,LEA指令和MOV指令有区别: LEA BX,BUFFER MOV BX,BUFFER,1234H,BUFFER,0100H,LEA指令的执行结果: (BX)=0100H MOV指令的执行结果: (BX)=1234H P63 例子3.17、3.18、3.19,LDS与LES指令,LDS reg, src reg:16位通用寄存器 src:存储器操作数 功能:从src指定的存储单元开始,由4个连续存储单元中取出前2字节送到reg,取出后2字节送到DS中 P64 例子3-20 对DS段寄存器的内容做修改 LES reg, src reg:16位通用寄存器 src:存储器操作数 功能:从src指定的存储单元开始,由4个连续存储单元中取出前2字节送到reg,取出后2字节送到ES中。对ES段寄存器的内容做修改,3.2.5查表转换指令XLAT(translate),XLAT指令是字节的查表转换指令,可以根据表中元素的序号查出表中相应元素的内容 将BX为首地址的缓冲区中、由AL指定的位移处的一个字节数据取出赋给AL,查表指令执行前: 在主存建立一个字节量表格,含有希望转换成的目标码 表格首地址存放于BX,AL存放相对表格首地址的位移量 查表指令执行后: 将AL寄存器的内容转换为目标码 表的最大长度不超过256字节,XLAT 或 XLAT src_table ;alds:bx+al,XLAT的例子 P64 例子3.21,MOV BX,OFFSET TAB MOV AL,10 XLAT TAB ;TAB可有可无,等价于 寄存器相对寻址 MOV SI,10 MOV AL,TABSI,41H,3.2.6 标志传送指令(补充) 单字节指令,操作数以隐含方式规定,LAHF 加载 功能:标志寄存器低8位传送给AH 把sf、zf、af、pf、cf传送给AH的7、6、4、2、0位 SAHF 存储 功能:将AH传送给标志寄存器低8位 PUSHF 功能:将16位标志寄存器内容入栈 POPF 功能:将栈顶内容弹出到标志寄存器 栈操作主要用于调用子程序时保护和恢复状态标志位,3.3 输入输出指令,完成CPU与外设I/O端口的信息传送 有2条指令 IN OUT,IN,OUT,输入输出指令概念,端口 外设与CPU的接口 端口地址 端口的地址,以区分不同的端口 端口寻址 直接端口寻址 由指令中的8位数决定,范围0255 间接端口寻址 由DX决定,范围065535,输入输出指令IN和OUT,IN ac, port 功能:从端口输入字节或字到累加器 如果累加器为AL,则从端口输入1字节 如果累加器为AX,则从两个连续端口port,port+1各输入1字节,分别送到AL、AH OUT port, ac 功能:将累加器的内容输出到端口 如果累加器为AL,则输出AL内容到端口 如果累加器为AX,则分别将AL、AH内容输出到两个连续端口port,port+1,输入输出指令,IN AL,80H IN AX,80H IN AL, DX IN AX,DX,OUT 70H,AL OUT 70H,AX OUT DX,AL OUT DX,AX,注意 接收或发送的数据必须放在累加器(AX/AL)中。 使用间接端口寻址时,应将端口地址给DX,举例,IN AX, 20H ;直接寻址,字量输入,;直接寻址,字量输入 IN AL, 21H MOV AH,AL IN AL,20H,两段功能相同 字数据传送实际上实现了连续的两个端口地址的字节传送,或,传送指令小结,通用传送指令 MOV XCHG XLAT IN OUT PUSH POP (5) 输入输出指令 IN OUT (2) 地址传送指令 LEA LDS LES (3) 标志传送指令 LAHF SAHF PUSHF POPF (4),3.4 算术运算指令,算术运算类指令用来执行二进制及十进制的算术运算:加、减、乘、除。 这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志。有单操作数,也有双操作数指令。单操作数不允许使用立即数方式。 算术运算可以处理:带符号、不带符号二进制整数、不带符号的组合或非组合的BCD码十进制整数。影响6个标志位 CF(无符号数超出范围)、OF(有符号数超出范围)、SF、ZF、PF(低字节中有偶数个1,为1)、AF(D3向D4产生进位或借位) P69 例子3.27 重点掌握 加法指令:ADD、ADC、INC 减法指令:SUB 、SBB、DEC、CMP、NEG,(1) 加法和减法指令,加法指令:ADD, ADC和INC 减法指令:SUB, SBB, DEC, NEG和CMP 它们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位 操作数组合: 运算指令助记符 reg, imm/reg/mem 运算指令助记符 mem, imm/reg 运算指令助记符 mem/reg 源操作数和目的操作数不能同时为存储器 段寄存器不能参加运算,目的操作数不能是立即数 操作数可以是8位也可以是16位 P70 例子3.29,加、减指令,ADD dest,src ;加法:destdestsrc ;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数。可以是两字节或两个字数据相加。Dest不能是立即数,且不允许两数同时为存储器数 P70 例子3.29 SUB dest,src ;减法:destdestsrc ;SUB指令使目的操作数减去源操作数,差的结果送到目的操作数 P70 例子3.32,带进位加、带借位减指令,ADC dest,src ;加法:destdestsrcCF ;ADC指令除完成ADD加法运算外,还要加上执行前进位CF,结果送到目的操作数 P71例子3.30 SBB dest,src ;减法:destdestsrcCF ;SBB指令除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数,主要用途是完成多字节加、减法,增量和减量指令,INC reg/mem ;增量(加1):reg/memreg/mem1 DEC reg/mem ;减量(减1):reg/memreg/mem1 INC指令和DEC指令是单操作数指令 与加法和减法指令实现的加1和减1不同的是:INC和DEC不影响CF标志 操作数可以是寄存器或存储器,但不能是段寄存器 操作数如果是存储单元,需要在指令中说明字还是字节,inc si ;sisi1 dec byte ptr si ;sisi1,比较指令CMP(compare),CMP dest,src ;做减法运算:destsrc ;CMP指令将目的操作数减去源操作数,但结果不回送目的操作数,可以使字或字节比较。 比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系 目的可以是寄存器或存储器,原操作数还可以是立即数,但是不能 同时为存储器操作数。 无符号数:根据CF的值判断两个操作数的大小,CF=1,dest小于src。 CF=0,dest大于src。 ZF=1时,相等。 有符号数:若OFSF,则dest小于src。若OF=SF, dest大于等于src。P74 例子3.34,cmp ax,bx cmp al,100,求补指令NEG(negtive),NEG reg/mem ;reg/mem0reg/mem NEG指令对操作数执行求补运算,即用零减去操作数,然后结果返回操作数 求补运算也可以表达成:将操作数按位取反后加1 NEG指令对标志的影响与用零作减法的SUB指令一样 NEG指令也是一个单操作数指令 P74 例题 3.35,(2)乘法和除法指令,乘法、除法指令可以对有符号数或无符号数的字节和字数据进行运算,但有如下规则:,乘法指令,乘法指令分无符号和有符号乘法指令 MUL reg/mem ;无符号乘法 (AL)*(dest8)(AX); (AX)*(dest16)(DX)(AX); Mul 如果结果的高半部分(Ah 、Dx)不为0,则CF、OF置1,表示相乘后操作数长度扩展。 否则置0。 IMUL reg/mem ;有符号乘法 无论是字节或字数据相乘,首先将两数的绝对值相乘,再根据乘数的符号确定积的符号,积是带符号的补码。 IMul 如果结果的高半部分(Ah 、Dx)为包含乘积的有效数字,不是低位(AL)或(AX)符号的扩展,则CF、OF置1,否则置0。P78 例子3.42,除法指令分无符号和有符号除法指令 (AX)(dest8) (AL), (AX)mod(dest8) (AH); (DX)(AX)(dest16) (AX), (DX)(AX) mod (dest16) (DX) 8位数除以8位数,16位数除以16位数,必须对被除数扩展,对无符号数的扩展,直接把AH或DX清零即可,对有符号数,有专用指令。CBW和CWD DIV reg/mem ;无符号除法 Div,如果除数为0,或商大于FF或FFFF,cpu产生类型号为0的内部中断,结果不定值。P79例子3.43 IDIV reg/mem ;有符号除法 无论是字节或字数据相除,首先将两数的绝对值相除,再根据被除数和除数的符号确定商和余数符号,商和余数是带符号的补码。 IDiv,如果除数为0,或商溢出(超出表示范围),cpu产生类型号为0的内部中断,结果不定值。P79例子3.44,除法指令,乘法指令举例,MOV AL,0B4H ;al=b4h=180 MOV BL,11H ;bl=11h=17 MUL BL ;ax=0bf4h=3060 MOV AL,0B4H ;al=b4h=76 MOV BL,11H ;bl=11h=17 IMUL BL ;ax=faf4h=1292,除法指令举例,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 ;余数ah24h36,思考,对于带符号数除法,如77除以+5,可以商-15,余2;也可以商16,余3。 哪一种结果是正确的?余数的符号和被除数的符号相同。,?,符号扩展指令,如果被除数和除数的字长相等时,就必须对被除数扩展。 符号扩展是指用一个操作数的符号位(最高位)形成另一个操作数,形成的新操作数的高位是全0(正数)或全1(负数) 符号扩展虽然使数据位数加长,但数据大小并没有改变,扩展的高部分仅是低部分的符号扩展 符号扩展指令有两条,用来将字节转换为字,字转换为双字 CBW ;AL符号扩展成AX CWD ;AX符号扩展成DX,例题-符号扩展,mov al,64h ;AL64H (机器数) ,表示10进制数100(真值) cbw ;将符号0扩展,AX0064H,仍然表示100 mov ax,0ff00h ;AXFF00H,表示有符号10进制数256 cwd ;将符号位“1”扩展,DX.AXFFFFFF00H ;仍然表示256,(3) 十进制调整指令,十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果,以此实现十进制BCD码运算 8088指令系统支持两种BCD码调整运算 压缩(组合)BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即0099 非压缩(非组合)BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位09,高4位通常默认为0,编码的比较,真值(十进制) 8 64 十六进制编码 08H 40H 压缩BCD码 08H 64H 非压缩BCD码 08H 0604H ASCII码 38H 3634H,压缩BCD码加减法调整指令 DAA DAS 非压缩BCD码加减乘除法调整指令 AAA AAS AAM AAD,未组合BCD码调整 八位表1位,AAA 两个非压缩的BCD码相加,结果在Al中,执行该指令调整为十进制,放在AX中。该指令紧跟在加法指令之后 如果AL&0FH(Al低四位)9,或AF=1, 则AL=AL06H,AH=AH1, CF=AF=1,AL=AL&0FH(AL高4位清零) 否则AL=AL&0FH P75 例子3.36 、3.37 AAS两个非压缩的BCD码相减 如果AL&0FH (Al低四位) 9,或AF=1, 则AL=AL06H,AH=AH1, CF=AF=1,,AL=AL&0FH 否则AL=AL&0FH P77 例子3.39,组合BCD码调整 和AH无关,DAA 两个组合的BCD码相加,结果在AL中,执行该指令后结果调整为十进制,放在AL中,同时用CF表进位 如果AL&0FH(AL低四位)9,或AF=1, 则AL=AL06H,AF=1 如果AL&F0H(AL高四位)90H,或CF=1,则AL=AL60H,CF=1 如果同时满足上述两条,则AL=AL+66H,并置AF=CF=1 P76 例子3.38 DAS 两个组合的BCD码相减,结果在AL中,执行该指令后结果调整为十进制,放在AL中,同时用CF表借位 如果AL&0FH9,或AF=1,则AL=AL06H,AF=1 如果AL&F0H9,或CF=1,则AL=AL60H,CF=1,未组合BCD码乘法、除法调整(BCD码都是无符号数),AAM AH=AL/10 AL=AL%10 调整之前先用MUL指令将两个未组合BCD码相乘 影响SF、ZF、PF 实际上是字节乘法操作结束后,将AX中的二进制乘积(0-99), 转换为非组合的BCD码,十位数放在AH中,个位数放在AL中。 P80 例子3.46 AAD AL=AH10AL AH=0 影响SF、ZF、PF 实际上将两个非组合的BCD码数据(0-99)转换为等值的二进制数值。先调整,再用DIV指令进行除法。,调整指令小结,调整指令操作数隐含,通常是对AL进行调整 AAA、DAA指令通常紧跟在加法指令之后 AAS、DAS指令通常紧跟在减法指令之后 AAM指令通常无符号乘法MUL指令之后 AAD在无符号除法DIV指令之前进行调整,算术运算指令小结,加法指令 ADD ADC INC (3) 减法指令 SUB SBB DEC NEG CMP (5) 乘除法指令 MUL IMUL DIV IDIV (4) 十进制调整指令 AAA DAA AAS DAS AAM AAD (6) 扩展指令 CBW CWD (3),逻辑操作和移位指令,位操作类指令以二进制位为基本单位进行数据的操作 当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令 注意这些指令对标志位的影响 1. 逻辑运算指令 AND OR XOR NOT TEST 2. 移位指令 SHL SHR SAR 3. 循环移位指令 ROL ROR RCL RCR,(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,对两个操作数执行逻辑与运算,结果送目的操作数 可以用于屏蔽某些不关心的位。与“0”相与,AND dest,src ;destdestsrc B/W,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0 P81 例题49,测试指令TEST,对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志 P82 例题3.50(复杂,根据时间进度来掌握),TEST dest,src ;destsrc B/W,AND与TEST指令的关系, 同SUB与CMP指令的关系一样,逻辑或指令OR,对两个操作数执行逻辑或运算,结果送目的操作数,OR dest,src ;destdestsrc,只要相“或”的两位有一位是1,结果就是1;否则,结果为0 用来对某些位置1,而某些位保持不变 OF=CF=0,ZF、SF、PF由结果决定 P83 例题 3.51,逻辑异或指令XOR,对两个操作数执行逻辑异或运算,结果送目的操作数,XOR dest,src ;destdestsrc,只有相“异或”的两位不相同,结果才是1;否则,结果为0 用于对某些位求反,与1异或。某些位不变,与0异或 寄存器清零,与自身异或 OF=CF=0,ZF、SF、PF由结果决定 P83 例题3.52,逻辑非指令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中D0和D3清0,其余位不变 OR BL,00001001b ;BL中D0和D3置1,其余位不变 XOR BL,00001001b ;BL中D0和D3求反,其余位不变,AND指令可用于复位某些位(同0相与),不影响其他位,OR指令可用于置位某些位(同1相或),不影响其他位,XOR指令可用于求反某些位(同1相异或),不影响其他位,(2) 移位指令(shift),将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作 逻辑移位把操作数当作无符号数,总用0来填充;而算术移位是对带符号数,保持操作数符号不变,用符号数填充。 移位指令的第一个操作数是指定的被移位的操作数,可以是8位或16位 寄存器或存储单元;后一个操作数表示移位位数: 该操作数为1,表示移动一位 该操作数为CL,CL寄存器值表示移位位数 (移位位数大于1只能CL表示) AF内容不确定;按照最后移入的值设置进位标志CF;根据移位后的结果影响SF、ZF、PF;在只移一位的移位指令中,如果最高位发生变化,OF为1,逻辑左移指令SHL,SHL reg/mem,1/CL ;reg/mem左移1或CL位 ;最低位补0,最高位进入CF P84 例子3.53、3.54,逻辑右移指令SHR,SHR reg/mem,1/CL ;reg/mem右移1/CL位 ;最高位补0,最低位进入CF P84 例子3.55,算术左移指令SAL(arithmetic ),SAL reg/mem,1/CL ;与SHL是同一条指令,算术右移指令SAR,SAR reg/mem,1/CL ;reg/mem右移1/CL位 ;最高位不变,最低位进入CF P85 例子3.56 相当于有符号数除2cl,例题-数据移位 CF只移入,mov dx,6075h ; DX01100000 01110101B shl dx,1 ; DX11000000 11101010B ; CF0,SF1、ZF0、PF0 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,逻辑左移一位相当于无符号数乘以2 逻辑右移一位相当于无符号数除以2,(3) 循环移位指令(rotate),循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为: ROL reg/mem,1/CL;不带进位循环左移,最高位移入CF的同时,也移入最低位。其他位依次左移,原CF中的内容消失 ROR reg/mem,1/CL;不带进位循环右移,最低位移入CF的同时,也移入最高位。其他位依次左移,原CF中的内容消失 RCL reg/mem,1/CL;带进位循环左移,连同CF一起移动 RCR reg/mem,1/CL;带进位循环右移,连同CF一起移动 循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志。在循环1位的移位,操作数的最高位发生变化,OF=1。否则为0;多位循环,不确定 P85-86 例题3.57-3.61,32位数据移位,;将DX.AX中32位数值左移一位 SHL AX,1 RCL DX,1,考虑32位数据的右移等操作,例题:非压缩BCD码合并为压缩BCD,and ax,0f0fh ;保证高4位为0 mov cl,4 rol ah,cl ;也可以用shl ah,cl add al,ah ;也可以用or al,ah,0000XXXX 0000YYYY,XXXX YYYY,00001111 00001111,0000XXXX 0000YYYY,XXXX0000 0000YYYY,;AH.AL分别存放着非压缩BCD码的两位 ;将它们合并成为一个压缩BCD码存AL,逻辑运算和移位指令小结,逻辑运算指令 AND OR NOT XOR TEST (5) 移位指令 SHL SAL SHR SAR (4) ROL ROR RCL RCR(4),串操作类指令,8088的串操作类指令能对内存中一个连续区域的数据(如字串、字符串等)进行传送、比较等操作,指令有: 传送数据串:MOVS,STOS,LODS 检测数据串:CMPS,SCAS 重复前缀:REP,REPZ,REPNZ 串操作指令采用了特殊的寻址方式 变址寻址 利用循环程序也可以实现串操作指令的功能,串操作指令共同特点,源和目的操作数都在内存中,源操作数 DS:SI,目的操作数ES:DI,可段超越 指针SI、DI自动修正,方向取决于方向标志DF DF=0,增量;DF=1,减量。当串为字串时,每操作一次, SI、DI变化2,字节串时,变化为1 可加REP/REPZ/REPNZ重复前缀,重复次数放在CX中,MOVS串传送和CMPS串比较,MOVS 目的串,源串 MOVSB ;字节串传送 MOVSW;字串传送 ;ES:DI DS:SI ;SI SI 1/2, DI DI 1/2 ;cpu自动完成 +-由DF决定,加减1或2 由指令中的B或W决定,下同 P87 例题3.62 CMPS 源串,目的串 CMPSB CMPSW ; DS:SI ES:DI ;SI SI 1/2, DI DI 1/2 ;仅仅对标志位有影响,LODS读数据串和STOS写数据串,LODS 源串 LODSB LODSW ;AX/AL DS:SI ;SI SI 1/2 P90 例子3.64 STOS 目的串 STOSB STOSW ; ES:DI AX/AL ;DI DI 1/2 P91 例子3.65,SCAS串检索,SCAS 目的串;scan string SCASB SCASW ;AX/AL ES:DI ;DI DI 1/2 ;仅对标志位有影响,重复前缀,REP 若CX=0,则退出串处理循环,执行下一条指令 若CX 0,则执行基本串操作,CX CX 1 常与MOVS、STOS联合使用 REPE/REPZ 重复执行操作的条件:CX 0且ZF=1,其余同REP 常与CMPS、SCAS联合使用 REPNE/REPNZ 重复执行操作的条件:CX 0且ZF=0,其余同REP 常与CMPS、SCAS联合使用,串操作指令举例,mov ax,0 mov ds,ax mov ax,2000H mov es,ax mov si,1000H mov di,0000H mov cx,64H cld again: movsb loop again,mov ax,0 mov ds,ax mov ax,2000H mov es,ax mov si,1000H mov di,0000H mov cx,64H cld rep movsb,试编程将0000:1000H开始的100个字节传送到2000:0000H开始的单元中去。,串操作指令举例,lea si,string1 lea di,string2 mov cx,50 cld repz cmpsb jz equal mov result,0ffh jmp exit equal: mov result, 0 exit: hlt,设STRING1是DS段中的一个50字节字符串,STRING2是ES段中的一个50字节字符串。试比较这两个字符串是否全部相等。若全部相等,置字节单元RESULT为0;若不是全部相等,则RESULT置FFH。,串操作指令小结,串操作指令 MOVS CMPS SCAS LODS STOS (5) 重复前缀 REP REPZ REPNZ (3),控制转移指令 P92,控制转移类指令,通过改变IP(和CS)值,来改变程序的正常执行顺序,用于实现分支、循环等程序结构,是仅次于传送指令的常用指令 重点掌握: JMP/Jcc/LOOP/JCXZ CALL/RET INT n/IRET,目标地址的寻址方式,相对寻址方式 指令代码中提供目的地址相对于当前IP的位移量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供应链金融合同中担保资产范围及买卖双方风险分担
- 电力系统检修安全操作协议
- 高层管理人员内部股份转让及股权激励协议
- 2023年辅警招聘报名表
- 大学法学专业试题及答案
- 造价专业面试题目及答案
- 全球化与科技融合的新模式研究-洞察及研究
- 网媒专业考试题及答案
- 检验专业英语试题及答案
- 吊篮租赁公司半年工作总结
- 培训学校前台工作
- 2025年建筑工程类注册安全工程师安全生产专业实务(金属非金属矿山安全)-安全生产专业实务(金属非金属矿山安全)参考题库含答案解析(5卷)
- 2025年全国高考(新课标)政治真题卷含答案解析
- 2025年度情侣分手预防协议书下载中心
- 2025年高考数学试题分类汇编:立体几何试卷+解析
- 室内X射线探伤机应用项目环境影响报告表
- 新闻发布知识培训课件
- GB/T 18277-2025收费公路收费制式和收费方式
- 高一语文学法指导(绝对经典)
- 包装车间基础知识培训课件
- 2025年贵州建筑中级试题及答案
评论
0/150
提交评论