第3章 80868088的指令系统(控制转移指令)
第3章 80868088的指令系统

3.1 寻 址 方 式
例如: ADD AX,BX 其中AX是目的操作数,BX是源操作数,执行前, AX存放被加数,BX存放加数,执行后,AX和BX相 加的结果存放在AX中。 从书写形式来看,8088/8086系统中的操作数 可以分为三种类型:立即数操作数、寄存器操作 数和存储器操作数。
课件制作人:刘永华
3.1 寻 址 方 式
1. 立即数操作数 立即数是作为指令代码的一部分出现在指令 中。它通常作为源操作数使用。其书写形式可 以为二进制、八进制、十进制和十六进制数, 也可以是一个可求出确定值的表达式。 2. 寄存器操作数 寄存器操作数是把操作数存放在寄存器中, 用来参加运算或存放结果。在双操作数指令中, 它可以作为源操作数和目的操作数。其书写形式 就是寄存器的名称。
课件制作人:刘永华
3.1 寻 址 方 式
3.1.2 寻址方式 寻址方式共有7种: 1. 寄存器寻址 寄存器寻址方式中,指令所需要的操作数存 放在指令指明的寄存器中。对16位操作数, 寄存器可以是AX、BX、CX、DX、SI、DI、SP、 CS、DS、ES、SS和BP;对8位操作数,寄存器 可以是AL、AH、BL、BH、CL、CH、DL和DH。 这种寻址方式速度较快,对于那些需要经常 存取的操作数,采用寄存器寻址方式较为合 适。
课件制作人:刘永华
图3.3 MOV AX,BX
3.1 寻 址 方 式
2. 寄存器间接寻址 寄存器间接寻址方式中,操作数的偏移地址EA在指 令指明的寄存器中,即寄存器的内容为操作数的偏 移地址EA,而操作数存放在存储器中。 能够用来间接寻址的寄存器只能是寄存器SI、DI、 BP、BX其中之一。若指令中指定的寄存器是BX、DI 或SI,则操作数在当前数据段中,所以操作数的物 理地址PA的形成是由数据段寄存器DS的内容左移4位, 加上BX、DI或SI中的偏移地址EA。若指令中指定的 寄存器是BP,则操作数在当前堆栈段中,所以操作 数的物理地址PA的形成是堆栈段寄存器SS的内容左 移4位,加上BP中的偏移地址EA形成操作数的物理地 址PA,如图3.4所示。
005-指令系统_1303

MOV 说明
段寄存器之间的传送 MOV ES, DS; 错 MOV AX, DS MOV ES, AX; 对 注意CS和IP的使用 CS和IP不能作为目标操作数,CS可以作为源操作数。 例: MOV CS,AX; 错 MOV AX,CS; 对 MOV IP, AX; 错 MOV AX,IP; 对
MOV 说明
ቤተ መጻሕፍቲ ባይዱ
MOV 应用
③ CPU内部寄存器(除CS和IP外)与存储器(所有寻址方式)
之间数据传送。可以实现一字节或一个字的传送。存储单元
之间不能直接传送
MOV MEM, AX; 累加器存储器,直接寻址
MOV MEM, DS;段寄存器存储器,直接寻址 MOV DISP[BX],CX;寄存器存储器,变址寻址
指令系统的符号说明
src, dest 源,目的操作数(下列寻址方式都可以用)
[BX+SI+n],[BX+DI+n],[BP+SI+n],[BP+DI+n]
[SI+n], [N], [ ] [DI+n], r [BP+n], [BX+n]
存储器单元的内容(正常在数据段)
ES:[ ] 附加存储器段的内容 OPRD 操作数 Seg im 段寄存器(CS, DS, ES, SS ) 立即数 (n 8位, nn 16位, nnnn 32位)
MOV 实例
…
MOV SI,OFFSET AREA1
MOV DI,OFFSET AREA2 MOV CX,100 AGAIN : MOV AL,[SI] MOV [DI],AL
INC
INC DEC …
SI
DI CX
第三章80868088指令系统

第三章80868088指令系统机器语言指令由二进制代码组成。
一条指令一般包含操作码(OP )和操作数两部分,操作码指明指令所完成的操作,操作数指出该指令在执行规定操作时所需的信息。
指令中用于说明操作数(一般指源操作数)所在地址的方式被称为寻址方式。
(8086的寻址方式分两类:数据寻址方式和转移地址的寻址方式)3.2.1数据寻址方式 P51 1.立即寻址:数据是8位或16位,直接放在指令的最后一个(8位)或两个字节(16位)中,这样的数据称为立即数。
MOV AL ,80HADD AX ,0F000HMOV AX ,1234HADD AL ,10H操作码字节AX操作数字节操作码字节操作数(a )MOV AL , 80H(b )MOV AX , 1234H图3-2 立即寻址方式指令举例 P522. 寄存器寻址:数据存放在指令规定的寄存器中。
MOV CL ,DL MOV AX ,BX注意:在双操作数指令中源操作数寻址方式和目的操作数寻址方式。
CL DL AXAL AHBL BH (a )MOV CL , DL (b )MOV AX , BX图3-3 寄存器寻址方式指令举例 P523. 直接寻址:操作数在存储器中,其16位有效地址,即段内偏移地址在指令码中,占两个字节。
MOV AL ,[1064H] ;设(DS )=2000HADD AX ,[2000H]代码段操作数偏移地址数据段图3-4 直接寻址方式指令举例 P53操作数数据4. 寄存器间接寻址:操作数在存储器中,其16位有效地址EA 在指令指定的基址寄存器BX 或变址寄存器SI 、DI 中。
BX EA = SIDI 注意:新教材中有BP 【例】 MOV AX ,[SI] MOV [BX] , AL 如果:(DS )=3000H ,(SI )=2000H ,(BX )=1000H,(AL )=64H注意:默认段地址寄存器为DS 以上为二字节指令;MOV AX,[BP]为三字节指令;实为指令MOV AX ,[BP+0]的简写!图3-5 寄存器间接寻址方式指令举例 P535. 寄存器相对寻址:操作数在存储器中,其效地址是一个8位或16位的位移量与一个基址寄存器或变址寄存器的内容之和。
第三章 80868088的指令系统2

六、处理器控制指令
1.标志操作指令 用来设置标志位的状态。 (1)CF设置指令
CLC STC CMC CLD STD CLI STI 0→CF 1→CF CF变反 0→DF (串操作的指针移动方向从低到高) 1→DF (串操作的指针移动方向从高到低) 0→IF (禁止INTR中断) 1→IF (开放INTR中断)
重复前缀(p128) 重复前缀(p128) (p128 串操作指令前面可加上重复前缀。 串操作指令前面可加上重复前缀。当使用 重复前缀 重复前缀时, 指令重复执行, 重复前缀时,MOVS 指令重复执行,重复执 行次数由CX决定 并且每执行一次 决定。 每执行一次, 就 行次数由 决定。并且每执行一次,CX就 自动减1,直到减为0,然后退出重复执行。 自动减 ,直到减为 ,然后退出重复执行。 重复前缀包括: 重复前缀
部分常用的 8086 指令
指令类型 数 据 传 送 算 术 运 算 逻辑 移位 地址传送 LEA 输入输出 IN,OUT 加法 减法 乘/除法 移位 串操作 控制转移
28原则 28原则
助记符 ;标志传送PUSHF/POPF
数据传送 MOV,XCHG; 堆栈PUSH/POP
ADD,ADC,INC,DAA SUB,SBB,DEC,CMP MUL,DIV SHL/SHR/SAR,ROL/ROR,RCL/RCR MOVSB JMP,JXX,LOOP,CALL/RET,INT/IRET
① 根据单个标志位设置的条件转移指令
含 义 等于/ 结果为0 不等于/ 结果不为0 有进位/ 有借位 无进位/ 无借位 溢出 不溢出 有偶数个“1” 有奇数个“1” 符号位为 1 符号位为 0 指 令 JE / JZ JNE / JNZ JC JNC JO JNO JP / JPE JNP / JPO JS JNS 转移条件 ZF=1 ZF=0 CF=1 CF=0 OF=1 OF=0 PF=1 PF=0 SF=1 SF=0
03 指令系统

3.2.2 寄存器寻址
指令的操作数为CPU 的内部寄存器。可以是数据寄 的内部寄存器。 指令的操作数为 存器(8位或 位 ,也可以是地址指针、 存器 位或16位),也可以是地址指针、变址寄存器或段寄 位或 存器。 存器。 MOV SI ,AX SI 2233 AX 2233
寄存器操作数存放在8086CPU的8个通用寄存器或段寄存 的 个通用寄存器或段寄存 寄存器操作数存放在 器中,既可作源操作数.也可用作目标操作数。 器中,既可作源操作数.也可用作目标操作数。 通用寄存器主要用于存放参加运算或传送操作的操作数。 通用寄存器主要用于存放参加运算或传送操作的操作数。 通用寄存器中的AX、 、 、 既可以作为 既可以作为4个 位寄 通用寄存器中的 、BX、CX、DX既可以作为 个16位寄 存器,存放字操作数,也可以当做8个 位寄存器 位寄存器, 存器,存放字操作数,也可以当做 个8位寄存器,存放字节 操作数。 、 、 、 只能存放字操作数 只能存放字操作数。 操作数。SI、DI、BP、SP只能存放字操作数。 段寄存器用来存放当前操作数的段基地址。 段寄存器用来存放当前操作数的段基地址。在与通用寄存 器或存储器传送数据时, 器或存储器传送数据时,段寄存器可作为源操作数或目标操 作数, 不作为目的操作数; 作数,但CS不作为目的操作数;不允许用一条指令将立即 不作为目的操作数 数传送到段寄存器,可用某个通用寄存器作为中间桥梁, 数传送到段寄存器,可用某个通用寄存器作为中间桥梁,用 两条传送指令实现。 两条传送指令实现。
1. 立即操作数
立即数是指具有固定数值的操作数(常数)。它不会由于 立即数是指具有固定数值的操作数(常数)。它不会由于 )。 指令的执行而发生变化,它可以是字节(8位 或字 或字(16值 , 指令的执行而发生变化,它可以是字节 位)或字 值), 当它们分别代表无符号数和带符号数时, 当它们分别代表无符号数和带符号数时,其取值范围
03第三章 Intel 80868088 CPU的指令系统02

设(AX)=1020H,执行示意图
低地址
存储区
低地址
存储区
(SS段)
(SS段)
(SP)-2 (SP)-1 (SP) (SP)
20
10
(AL) (AH)
进栈方向
高地址
执行前
(AX)=1020
高地址
执行后
PUSH AX指令执行示意图
注意进栈方向是高地址向低地址发展。
压栈指令的格式为: PUSH reg PUSH mem/reg PUSH segreg 例如: PUSH AX PUSH [BX] PUSH DS
OF DF IF TF SF ZF
AF
PF
CF
SAHF指令的功能
(3)把标志寄存器推入栈顶指令PUSHF
执行的操作:(SP)-1←标志寄存器高8位 (SP)-2←标志寄存器低8位 (SP)←(SP)-2 (4)从栈顶弹出标志寄存器指令POPF 执行的操作:标志寄存器低8位←(SP) 标志寄存器高8位←(SP)+1 (SP)←(SP)+2 PUSHF和POPF指令用于保护和恢复标志寄 存器内容。
存储器
42000H+0
30 31 32
39 41
...
‘0’ ‘1’ ‘2’
‘9’ ‘A’ ‘B’ ‘E’ ‘F’ 十六进制数ASCII码表
42000H+0BH
42 45 46
... ...
则可用如下几条指令实现:
MOV BX,2000H ;(BX)←表首地址 MOV AL,0BH ;(AL)←序号 XALT ; 查表转换
上程序段存放在代码段中,設(CS)=109EH, 则各条指令存放地址如下:
CS : 109E : 109E : 109E : 109E : 109E : 109E : 109E : 109E : 109E : IP 0100 0103 0106 0108 010A 010B 010C 010E 0110 指令 MOV DI,1000H MOV CX,64H MOV AL,2AH MOV [DI],AL INC DI DEC CX JNZ 0108 HLT
80868088的指令系统(通用数据传送指令)
通用数据传送指令
PUSH 和 POP指令 • 基本格式和功能
• •
指令格式:
PUSH POP SRC DEST
执行的操作: PUSH 压入。源操作数进栈至栈顶。“先减再压”
(SP) ← (SP)-2 SS:((SP),(SP)+1) ← (SRC)
POP 弹出。栈顶出栈到目的操作数。“先弹再加” (DEST) ← SS:((SP),(SP)+1) (SP) ← (SP)+2
通用数据传送指令
PUSH 和 POP指令 • 基本格式和功能
• •
与标志的关系:
与各标志位无关,不影响标志位
寻址方式: PUSH mem / reg POP mem / reg
注意: 操作数一律为16位操作数。允许使用段寄存器,但 POP操作数不允许为CS。可以使用除立即数以外的任 何数据寻址方式。
通用数据传送指令
MOV 指令 • 例子
• reg ←→reg
MOV DH, AL MOV DS, AX
• r ←→m
MOV DL, DA_BYTE MOV DL, [SI] MOV AX, DA_WORD
通用数据传送指令
MOV 指令 • 例子
• m →m
MOV DL, DA_BYTE1 MOV DA_BYTE2, DL
传送实质上是复制,对源操作数无影响。 16位数据的传送遵循地址“高对高,低对低”的原
则。这个原则不仅对MOV指令适用,对所有的传送 皆适用。
通用数据传送指令
MOV 指令 • 例子
• 立即数→r/m
MOV CL, 05H MOV AX, 1234H MOV ADDR, 12H MOV ADDR, 1234H
80868088指令详解
80868088指令详解一、数据传送指令1.通用数据传送指令MOV(Move)传送PUSH(Push onto the stack)进栈POP(Pop from the stack)出栈XCHG(Exchange)交换.MOV指令格式为: MOV DST,SRC执行的操作:(DST)<-(SRC).PUSH进栈指令格式为:PUSH SRC执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(SRC).POP出栈指令格式为:POP DST执行的操作:(DST)<-((SP+1),(SP))(SP)<-(SP)+2.XCHG 交换指令格式为:XCHG OPR1,OPR2执行的操作:(OPR1)<-->(OPR2)2.累加器专用传送指令IN(Input) 输入OUT(Output) 输出XLAT(Translate) 换码这组指令只限于使用累加器AX或AL传送信息. .IN 输入指令长格式为: IN AL,PORT(字节)IN AX,PORT(字)执行的操作: (AL)<-(PORT)(字节)(AX)<-(PORT+1,PORT)(字)短格式为: IN AL,DX(字节)IN AX,DX(字)执行的操作: AL<-((DX))(字节)AX<-((DX)+1,DX)(字).OUT 输出指令长格式为: OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作: (PORT)<-(AL)(字节)(PORT+1,PORT)<-(AX)(字)短格式为: OUT DX,AL(字节)OUT DX,AX(字)执行的操作: ((DX))<-(AL)(字节)((DX)+1,(DX))<-AX(字)在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT, 此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息..XLAT 换码指令格式为: XLAT OPR或: XLAT执行的操作:(AL)<-((BX)+(AL))3.有效地址送寄存器指令LEA(Load effective address)有效地址送寄存器LDS(Load DS with Pointer)指针送寄存器和DSLES(Load ES with Pointer)指针送寄存器和ES.LEA 有效地址送寄存器格式为: LEA REG,SRC执行的操作:(REG)<-SRC指令把源操作数的有效地址送到指定的寄存器中..LDS 指针送寄存器和DS指令格式为: LDS REG,SRC执行的操作:(REG)<-(SRC)(DS)<-(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器..LES 指针送寄存器和ES指令格式为: LES REG,SRC执行的操作: (REG)<-(SRC)(ES)<-(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.4.标志寄存器传送指令LAHF(Load AH with flags)标志送AHSAHF(store AH into flags)AH送标志寄存器PUSHF(push the flags) 标志进栈POPF(pop the flags) 标志出栈.LAHF 标志送AH格式为: LAHF执行的操作:(AH)<-(PWS的低字节).SAHF AH送标志寄存器格式为: SAHF执行的操作:(PWS的低字节)<-(AH).PUSHF 标志进栈格式为: PUSHF执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW).POPF 标志出栈格式为: POPF执行的操作:(PWS)<-((SP)+1,(SP)) (SP)<-(SP+2)二、算术指令1.加法指令ADD(add)加法ADC(add with carry)带进位加法INC(increment)加1.ADD 加法指令格式: ADD DST,SRC执行的操作:(DST)<-(SRC)+(DST).ADC 带进位加法指令格式: ADC DST,SRC执行的操作:(DST)<-(SRC)+(DST)+CF .ADD 加1指令">格式: INC OPR执行的操作:(OPR)<-(OPR)+12.减法指令SUB(subtract)减法SBB(subtract with borrow)带借位减法DEC(Decrement)减1NEG(Negate)求补CMP(Compare)比较.SUB 减法指令格式: SUB DST,SRC执行的操作:(DST)<-(DST)-(SRC).SBB 带借位减法指令格式: SBB DST,SRC执行的操作:(DST)<-(DST)-(SRC)-CF.DEC 减1指令格式: DEC OPR执行的操作:(OPR)<-(OPR)-1.NEG 求补指令格式: NEG OPR执行的操作:(OPR)<- -(OPR).CMP 比较指令格式: CMP OPR1,OPR2执行的操作:(OPR1)-(OPR2)该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.3.乘法指令MUL(Unsigned Multiple)无符号数乘法IMUL(Signed Multiple)带符号数乘法.MUL 无符号数乘法指令格式: MUL SRC执行的操作:字节操作数:(AX)<-(AL)*(SRC)字操作数:(DX,AX)<-(AX)*(SRC).IMUL 带符号数乘法指令格式: IMUL SRC执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.4.除法指令DIV(Unsigned divide)无符号数除法IDIV(Signed divide)带符号数除法CBW(Convert byte to word)字节转换为字CWD(Contert word to double word)字转换为双字.DIV 无符号数除法指令格式: DIV SRC执行的操作:字节操作:(AL)<-(AX)/(SRC)的商(AH)<-(AX)/(SRC)的余数字操作: (AX)<-(DX,AX)/(SRC)的商(AX)<-(DX,AX)/(SRC)的余数.IDIV 带符号数除法指令格式: DIV SRC执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同..CBW 字节转换为字指令格式: CBW执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH .CWD 字转换为双字指令格式: CWD执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.这两条指令都不影响条件码.三、逻辑指令1.逻辑运算指令AND(and) 逻辑与OR(or) 逻辑或NOT(not) 逻辑非XOR(exclusive or)异或TEST(test) 测试.AND 逻辑与指令格式: AND DST,SRC执行的操作:(DST)<-(DST)^(SRC).OR 逻辑或指令格式: OR DST,SRC执行的操作:(DST)<-(DST)V(SRC).NOT 逻辑非指令格式: NOT OPR执行的操作:(OPR)<-(OPR).XOR 异或指令格式: XOR DST,SRC执行的操作:(DST)<-(DST)V(SRC).TEST 测试指令格式: TEST OPR1,OPR2执行的操作:(DST)^(SRC)两个操作数相与的结果不保存,只根据其特征置条件码2.移位指令SHL(shift logical left) 逻辑左移SAL(shift arithmetic left) 算术左移SHR(shift logical right) 逻辑右移SAR(shift arithmetic right) 算术右移ROL(Rotate left) 循环左移ROR(Rotate right) 循环右移RCL(Rotate left through carry) 带进位循环左移RCR(Rotate right through carry) 带进位循环右移格式: SHL OPR,CNT(其余的类似)其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT 决定,CNT可以是1或CL.循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.四、串处理指令1.与REP相配合工作的MOVS,STOS和LODS指令.REP重复串操作直到(CX)=0为上格式: REP string primitive其中String Primitive可为MOVS,LODS或STOS指令执行的操作:1)如(CX)=0则退出REP,否则往下执行.2)(CX)<-(CX)-13)执行其中的串操作4)重复1)~3).MOVS 串传送指令格式:可有三种MOVS DST,SRCMOVSB(字节)MOVSW(字)其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:MOVS ES:BYTE PTR[DI],DS:[SI]执行的操作:1)((DI))<-((SI))2)字节操作:(SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1当方向标志DF=0时用+,当方向标志DF=1时用-3)字操作:(SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2当方向标志DF=0时用+,当方向标志DF=1时用-该指令不影响条件码..CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量..STOS 存入串指令格式: STOS DSTSTOSB(字节)STOSW(字)执行的操作:字节操作:((DI))<-(AL),(DI)<-(DI)+-1字操作: ((DI))<-(AX),(DI)<-(DI)+-2该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL 或AX的内容存入一个长度为(CX)的缓冲区中..LODS 从串取指令格式: LODS SRCLODSBLODSW执行的操作:字节操作:(AL)<-((SI)),(SI)<-(SI)+-1字操作: (AX)<-((SI)),(SI)<-(SI)+-2该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.一般说来,该指令不和REP 联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS 指令.REPE/REPZ 当相等/为零时重复串操作格式: REPE(或REPZ) String Primitive其中String Primitive可为CMPS或SCAS指令.执行的操作:1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行2)(CX)<-(CX)-13)执行其后的串指令4)重复1)~3).REPNE/REPNZ 当不相等/不为零时重复串操作格式: REPNE(或REPNZ) String Primitive其中String Primitive可为CMPS或SCAS指令执行的操作:除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同..CMPS 串比较指令格式: CMP SRC,DSTCMPSBCMPSW执行的操作:1)((SI))-((DI))2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同..SCAS 串扫描指令格式: SCAS DSTSCASBSCASW执行的操作:字节操作:(AL)-((DI)),(DI)<-(DI)+-1字操作: (AL)-((DI)),(DI)<-(DI)+-2该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.五、控制转移指令1.无条件转移指令.JMP(jmp) 跳转指令1)段内直接短转移格式:JMP SHORT OPR执行的操作:(IP)<-(IP)+8位位移量2)段内直接近转移格式:JMP NEAR PTR OPR执行的操作:(IP)<-(IP)+16位位移量3)段内间接转移格式:JMP WORD PTR OPR执行的操作:(IP)<-(EA)4)段间直接(远)转移格式:JMP FAR PTR OPR执行的操作:(IP)<-OPR的段内偏移地址(CS)<-OPR所在段的段地址5)段间间接转移格式:JMP DWORD PTR OPR执行的操作:(IP)<-(EA)&n。
微机第三章指令系统5
(IP)=(16*(DS)+(BX)+25)=(20000H+1225H)
=(21225H)=1234H
第三章
8086/8088指令系统
4. 段间直接转移
指令格式: JMP FAR PTR dst
指令操作: IP← dst给出的偏移地址 CS← dst给出的段基址 段间绝对转移指令,范围是存储器任何位置。 指令中给出转向地址的段地址和偏移地址(汇编语言编程时一 般用符号地址表示) FAR PTR——为段间转移的运算符。 例如: JMP FAR PTR NEXT
1.根据单个标志为条件进行测试 •这组指令单独判断5个状态标志之一CF、ZF、SF、PF、OF
以标志位的状态或者以标志位的逻辑运算结果作为转移条件, 如果满足转移条件,则转移到指定的目标地址。
全部条件转移指令都是段内直接转移,转移地址的偏移量限 制在-128 ~ +127范围内。
第三章
⑴利用零标志ZF,判断结果是否为零(或相等) JZ/JE ;相等转移,条件ZF=1
第三章
8086/8088指令系统
例:将AX与BX中两无符号数的较大数存WMAX单元。 程序如下: CMP ax,bx 比较AX和BX JAE next ;若AX≥BX,转移 XCHG ax,bx ;AX<BX,交换 next: MOV wmax,ax;存较大数
如果AX和BX存放的是有符号数,则 条件转移指令应采用JGE指令
低字节 高字节 低字节 高字节
IP CS
存储器
第三章
8086/8088指令系统
3.7.3 条件转移指令
状态标志作为转移的条件,当满足一定的条件时,转移到 指定的地址,否则,将顺序执行下条指令。 指令格式: Jcc 标号 ;条件满足,发生转移 ;IP←IP+8位位移量; ;否则,顺序执行 cc —— 转移条件 根据指令功能可分为三类:
80868088指令系统
80868088指令系统⽬录名称含义IM (Immediate)⽴即数REG (Register)寄存器操作数MEM (Memory)存储器操作数SEG (Segment)段寄存器(CS、DS、ES、SS)OPR (Operand)操作数OPS (Source Operand)源操作数OPD (Destination Operand)存储器操作数⼀、数据传送指令(⼀)通⽤数据传送指令(MOV、XCHG、PUSH、POP、PUSHA、POPA)1、通⽤数据传送指令:MOV指令格式:MOV OPD,OPS作⽤:将源操作数指定的内容传送到⽬的操作数,即 OPD<=(OPS),当指令执⾏完后,⽬的操作数原有的内容被源操作数内容覆盖,即⽬的操作数和源操作数具有相同内容注意事项:MOV指令可以是字节数据传送也可以是字数据传送,但是源操作数和⽬的操作数的长度必须⼀致⽴即数只能作源操作数,且不能传送给段寄存器段寄存器CS只能作源操作数,段寄存器之间不能直接传送存储单元之间不能直接传送数据MOV指令对标志寄存器的各位⽆影响(1)⽴即数传送到通⽤寄存器或存储单元⽴即数只能作为源操作数,⽴即数不能传送给段寄存器例:MOV AH,10HMOV AX, 2345HMOV M-BYTE, 64HMOV M-WORD,2364H(2)寄存器之间的传送段寄存器CS只能作源操作数,不能作⽬的操作数例:MOV AH,CHMOV DS, AXMOV ES, BXMOV AX,CSMOV CS, AX; 错误:段寄存器CS只能作源操作数,不能作⽬的操作数(3)寄存器与存储单元之间传送例:MOV AL,[SI]MOV [DI],AHMOV AX, 10[BX]MOV TABLE[BP], BXMOV DS, [SI][BX]MOV [BX], [BP][SI]; 错误:存储单元之间不能直接传送数据2、交换指令:XCHG指令格式:XCHG OPD,OPS作⽤:源操作数和⽬的操作数两者内容相互交换,即: (DEST)<=>(SRC)注意事项:数据交换可以在寄存器之间或寄存器与存储器单元之间进⾏数据交换不能在存储单元之间直接进⾏数据交换寄存器只能使⽤通⽤寄存器指令对标志寄存器各位⽆影响(1)寄存器之间数据交换例:XCHG AX,BXXCHG AH,CH例:两个存储单元(DA_BYTE1和DA_BYTE2)之间的数据交换可以使⽤以下三条指令来实现MOV AL,DA-BYTE1; AL <= (DA_BYTE1)XCHG AL,DA-BYTE2 ; (AL)<=>(DA-BYTE2)XCHG AL,DA-BYTE1 ; (AL)<=>(DA-BYTE1)或 MOV DA-BYTE1,AL; (DA_BYTE1)<=(AL)3、堆栈指令(1)进栈指令:PUSH指令格式:PUSH OPS作⽤:将寄存器、段寄存器或存储器中的⼀个字数据压⼊堆栈,堆栈指针减2即:(SP)-1 => SP 、(OPS)15⾄8 => ([SP])(SP)-1 => SP 、(OPS)7⾄0 => ([SP])注意事项:源操作数可以是CPU内部的16位通⽤寄存器、段寄存器和存储器操作数(所有寻址⽅式)进栈操作对象必须是16位数(2)出栈指令:POP指令格式:POP OPD作⽤:将栈顶数据弹出传送⾄某⼀寄存器、段寄存器(CS除外)或存储器,堆栈指针加2即:([SP]) => (OPD)7⾄0、(SP)+1 => SP([SP]) => (OPD)15⾄8、(SP)+1 => SP注意事项:CS段寄存器不可以存放⽬标操作数(3)所有寄存器进栈指令:PUSHA指令格式:PUSHA作⽤:16位通⽤寄存器依次进栈,次序为AX、CX、DX、BX,指令执⾏前的SP、BP、SI、DI。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JBE / JNA
CF = 1 或 ZF = 1
AB
表三
指 令 JG / JNLE JGE / JNL JL / JNGE
有符号数条件转移指令
转移条件 SF=OF 且 ZF=0 SF=OF SF OF 含 义 A>B AB A<B
N
CX=0? Y
例1:计算:1+2+3+...+20。结果 存入AX寄存器。
MOV CX,0014H MOV AX,0 A: ADD AX,CX LOOP A
初始化部分 处理部分 循环控制部分
• 例2 :设商店里有8种商品,它们的价格
分别为83元,76元,65元,84元,71元, 49元,62元,58元,现要将每种商品提 价7元,编程计算每种商品提价后的价格。
4、子程序调用和返回指令
CALL指令分两步执行 • 第一步是将返回地址,推出堆栈。 • 第二步是转到子程序的入口地址去执行 相应的子程序。 RET指令,从栈中弹出返回地址,使程序 返回主程序继续执行。
4、子程序调用和返回指令
名称 格式
执行的操作
段
直接近调用 CALL NEAR PTR DST
间接近调用 CALL WORD PTR DST CALL BX 直接远调用 CALL FAR PTR DST
• • • • • • • • •
0000 0002 0003 0005 0006
0405 90 EBFB 90
• 例 2 JMP DWORD PTR[SI+0125H] • CS=1200H,IP=05H,DS=2500H,SI=1300H • 内存单元 (26425H)=4500H • (26427H)=32F0H
CMP AL,60 JB FAIL CMP AL,85 JAE GOOD MOV DL,’P’ JMP PRINT FAIL: MOV DL,’F’ JMP PRINT GOOD:MOV DL,’G’ PRINT:….
3、循环指令
(1).循环程序结构
初始化部分 处理部分 循环控制部分
修改计数器及指针
名称
段 近返回 RET
格式
执行的操作
(IP)出栈
带参数近返回
内 段 远返回
RET expression (IP)出栈 (SP)←(SP)+16位位移量
RET (IP)出栈 (CS)出栈
带参数远返回
间
RET expression (IP)出栈 (CS)出栈 (SP)←(SP)+16位位移量
例 1 CALL PROG_N 调用前 CS=2000H,IP=1050H,SS=5000H SP=0100H,PROG_N与CALL指令之间的 字节距离等于1234H(即DISP=1234H) RET
标号 CX
;段内直接转移 ;段内间接转移
WORD PTR [BX]
FAR PTR 标号
;段内间接转移
;段间直接转移
DWORD PTR [BX][SI] ;段间间接转移
例1
列表文件
行号 1 2 3 4 5 6 7 8 偏移量 0000 机器码 程序 CODE SEGMENT ASSUME CS:CODE PROG_S:ADD AL,05H NOP JMP SHORT PROG_S NOP CODE ENDS END
机器码为FFAC2501H
2、条件转移指令
•
•
基本格式:
JXX
目标
说明: 字母“J”后面的“XX”是指“条件”,如果条件成立,
则转移至“目标”处执行,否则顺序执行。
条件转移指令共18条,它们均以F寄存器中状态标志
位作为判断条件,但执行后均不影响各标志位。
此类指令都只能在以当前IP内容为中心的 -128 至
指 令 JC JNC JE / JZ JNE / JNZ JS JNS
JO JNO JP / JPE JNP / JPO
OF=1 OF=0 PF=1 PF=0
有进/借位 无进/借位 相等/等于0 不相等/不等于0 是负数 是正数或0 有溢出 无溢出
有偶数个‘1’ 有奇数个‘1’
表二 无符号数条件转移指令
(IP)入栈 (IP)←(IP)+16位位移量
(IP)入栈 (IP)←(EA) (CS)入栈 (IP)入栈 (IP)←DST指定的偏移地址 (CS)←DST指定的段地址 (CS)入栈 (IP)入栈 (IP)←(EA) (CS)←(EA+2)
内 段
间
间接远调用 CALL DWORD PTR DST
4、子程序调用和返回指令
• 例2:设一个由17个字符组成的字符串存
放在STRING开始的内存中,查看该字符 串是否有空格符。若没有找到和尚未查 完,则继续,直到找到第一个空格符或 查完了才退出程序。(提示用LOOPNE 指令实现循环)
DATA SEGMENT STRING DB ‘Personal Computer’ DATA ENDS ……… MOV BX,OFFSET STRING DEC BX MOV CX,17 NEXT: INC BX CMP [BX],20H LOOPNE NEXT
例2 CALL FAR PTR PROG_F 设调用前: CS=1000H,IP=205AH,SS=2500H,SP= 0050H 标号PROG_F单元的地址指针 CS=3000H,IP=0500H 操作码9A00050030H
+127字节范围内转移(短转移)。超过要修改程序。
2、条件转移指令
• 这18条指令又可分为三大类:
简单条件转移指令
无符号数条件转移指令
带符号数条件转移指令
表一
标志位 CF ZF SF OF PF
简单条件转移指令
转移条件 CF=1 CF=0 ZF=1 ZF=0 SF=1 SF=0 含义
• •
本身,这样的程序段常用来实现延时。 例: MOV CX,100 DELAY:LOOP DELAY
LOOPE/LOOPZ指令工作流程
循环体 CXCX-1
Y
CX=0? N ZF=1? N
Y
LOOPNE/LOOPNZ指令工作流程
循环体 CXCX-1
Y
CX=0? N ZF=0? N
Y
举例
• 例1:设有一个由50个字节组成的数组存
LOOP
目标
指令功能:
自动进行循环次数的计数(即CXCX-1)后, 相当于这两条指令: 如计数寄存器CX≠0,则转移到目标单元,否则顺序 执行。 DEC CX JNZ/JNE 目标 说明:
此指令隐含使用CX作为循环计数器; 因此应注意先设置好CX的初始值。
LOOP指令工作流程
循环体 CXCX-1
循环结束? Y 结束处理部分 N
(2).为何需要循环?
• 简化程序的编程 • 简少程序对内存的占用。
(3).如何实现循环?
• 使用条件转移指令:Jxx • 使用循环控制指令:LOOP
目标 目标
等
8086/8088循环控制指令共有四条,下面介 绍其中一条最常用指令:
•
LOOP指令: 指令格式:
• JCXZ指令:
指令格式:
JCXZ 标号
指令功能: 若CX为0,则转移到指令中标号所指定的地 址处,否则将往下顺序执行,它不对CX进 行自动减一的操作
说明:这条指令主要用在循环指令开始处。 为了使程序跳过循环,只要先将CX清零。
4、子程序调用和返回指令
• •
在编写程序时,往往把某些能完成特定 功能而又经常用的的型。
CMPAXCX : CMP AX,CX JG EXIT MOV AX,CX EXIT:
JL NEXT
JMP EXIT NEXT:MOV AX,CX EXIT:
• 例2: 设某个学生的英语成绩已存放在AL寄
存器中,如果低于60分,那么打印F(FAIL); 若高于或等于85分,则打印G(GOOD);当在 60分和84分之间时,打印P(PASS)。
放在ARRAY开始的内存单元中,现对该 数组中的元素进行测试,若元素为0,而 且不是最后一个元素,则继续进行下一 个元素的测试,直到找到第一个非零元 素或查完为止。(提示:用LOOPE指令 实现循环)
DATA SEGMENT ARRAY DB 50 DUP(?) DATA EDNS …… MOV BX,OFFSET ARRAY DEC BX MOV CX,50 NEXT : INC BX CMP [BX],00h LOOPE NEXT …… ……
OLD DB 83H,76H,65H,84H,71H,49H,62H,58H NEW DB 8 DUP(?) MOV CX,8 MOV BX,0 NEXT:MOV AL,OLD[BX] ADD AL,7 DAA MOV NEW[BX],AL INC BX LOOP NEXT
• 循环体内也可以只有一条指令,即LOOP
控制转移指令
• 无条件转移指令 • 条件转移指令 • 循环指令 • 子程序调用和返回指令 • 中断调用和返回指令
• •
1、无条件转移指令
格式:
JMP 目标
说明: 目标通常用标号来表达,根据转移的远 / 近、直接 / 间
接不同,可有以下几种格式:
• JMP • JMP • JMP • JMP • JMP
JLE / JNG
SF OF 或
ZF = 1
AB
• 例1:已知三个带符号数存放在AX、BX、
CMP AX,BX CMP AX,BX JG CMPAXCX
CX寄存器中,编程求这三个数的最大值, 并存放在AX寄存器中。