490 likes | 682 Views
指令系统( 4 ). 控制转移指令. 控制转移指令. 无条件转移指令 JMP 条件转移指令 条件设置指令 循环指令 LOOP LOOPZ LOOPNZ 子程序调用(返回)指令 CALL RET 中断指令 INT. JMP 无条件转移指令. 1、 段内转移. 格式1: JMP SHORT OPR ;段内直接短转移 操作 1 : IP<--(IP)+disp 8. 格式 2 : JMP OPR JMP NEAR PTR OPR ;段内直接近转移
E N D
指令系统(4) 控制转移指令
控制转移指令 • 无条件转移指令 JMP • 条件转移指令 • 条件设置指令 • 循环指令 LOOP LOOPZ LOOPNZ • 子程序调用(返回)指令 CALL RET • 中断指令 INT
JMP 无条件转移指令 1、段内转移 格式1:JMP SHORT OPR;段内直接短转移 操作1:IP<--(IP)+disp8 格式2:JMP OPR JMP NEAR PTR OPR;段内直接近转移 操作2:IP<--(IP)+disp16 格式3:JMP WORD PTR OPR;段内间接转移 操作3:IP<--(OPR)
JMP 无条件转移指令 2、段间转移 格式4:JMP FAR PTR OPR;段间直接转移 操作4:IP<--OAopr CS<--(CS)opr 格式5:JMP DWORD PTR OPR;段间间接转移 操作5:IP<--((DS)*16+OPR) CS<--((DS)*16+OPR+2) 说明: 386及其后继机型,用EIP代替IP
1、JMP SHORT OPR 段内直接短转移 转移范围-128字节至+127字节 操作数OPR为段内某个标号 IP<--(IP)+disp8 [例3-5-1]段内直接短转移示例 指令JMP SHORT ADDT 存放在CS:0200 中, 标号ADDT对于IP指针的偏移量为1DH, 则转移地址为0202H+001DH=021FH JMP SHORT ADDT 0200 E8 … 1 1D ADDT: MOV AL, 40H 2 ADD AL, BL +1DH 021F B0 0220 1D
2、JMP OPR 段内直接近转移 转移范围-32KB字节至+32KB字节 操作数OPR为段内某个标号 IP<--(IP)+disp16 3、JMP WORD PTR OPR 段内间接转移 OPR是基址变址寄存器或存储器操作数 IP<--(OPR) [例3-5-2]段内间接转移示例 ADDRESS DW 2000H ;定义转移地址 ... LEA SI, ADDRESS ;偏移量-->SI ... JMP WORD PTR[SI];转移到CS:2000
4、JMP FAR PTR OPR 段间直接转移 操作数是另一个段中的标号 IP<--OAopr C1段 CS<--(CS)opr EA OP码 [例3-5-3]段间直接转移示例 50 新IP=0250H ;代码段C1 02 …… 00 新CS=2000H JMP FAR PTR NEXT 20 …… ;代码段C2 C2段 20000H …… NEXT: MOV AL,10H … NEXT 20250H
5、JMP DWORD PTR OPR 段间间接转移 OPR只能是存储器操作数 IP<--((DS)*16+OPR) CS<--((DS)*16+OPR+2) [例3-5-4]段间间接转移示例 JMP DWORD PTR [4000H] 设(DS)=1000H (14000H)=0010H (14002H)=5000H
CALL 子程序调用指令 格式1: CALL 子程序名 ;段内直接调用 操作1: SP<--(SP)-2 ((SP)+1,(SP))<--(IP) IP<--(IP)+disp16 格式2:CALL reg/mem;段内间接调用 操作2:SP<--(SP)-2 ((SP)+1,(SP))<--(IP) IP<--(reg) 或 IP<--(mem) 说明:类似于段内无条件转移指令 不同的是需要将返回地址IP入栈
CALL 子程序调用指令 格式3:CALL FAR PTR 子程序名 ;段间直接调用 操作3:SP<--(SP)-2 ((SP)+1,(SP))<--(CS) SP<--(SP)-2 ((SP)+1,(SP))<--(IP) IP<--子程序名对应的偏移量 CS<--子程序所在的段地址
格式4:CALL DWORD PTR mem ;段间间接调用 操作4: SP<--(SP)-2 ((SP)+1,(SP))<--(CS) IP<--(IP)-2 ((SP)+1,(SP))<--(IP) IP<--(EA) CS<--(EA+2) 说明:段间调用须保存返回地址IP和CS 386及其后继机型,用EIP代替IP
RET 子程序返回指令 格式 功能 操作 RET 段内返回 IP<--((SP)+1,(SP)) SP<--(SP)+2 RET 段间返回 IP<--((SP)+1,(SP)) SP<--(SP)+2 CS<--((SP)+1,(SP)) SP<--(SP)+2 RET EXP 带立即数返回 在上述操作之后再做 SP<--(SP)+EXP
[例3-5-5] CALL、RET指令示例 C1段 MAIN …… CALL FAR PTR PRO_A 0500:1000 …… C2段 PRO_A …… CALL NEAR PTR PRO_B 2000:2500 …… CALL NEAR PTR PRO_C 2000:3700 …... RET • MAIN调用PRO_A之前 • SP 0100 • MAIN调用PRO_A之后 • SP 00FC 1000 0500
PRO_B …… CALL NEAR PTR PRO_C 2000:4000 2500 …… 1000 RET 0500 PRO_C …… RET 4000 2500 1000 0500 (3) PRO_A调用PRO_B之后 00FA (4) PRO_B调用PRO_C之后 00F8
(5) PRO_C返回PRO_B之后 SP 4000 2500 1000 0500 (6) PRO_B返回PRO_A之后 SP 4000 2500 1000 0500 00FA (7) PRO_A调用PRO_C之后 SP 00FC 00FA 4000 3700 1000 0500
(8) PRO_C返回PRO_A之后 SP 00FC 4000 3700 1000 0500 (9) PRO_A返回MAIN之后 SP 4000 3700 1000 0500 0100
条件转移指令 格式:J条件 标号 操作:测试条件,若满足,则跳转到标号处执行, 即 IP<--(IP)+disp8 ; 否则,执行后续指令 说明:根据上一条指令所设置的条件码判别测试条件 转移范围在-128到+127字节
条件转移指令(1) 操作符 功能 测试条件 JC 进位标志为1转移 CF=1 JNC 进位标志为0转移 CF=0 JZ/JE 等于0/相等转移 ZF=1 JNZ/JNE 不等于0/不相等转移 ZF=0 JS 符号标志为1转移 SF=1 JNS 符号标志为0转移 SF=0 JO 溢出转移 OF=1 JNO 无溢出转移 OF=0 JP/JPE 偶状态转移 PF=1 JNP/JPO 奇状态转移 PF=0 JCXZ CX=0转移 CX=0 JECXZ ECX=0转移 ECX=0
条件转移指令(2) 比较情况 无符号数 有符号数 指令 判断条件 指令 判断条件 A>B JA ZF=0,CF=0 JG SF=OF JNBE JNLE 且ZF=0 A>=B JAE ZF=1,CF=0 JGE SF=OF JNB JNL 或ZF=1 A<B JB ZF=0,CF=1 JL SF<>OF JNAE JNGE 且ZF=0 A<=B JBE ZF=1,CF=1 JLE SF<>OF JNA JNG 或ZF=1
[例3-5-6]条件转移指令示例1 将DAT字节单元中的数据变为偶数 TEST DAT, 01H;测试数的奇偶性 JE NEXT ;若是偶数,转移 INC DAT ;是奇数,加1 NEXT: ……
[例3-5-7]条件转移指令示例2 将X中十六进制的ASCII码转换成 其所对应的数值,存放到HEX中。 如‘A’应转换为10。 MOV AH, X CMP AH, 39H JBE NEXT ;<=39H则转 SUB AH, 7 ;是‘A’--’F’,减7 NEXT: SUB AH, 30H ;减30H MOV HEX, AH
[例3-5-8]条件转移指令示例3 CMP AX, 0FFFFH JLE P3 CMP AX,1 JL P2 MOV AX, 1 JMP DONE P2: MOV AX, 0 JMP DONE P3: MOV AX,-1 DONE: Y AX<=(-1) N N Y AX<1 AX<--1 AX<--0 AX<--(-1)
条件设置指令(386及其后继机型可用) 格式:SETcc DST 操作:测试条件,如满足条件, 则置目的操作数为1; 否则,置目的操作数为0 说明:cc是指令助记符的一部分,表示条件 操作数只能是8位寄存器或存储单元
条件设置指令(1) 指令 功能 测试条件 SETZ/SETE 等于0或相等时置1 ZF=1 SETNZ/SETNE 不等于0或不等时置1 ZF=0 SETS 为负时置1 SF=1 SETNS 为正时置1 SF=0 SETO 溢出时置1 OF=1 SETNO 不溢出时置1 OF=0 SETP/SETPE 偶时置1 PF=1 SETNP/SETPO 奇时置1 PF=0
条件设置指令(2)----无符号数 比较 指令 功能(置1) 测试条件 SETB 低于 SETNAE 不高于等于 CF=1 SETC 进位为1时 SETNB 不低于 SETAE 高于等于 CF=0 SETNC 进位为0时 SETBE 低于等于 CF或ZF=1 SETNA 不高于 SETNBE 不低于等于 CF或ZF=0 SETA 高于
条件设置指令(3)----有符号数 比较 指令 功能(置1) 测试条件 SETL 小于 SF异或OF=1 SETNGE 不大于等于 SETNL 不小于 SF异或OF=0 SETGE 大于等于 SETLE 小于等于 (SF异或OF)或ZF=1 SETNG 不大于 SETNLE 不小于等于 (SF异或OF)或ZF=0 SETG 大于
[例3-5-9]条件设置指令示例 测试寄存器EAX中8位16进制数中是否有一位为0, 若有,BH不等于0;否则BH=0 MOV BH, 0 ;BH赋初值 MOV CX, 8 ;共有8位16进数 NEXT: TEST AL, 0FH ;测试1位16进数 SETZ BL;若为0,则BL=1 OR BH, BL ROR EAX, 4 ;循环右移4位 DEC CX JNZ NEXT
循环指令 格式:指令码 标号 操作符 操 作 功 能 LOOP CX<--(CX)-1 循环 若(CX)<>0,则循环 LOOPZ CX<--(CX)-1 当不为零且 LOOPE 若(CX)<>0且ZF=1,则循环 相等时循环 LOOPNZ CX<--(CX)-1 当不为零且 LOOPNE 若(CX)<>0且ZF=0,则循环 不相等时循环
[例3-5-9]循环指令示例1 求长度为10的字节数组ARRAY之和, 并将和存入TOTAL中 LEA SI, ARRAY ;数组首地址-->SI MOV CX, 10 ;数组长度-->CX MOV AX, 0 AGAIN: ADD AL, [SI] ;求数组和 ADC AH, 0 INC SI ;修改指针 LOOP AGAIN MOV TOTAL, AX ;存和 其中 语句 LOOP AGAIN相当于: DEC CX JNZ AGAIN
[例3-5-10]循环指令示例2 在某一字节串中寻找第一个非0字节 设串首地址在DI中,串末地址在BX中 SUB BX, DI ;串长度在BX中 INC BX MOV CX, BX ; 串字节数-->CX DEC DI AGAIN: INC DI ;修改指针 CMP BYTE PTR [DI], 0 ;串元素=0? LOOPZ AGAIN ;循环查找 JNZ FOUND ;找到非0字节跳转 …… FOUND:
[例3-5-11]综合运用例 有一个首地址为ARRAY的N字数组, 将其中正数的个数放在DI中,0的个数 放在SI中,负数个数放在AX中 MOV CX, N MOV BX, 0 ;初始化 MOV DI, BX MOV SI, BX AGAIN:CMP ARRAY[BX], 0 ;数组当前元素与0比较 JLE LEEQ ;小于等于0转移 INC DI ;正数计数 JMP NEXT
LEEQ: JL NEXT ;小于0转移 INC SI ;0计数 NEXT: ADD BX, 2 ;数组表指针指向下一元素 LOOP AGAIN MOV AX, N ;负数个数=N-DI-SI SUB AX, DI SUB AX, SI
中断指令 中断——计算机暂时中止正在执行 的程序,转去处理特殊情况或外设 的请求(执行专门的例行程序), 并在处理完后自动返回原来的程序, 这一过程称为中断 中断服务程序——指专门的例行程序 中断向量——中断服务程序的入口地址 中断向量表——存放中断向量的存储区域
8086的中断向量表在存储区的 最低1KB字节中,对应256种 中断,每个中断向量占4个字节 00000 类型0的IP 类型0的CS 00004 类型1的IP 类型1的CS 4*N 类型N的IP 类型N的CS 类型0的中断向量 类型1的中断向量 类型N的中断向量
指令 格式 操 作 中断 INT N SP<--(SP)-2 ((SP)+1,(SP))<--(FLAGS) SP<--(SP)-2 ((SP)+1,(SP))<--(CS) SP<--(SP)-2 ((SP)+1,(SP))<--(IP) IP<--(0000:OA);OA=4*N CS<--(0000:OA+2) 中断返回 IRET IP<--((SP)+1,(SP)) SP<--(SP)+2 CS<--((SP)+1,(SP)) SP<--(SP)+2 FLAGS<--((SP)+1,(SP)) SP<--(SP)+2
INT 21H DOS系统功能调用 功能调用的基本方法如下: 1、子功能号送AH寄存器; 2、按要求设置所有入口参数; 3、发送 INT n 软中断指令。
常用的系统功能调用 功能号 功能 入口参数 出口参数 01H 键盘输入 (AH)=1 (AL) =输入字符 02H 显示器输出 (AH)=2 无 (DL)=欲输出字符 09H 显示字符串 (AH)=9 无 (DS:DX)=字符串首址 字符串以‘$’结束 0AH 输入字符串 (AH)= 0AH (DS:DX)所指 (DS:DX)=输入缓 缓冲区中为 冲区首址 输入的字符串 4CH 返回调用 (AH)=4CH 无 进程
[例3-5-12]单个字符输入示例 读入一个字符,若是‘Y’, 则Z<--X+Y;否则 Z<--X-Y MOV AH, 01H ;输入字符 INT 21H CMP AL, ‘Y’ ;比较 JZ ADDT MOV BX, X SUB BX, Y JMP NEXT ADDT: MOV BX, X ADD BX, Y NEXT: MOV Z, BX
[例3-5-13]单个字符输出示例 MSG DB ‘How are you!’,’$’ LEN EQU $-MSG MOV CX, LEN ;序列长度 MOV SI, 0 MOV AH, 02H;输出一个字符 LP:MOV DL, MSG[SI] INT 21H INC SI ;修改指针 LOOP LP ;循环
[例3-5-14]字符串输出示例 MOV AX, SEG MSG MOV DS, AX LEA DX, MSG MOV AH,09H INT 21H
[例3-5-15]字符串输入示例。 该子功能调用前,在数据段中 必须定义一个缓冲区: N EQU 20 MAXLEN DB N ;缓冲区最大长度 ACTLEN DB ? ;缓冲区实际字符个数 TRING DB N DUP(?) ;N个字符空间 …… MOV AH, 0AH LEA DX, MAXLEN INT 21H 说明: 缓冲区可接受的字符个数为1~255 缓冲区的第3个字节开始存放输入的字符
处理器控制指令 1、标志处理指令 CLC —— 进位标志CF置0 CMC ——进位标志CF求反 STC —— 进位标志CF置1 CLD ——方向标志DF置0 STD —— 方向标志DF置1 CLI —— 中断标志 IF置0 STI —— 中断标志 IF置1
2、其他处理器控制指令 NOP —— 空操作 HLT —— 停机 WAIT —— 等待 ESC —— 换码 LOCK —— 封锁 BOUND——界限(286及其后继机型用) ENTER——建立堆栈帧(286及其后继机型用) LEAVE——释放堆栈帧(286及其后继机型用)
BOUND 界限指令 格式:BOUND reg, mem 操作:检查给出的数组下标是否在规定的上下界之内 若是,则执行下一条指令,否则产生中断5 [例3-5-16]界限指令示例 BOUND SI, DATA MOV AX, ARRAY[SI] 在DATA单元中,存放 ARRAY的起始下标(下界), DATA+2 单元中存放ARRAY的末尾下标(上界), SI中存放当前要访问数组元素的下标。
ENTER 建立堆栈帧 格式:ENTER imm16, imm8 操作:(1) PUSH (BP) 或 PUSH (EBP) 保存该寄存器的原始内容 (2) (BP)(SP) 或 (EBP)(ESP) 使寄存器保存当前堆栈指针的内容 (3) (BP)(SP)-imm16 或 (EBP)(ESP)-imm16 建立堆栈帧所占有的存储空间 说明:imm16 指定堆栈帧的大小 imm8 给出过程的嵌套层数,在0—31之间 该指令用于过程调用时为便于传递参数而建立堆栈帧 所用
[例3-5-17]建立堆栈帧示例 ENTER 8, 0 0036 0037 0038 0039 003A 003B 003C 003D 003E 003F 0040 新(SP) 堆栈帧 新(BP) 原(BP)低字节 原(BP)高字节 原(SP)
LEAVE 释放堆栈帧 格式:LEAVE 操作: (1) (SP)(BP) 或 (ESP)(EBP) (2) (BP)POP( ) 或 (EBP)POP( ) 说明:该指令位于RET指令之前,用来释放 ENTER 指令建立的堆栈帧存储区
作业: 3.33 3.39