400 likes | 504 Views
第八讲 8088 指令系统(续) 2006.11.7 (星期二). 课程内容: 五、控制传送指令 六、处理器控制指令. 如何利用地址线产生脉冲. 两态总线. 三态总线. KKK : M OV AL ,( BX ) CALL DELAY INC BX MOV AL ,( BX ) CALL DELAY JMP KKK. 五.控制传送指令 ( Control transfer instructions ) 控制传送指令概述 控制传送指令包括四种: 转移指令,循环控制指令,过程调用指令,中断指令。.
E N D
第八讲 8088指令系统(续)2006.11.7(星期二) 课程内容: 五、控制传送指令 六、处理器控制指令
如何利用地址线产生脉冲 两态总线 三态总线 KKK:MOV AL,(BX) CALL DELAY INC BX MOV AL,(BX) CALL DELAY JMP KKK
五.控制传送指令(Control transfer instructions) 控制传送指令概述 控制传送指令包括四种: 转移指令,循环控制指令,过程调用指令,中断指令。
(一)、无条件转移指令 1. JMP(jmp)目标标号 JMP指令必须指定转移的目标地址(或转向地址)。 转移分成两类:段内或段间转移。 (1)段内直接转移:只要改变IP寄存器的内容 指在同一段的范围之内进行转移 (IP)←(IP)当前+目标标号所代表的地址偏移量 地址偏移量又称为符号地址 目标标号为8位,称为短转移。 目标标号为16位,称为近转移。
内存 ... OP (NEXT的值定义为50H) (IP) 当前 ... 3000:1000H ... OP 3000:1050H 03H ... (IP)=(IP)当前+D8 例如:代码段内有一条无条件转移指令在汇编语言中使用符号地址。 JMP SHORT NEXT指令执行过程: NEXT—在汇编语言中使用符号地址 (IP)←(IP)当前+D8(8位带符号数) 向前跳,D8为正数, 往回跳,D8用补码 源程序 : 条件转移指令:JMP SHORT next ... ... ... next: MOV AL,03H JMP SHORT ABC 若ABC=0F0H,则回跳16字节
(2)段内间接转移: (CS)不变,只改变(IP) 格式:JMP OPR OPR —为16位寄存器、 或存储器(除立即数以外的任何一种寻址方式) 执行操作: (IP) (EA) 或(IP) (reg16) IP指针的内容根据寄存器或存储器(数据段、附加段、堆栈段)的内容而改变。 指令格式举例: JMP BX JMP SI JMP TABLE [BX] ; 操作数已定义为16位存储器 JMP ALPHA_WORD ;操作数已定义为16位存储器 JMP WORD PTR [BP][DI];操作数已定义为16位存储器
例: (IP)=5000H, (CS)=3000H , (DS)=1000H, (BX)=1000H (11000H)=1234H, JMP BX ; (IP)=1000H,在当前段内,属于 ;寄存器寻址 JMP WORD PTR [BX] ;(CS)=3000H , (IP)=1234H 在当前段内,(PA)=(16d(DS)+(BX))=(11000H) 为 1234H 将PA地址存储器的内容( 1234H )给IP ;属于寄存器间接寻址。
(3)段间直接转移:要修改IP、 CS寄存器的内容。 转到另一段去执行程序。 转移目标地址= 新的段地址和偏移地址两部分组成。 格式:JMP FAR PTR OPR; OPR—在汇编语言中使用 符号地址 (如标号AKK,假设定义在另一程序段CC00:0044)。 转移地址与指令不在同一个段里。 在机器语言中则要指定转向地址的偏移地址和段地址 JMP FAR PTR AKK 执行操作:(IP)←OPR所在的段内偏移地址0044H。 (CS)←OPR所在的段的段址CC00H。 直接转移通过符号地址加载IP和CS,间接转移通过存储器内容加载IP和CS .
(4) 段间间接转移:(CS) 、 (IP)都改变 格式:JMP DWORD PTR OPR OPR —存储器操作数 (除立即数和寄存器以外的任何一种寻址方式) 执行操作:将4字节连续地址分别送给IP和CS (IP)←(EA) (CS)←(EA+2) 例:已知 (BX)=1000H,(SI)=2000H , (DS)=2000H (23000H)=2212H, (23002H)=4434H JMP DWORD PTR [BX][SI] 则: (BX)+(SI)=3000H (IP)=(PA)=(16d(DS)+(BX)+(SI))=(23000H)=2212H (CS)=(PA+2)=4434H
2.条件转移指令 指令格式:J cc OPR 操作:根据上一条指令所设置的条件码来判别测试条件转移。 每一种条件转移指令都有它的测试条件。 满足条件时 : (IP)←(IP)当前+ OPR(D8) 使用相对寻址方式,范围-128~+127个字节 不满足条件时:(IP)不变,顺序执行下一条指令 (该指令为两字节长度,一字节为指令功能码,一指令为一个字节的相对跳转地址偏移量)
按转移条件不同,条件转移指令可以分为四大类:按转移条件不同,条件转移指令可以分为四大类: ① 以单个状态标志作为转移条件助记符 转移条件 ② 以CX的值为0作为转移条件
③以两个无符号数比较的结果作为转移条件 ④以两个带符号数比较的结果作为转移条件
注意几点: • 所有条件转移指令都是相对转移形式,(两字节指令) • 范围(-128~+127)。 • 当需往一个较远地方进行条件转移时, • 选用条件转移转到附近一个单元, • 然后,再用无条件转移转到较远的目的地。 • ② 条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移, • ③条件转移指令不影响标志位 • 例: 程序段 2000H: 3040H DONE: MOV AX,05H • ………… • 2000H: 3079H JNE DONE • 求DONE为何值
内存 ... (IP) 当前 OP 2000:3040H 05H 0011000001111011 1111111111000101 0011000001000000 307BH ... + C5H ... OP 2000:3079H DONE C5H 2000:307BH ... 程序段 2000H: 3040H DONE:MOV AX,05H ………… 2000H: 3079H JNE DONE 执行此指令时, IP指针为何 (IP)=(IP)当前
条件转移指令应用 例:比较二个数是否相等 如相等做动作1 否则做动作2 …… CMP AX,BX JE action_1 Action_2: …… …… action_1 : …… Y N N Y action_1 action_2 action_2 action_1 AX BX AX BX = = ? ? 或 …… CMP AX,BX JNZ action_2 action_1: …… action_2: ……
例:在M中有一个首地址为array的N字数组, 要求测试其中正数、0及负数的个数. (带符号数判断) 正数个数放在: (DI)中, 0的个数放在: (SI)中, 负数的个数放在: N-(DI)-(SI)送(AX) 如果没有负数转skip, 如果有负数转neg_val 程序: mov cx,N ; N字数组 mov bx,0 mov di,bx mov si,bx again: cmp word ptr arrary[bx],0 jle less_or_ag inc di ;正数个数 jmp short neat less_or_ag: jl neat inc si ; 0的个数 neat: add bx,2 dec cx jnz again mov ax,N sub ax,di sub ax,si jz skip;没有负数 jmp near ptr neg_val;有负数 skip: …… neg_val: ……
(三) 过程( 子程序 )调用指令 子程序—程序中具有独立功能的部分编写成独立程序模块。 子程序(过程)定义格式: 符号名 (AA) PROC 类型(FAR/NEAR) …… RET(RETURN) 符号名(AA) ENDP 子程序调用和返回指令: CALL AA 过程有两种类型: 按过程与调用语句间的位置,过程有两种类型。 NEAR类型:调用指令与过程在同一个段中 FAR类型:调用指令与过程不在同一个段中 CALL指令和RET指令都不影响条件码。
CALL( Call a procedure)调用 CALL调用指令 调用地址由指令给出 调用时:将当前地址入栈 (CS)。 (IP)。 CALL调用指令有4种: 段内直接调用 段间直接调用 段内间接调用 段间间接调用
例 : CSEG1 SEGMENT CALL FAR PTR subp;此处的CS:IP入栈转subp … CSEG1 ENDS CSEG2 SEGMENT … subp PROC FAR … RET subp ENDP CSEG2 ENDS
(2)、 RET( Reture from procedure)返回 • RET返回指令 放在子程序的末尾 使子程序在功能完成后返回调用程序继续执行。 *为能准确返回 ,返回指令类型与调用指令类型相对应。 RET返回指令有4种: • 段内返回 段间返回 • 段内带立即数返回 段间带立即数返回 • 在子程序调用时,返回地址入栈 • 返回时:将返回地址出栈 (IP)(段内或段间)。 • (CS)(段间)。
(3) 、小结 : • 指令格式: JMP 操作数 ◢ 当前IP的值为控制转移指令下一条指令的偏移地址。 ◢ 位移量 = 符号地址的偏移量 - 当前IP的值。 ◢ 符号地址(目标地址)= 当前IP的值 + 位移量
转移方式:由CS是否变化、以及操作数类型决定情况如下表转移方式:由CS是否变化、以及操作数类型决定情况如下表
例 : JMP again (√) JMP BX (√) JMP WORD PTR [BX] (√) JMP DWORD PTR (√) JZ AX (不能是字,AX) (×) JNZ next (?) (若 next的位移量超出-128~127)
(四)循环控制指令 格式 : LOOPxx符号地址 执行 操作 : ①(CX) ← (CX)- 1 此操作不影响标志 ② 检查转移条件xx,满足转向目标地址去执行; 不满足执行LOOPxx后一条指令 转移方式 只允许段内直接短方式,跳转范围-128~127
与条件转移指令不同的是:循环指令隐含 ( CX ) 减1操作。 例:用循环指令将BL寄存器的内容按二进制形式显示出来 学习: LOOP指令 MOV CX , 8 next: ROL BL , 1 MOV DL , BL AND DL , 0000 0001B ADD DL , 0011 0000B MOV AH , 2 INT 21H DEC CX JNZ next …… LOOP next
循环指令说明: • LOOP退出循环条件是(CX)=0 • LOOPZ和LOOPNZ提供了提前结束循环的可能, • 不一定要等到(CX)=0才退出循环。 • ▲ 在串中查找字符,查到了,就可退出, • 可用LOOPNZ,不相等时继续查找。 • ▲比较两串时,当有字符不等,就可退出,说明两字符串不等。 • 可用LOOPZ,当相等时继续比较。 • ▲执行完 LOOPNZ或LOOPZ后,根据ZF标志的值判断结果 • 对查找字符,ZF=1,说明找到;否则没有找到。 • 对串比较,ZF=1, 说明两串相等;否则不等。
例: 在string字符串中查找空格字符,串长度为N。 Y 判[BX]是关键字? N N (CX) = 0 ? Y 修改偏址BX AL 关键字 CX 串长度N DS:BX 串首址 (CX) (CX)-1 找到处理 未找到处理 结束出口 用条件转移: JZ MOV CX, N MOV AX, SEG string MOV DS, AX LEA BX,string MOV AL,20H next: CMP AL,[BX] JZ find INC BX DEC CX JNZ next 未找到处理 …… Find: 找到处理 ……
用LOOPZ和LOOPNZ指令提供提前结束循环的可能性。用LOOPZ和LOOPNZ指令提供提前结束循环的可能性。 有时需要字符串中查找一个字符,找到后可提前结束循环, 用LOOPZ、LOOPNZ来处理。 例:40个元素构成的数组,找出第一个非零元素。 MOV CX,28H MOV SI,0FFFFH NEXT1:INC SI CMP BYTE PTR [SI],0 LOOPZ NEXT1;当Z=1、(CX)≠0循环; 当Z=0,或(CX)=0结束循环。 JNZ OKK ;当找到非零元素转OKK。 CALL DISPLAY1 ;当找不到非零元素转DISPLAY1 …… OKK: CALL DISPLAY2 …… DISPLAY1 …… RET DISPLAY2 …… RET 指令JMP、CALL 、Jcc、LOOPxx本身对标志无影响。
4、中断指令 • 中断(Interrupt): • 有时当系统运行或程序运行期间遇到某些特殊情况, • 需要计算机自动执行一组专门的例行程序来进行处理。 • 中断例行程序(或中断子程序)(Interrupt routine): 所执行的这组程序就称为中断子程序。 • 种类: • 中断分为内部(软)中断和外部(硬)中断两种。 • 内部中断—如除法运算中除数为0、中断指令引起的中断。 • 外部中断—处理I/O设备与CPU之间的通信。
CPU响应一次中断自动完成三件事情: • (PSW)入栈 — 保护现场, • (CS),(IP)保存入栈 — 保留断点, • 转中断例行程序去执行。 • 中断返回时: • 恢复(IP)、(CS)及(PSW) • 中断向量:中断例行程序入口地址。 • IBM-PC中,存储器的最底地址00000H——003FFH为中断向量区, 存放256种类型中断例行程序入口地址,每个中断向量占4个单元。 • 中断指定类型号N × 4——取得指定类型的中断向量地址。
例:中断类型9,9 × 4=36 00024H——00027H单元中放中断向量。 IBM-PC机中为每个类型规定了一种功能。 *除非特别注明,类型号是以16进制形式表示的。
(1). 介绍几条指令:INT n,IRET 格式:INT n ; n—常数或表达式,n=0—255 或INT 执行操作: (SP)←(SP)-2, (SP)) ←(PSW) (SP)←(SP)-2,(SP)) ← (CS) (SP)←(SP)-2,← (IP) (IP) ←(N×4) (CS) ←(N×4+2) 清除IF、TF,避免进入中断以后不被外面其它中断所打断 及进入中断以后按单步执行。
类型0~3的中断称为内部中断。 • 类型0 :指令系统没有INT0这条指令 • 除数为0中断 • 除数为0 :它既不是外部中断 也不是软件中断。 • 是由 CPU自身产生的,所以无对应中断指令。 • 有符号数进行除法所得的商超出规定范围 • 有符号数进行除法运算,所得的商超出规定范围, • CPU自动产生类型为0的中断,转入响应的中断处理程序。 • 。
内存0:0000H~0:03FFH区域中,构成中断向量表,存放中断处理程序入口地址。内存0:0000H~0:03FFH区域中,构成中断向量表,存放中断处理程序入口地址。 每4个单元对应1个中断源。关系如下表:
∴ INTO跟在有符号数+、-后面: * 这条指令可以写在一条算术指令后面。 若产生溢出,OF=1,则启动中断过程,不进行任何操作。 (2) IRET——从中断返回指令(Interrupt return) 所有中断过程(服务程序)不管是硬还是软,最后一条指令一定是: IRET退出中断过程,返回中断时断点。 格式:IRET 执行操作:(IP)←((SP)+1,(SP)) , (SP) ←(SP)+2 (CS)←((SP)+1,(SP)) , (SP) ←(SP)+2 ( PSW)←((SP)+1,(SP)), (SP) ←(SP)+2
六、处理器控制指令 (一)标志处理指令 1、CLC (Clear carry flag ) 清CF标志 2、STC(Set carry flag ) 置CF标志 3、CMC(Complement carry flag ) 对CF求反 4、CLD(Clear direction flag ) 清DF标志 5、STD(Set direction flag ) 置DF标志 6、CLI(Clear interrupt flag ) 清IF标志 7、 STI (Set interrupt enable flag ) 置IF标志 (二)其他处理机控制指令 1、NOP(No operation ) 空操作 2、 HLT(Halt ) CPU暂停状态 3、 WAIT (Wait while pin not asserted ) CPU等待状态 4、 ESC(Escape ) 交权 5、 LOCK(Lock bus ) 总线锁定
标志处理指令 ▲ 设置和清除标志的指令,只影响指令指定的标志。
CALL子程序调用指令 CALL FFF RET 子程序设计 • 寄存器的保存与恢复 FFF PROG PUSH BX MOV BX, AX SHL BX, 1 ADD AX, BX POP BX RET SUB ENDP AX内容乘以11H的积
作业: • P119 (1)3.42,(2)3.43,(3)3.47,3.83, • (4)程序段 • 2000H: 3062H JNE DONE • ………… • 2000H: 3090H DONE: MOV AX,05H • 执行后DONE为何值