《第三章80X86指令系统13.ppt》由会员分享,可在线阅读,更多相关《第三章80X86指令系统13.ppt(74页珍藏版)》请在三一文库上搜索。
1、1,五控制传送指令(Control transfer instructions) (一)、控制传送指令概述 控制传送指令包括四种: 转移指令,循环控制指令,过程调用指令,中断指令。 1、转移指令 转移指令包括两种: (1)、JMP (Jump) 无条件转移指令 (2)、Jcc 条件转移指令,家压桑久革娄巫酶跑透悄州段坏媒拒事皿澜检澄吵琐姿吻绘女靳撇朝童姻第三章80X86指令系统13第三章80X86指令系统13,2,(1)、JMP(Jump)无条件转移指令 JMP指令的操作:无条件地将控制转移到指令中规定的目的地 目标地址可以是:直接方式/间接方式给出。 JMP指令不影响标志位。 转移分成两类:
2、段内或段间转移。 无条件转移指令有五种格式: 段内直接短转移 段内直接近转移 段内间接转移 段间直接远转移 段间间接转移,骂廊蹿逊槛丢奸趾撵篓败囱坝嫉赴缠劝万闹慨痞临椎呻鬼束穗灶挑乐慧隘第三章80X86指令系统13第三章80X86指令系统13,3,(2)、Jcc 条件转移指令 汇编程序设计中常利用条件转移指令来实现分支。 “cc”表示条件。 操作数必须是短标号。转移范围为:128127 具体条件转移指令分四种情况讨论: 根据单个条件标志的设置情况转移 JZ(JE)/JNZ(JNE),JS/JNS,JO/JNO,JP(JPE)/JNP(JPO), JB(JNAE、JC)/JNB(JAE、JNC)
3、, 根据两个无符号数比较结果转移 JB(JNAE、JC)/JNB(JAE、JNC),JBE(JNA)/JNBE(JA) 比较两个带符号数,并根据比较结果转移 JL(JNGE)/JNL(JGE),JLE(JNG)/JNLE(JG) 测试CX的值为零转移 JCXZ,业铆暴硒量涅感抨佑啄沫鬼瑚囤俄寅焙丸托苇插拿畸却聚淑熔慑粥耀寨污第三章80X86指令系统13第三章80X86指令系统13,4,2、 过程调用指令 如果有一些程序段在不同地方反复出现,可以将这些程序段设计成为过程(子程序)供调用。过程结束,返回调用处。 过程调用指令包括:过程调用指令和返回指令 (1)、 CALL( Call a proc
4、edure)调用 CALL调用指令 段内直接调用段间直接调用 段内间接调用段间间接调用 (2)、 RET( Reture from procedure)返回 RET返回指令 段内返回段间返回 段内带立即数返回段间带立即数返回,抡峪伍迸像疥婶偶机褂氮缴散夕赊孵煮渝册临呛族候畅底玄远妹雇肩坐维第三章80X86指令系统13第三章80X86指令系统13,5,3、循环控制指令 循环控制指令用于使一些程序段反复执行形成循环程序。 循环控制指令有三种: (1)、LOOP (Loop) 循环指令 (2)、LOOPE/LOOPZ (Loop if equal / Loop if zero) 当相等/为“0”循环
5、 (3)、LOOPNE/LOOPNZ (Loop if not equal/ Loop if not zero) 当不相等/不为“0”循环,仕戌阻冠霓烛嫡剁遭驭殉租酪秘苦荣酿搭怖戳匠酶黑灌荚鸦测惶漏咎驾癸第三章80X86指令系统13第三章80X86指令系统13,6,4、中断指令 8086/8088CPU 可以在程序中安排一条中断指令引起中断过程,这种中断称为软中断。 8086/8088CPU共有三条中断指令: (1)、INT (Interrupt) (2)、INTO(Interrupt if overflow) (3)、IRET(Interrupt Return),绷净吕特侵梯替码活猴牙彭戚钧
6、宗便州各蝴庚逊讼宗弯烧锻酒走杏添宙鳃第三章80X86指令系统13第三章80X86指令系统13,7,归结控制转移指令分类,泞狮挠爬燃鬃搔仰虞饺谜街恃翠蛊蔼涉蛀总俯帮咬滥茬遂岳啦曼拴俐李车第三章80X86指令系统13第三章80X86指令系统13,8,(二) 控制转移指令(Control transfer instructions) 1、转移指令 转移指令将程序控制从一处转换到另一处的最直接方法。 在CPU内部,转移是通过将目标地址传送给CS:IP来实现的。 注意:CS段地址 IP偏移量,惑嘱丑辗粮枯撕痘旅笆绵怂湖霍勾食洼弦喇暑裔盈项呵债纽修挖费瑟钎椎第三章80X86指令系统13第三章80X86指令
7、系统13,9,先介绍控制和非控制转移指令的概念 非控制转移指令:指令本身对CS和IP均无操作,形成顺序 执行结构。 顺序执行结构: 顺序存放,顺序执行 控制转移指令: 以CS和IP为主要操作对象, 改变CS和IP寄存器的值, 就改变了程序执行的流程。,浅豫密揖坛齐显适腆知寿卡员紧恼诡诉曝缘占旱沮躇演页裤臭讫酗到积携第三章80X86指令系统13第三章80X86指令系统13,10,在8086/8088中,指令的地址固定由CS和IP两个寄存器决定。 CS和IP两寄存器的内容决定了程序的流程 , 改变CS和IP寄存器的值, 就改变了程序执行的流程。 8086/8088 中CS和IP的变化规则: res
8、et复位后, CS = FFFFH, IP = 0 故8088从内存FFFF:0000H处取第一条指令执行, 第一条指令在内存的ROM区。 非控制转移指令 CPU取来一条指令后, 自动将IP的值加上该指令的字节数, 使IP顺序指向下一条指令, CPU取来紧接着的指令执行。 (此时IP的变化由CPU内部的硬件自动完成),宙传爪判者阉弘做姐本兑挽醋熄槽盎莱陕唁孰鼠紊豹廷巡重窒浊谆捌核量第三章80X86指令系统13第三章80X86指令系统13,11,控制转移指令以CS和IP为主要操作对象 控制转移指令改变CS和IP的值, 使程序产生分支、调用结构。 分支结构、调用结构: 顺序存放,非顺序执行 例:比
9、较 AX 、 BX 的大小,将大数存于( max )单元 CMP AX, BX JGE great XCHG AX, BX great: MOV max, AX,试宝弟篡狈始尉巍谊贵是谨傅驹毯拇辽蜗侧掖沉配厌梳毗畔刚矢脯养恢躁第三章80X86指令系统13第三章80X86指令系统13,12,(1)、JMP(Jump)无条件转移指令 JMP(jmp)跳转指令。 JMP指令必须指定转移的目标地址(或转向地址)。 转移分成两类:段内或段间转移。 段内转移:只要改变IP寄存器的内容 指在同一段的范围之内进行转移 即用新的转移目标地址代替原有的IP值。 段间转移:要修改IP、 CS寄存器的内容 转到另一段
10、去执行程序。 即转移目标地址= 新的段地址和偏移地址两部分组成。,淌牙殴植预芯役秤七板停尊我圾样招灵啄芽痘甭潜温抠奔口票贬聋洽注禁第三章80X86指令系统13第三章80X86指令系统13,13,段内直接短转移: 格式:JMP SHORT OPR OPR在汇编语言中使用符号地址。 在机器语言中存放位移量D8 位移量D8 = 符号地址的偏移地址 - 当前IP的值 执行操作: IP IP 当前+D8 SHORT 短属性标号 8位位移量D8的范围在(-128 127)之间,占有一个字节。 而指令本身占有两个字节。,醇要柔潭腻四另登滇釉凭蘸叹阵铜唬摆乘煤桌钱筹绵管邪医挫狸举烤皖媚第三章80X86指令系统
11、13第三章80X86指令系统13,14,例如:代码段内有一条无条件转移指令,在汇编语言中使用符号地址JMP SHORT NEXT指令执行过程: NEXT在汇编语言中使用符号地址 IP IP当前 + D8,赁撅袜则淘杖釜悉部弊湖缘讣呆舆乳输里记赢骸亲引聘辛谷硝瞪彤人牵驻第三章80X86指令系统13第三章80X86指令系统13,15, 段内直接近转移: 格式:JMP NEAR PTR OPR OPR在汇编语言中使用符号地址。 在机器语言中存放位移量D16 位移量D16 = 符号地址的偏移地址 - 当前IP的值 执行操作: IP IP 当前 +D16 NEAR近属性标号 位移量为D16范围:-327
12、68+32767H,占有两个字节。 而指令本身占有三个字节。可以转移到段内的任一位置。 过程:如同SHORT,只是位移量为D16范围-32768+32767H, 占有两个字节。,毡涡所踢瘤焦揽径宛灿莱族屈潮鲜频霸舌功企茸最乞比吓体炙孺俘藻言隐第三章80X86指令系统13第三章80X86指令系统13,16, 段内间接转移: CS 不变,只改变 IP 格式:JMP WORD PTR OPR OPR 为16位寄存器、 或存储器(除立即数以外的任何一种寻址方式) 执行操作: IP (EA) 或 IP reg16 指令格式举例: JMP AXJMP SI JMP TABLE BX; 操作数已定义为16位
13、存储器 JMP ALPHA_WORD;操作数已定义为16位存储器 JMP WORD PTR BPDI,将柜蒜斑徊责脯蜂锗科田褐睁梅额抱烃盘杀桐喀灵抨摩喜媳段恍燕蚤歌耐第三章80X86指令系统13第三章80X86指令系统13,17,例: DS =1000H, BX =1000H, CX =5000H, CS =3000H (11000H)=1234H, ( 11002H)=5678H JMP CX;IP =5000H JMP WORD PTR BX; CS =3000H , IP =1234H (PA) = (16d DS + BX)=(11000H)=1234H,娥档卿宠战稗老悲咳聋瘪远踏生狐
14、榆披柔山猫常跪论沉设筷颊两睁恼钞柠第三章80X86指令系统13第三章80X86指令系统13,18, 段间直接(远)转移: (CS) 、 (IP)都改变 格式:JMP FAR PTR OPR; OPR在汇编语言中使用符号地址。 符号地址与指令不在同一个段里。 在机器语言中则要指定转向地址的偏移地址和段地址 执行操作: IP OPR所在的段内偏移地址。 CS OPR所在的段的段址。 而指令本身占有5个字节: 用2个字分别存放符号地址的段值、偏移值, 用1个字节存放操作码。,滥词恿抹彰尧趣惟栈夹仟件沤捂绪做幕陋霓陆辜样巳缩肚软选揪搏载顷唬第三章80X86指令系统13第三章80X86指令系统13,19
15、,FAR 远属性标号, 标号与控制转移指令不在同一段中。 在汇编语言中,在机器语言中存放如下: 例: C1 SEGMENT JMP FAR PTR next_prog C1 ENDS C2 SEGMINT next_prog: C2 ENDS,2000:0250H,旷每寝呛小航耗极锐瞧及笛援逼万烫绊齐悦枷蚜钻艇编徐揍敷潭淆浪缺批第三章80X86指令系统13第三章80X86指令系统13,20, 段间间接转移:(CS) 、 (IP)都改变 格式:JMP DWORD PTR OPR OPR 使用存储器 (除立即数和寄存器以外的任何一种寻址方式) 执行操作: IP (EA) CS(EA+2) 例:已知
16、 BX =1000H, SI =2000H , DS =2000H (23000H)=2211H, (23002H)=4433H JMP DWORD PTR BXSI 则: BX + SI =3000H IP=(PA)=( 16d(DS)+(BX)+(SI) )=(23000H)=2211H CS =(PA+2)=4433H,浑凰蜒贩譬弃督勿趁蛆誉寒晨谤振愚肖批县医孺东艰餐缸礁秦步女拘梅烩第三章80X86指令系统13第三章80X86指令系统13,21,( 2) Jcc 条件转移指令 根据单个条件标志的设置情况转移(10种) JZ(JE) / JNZ(JNE), JP(JPE) / JNP(JP
17、O), JS/JNS, JO/JNO, JC/JNC 根据两个无符号数比较结果转移(4种) JB(JNAE) / JNB(JAE), JBE(JNA) / JNBE(JA) 比较两个带符号数,并根据比较结果转移(4种) JL(JNGE) / JNL(JGE), JLE(JNG) /JNLE(JG),个淡雾毖募集邪锌河兔能捕椎赁噶心镣云萨膛棚图忽妹激国镊分仰队科话第三章80X86指令系统13第三章80X86指令系统13,22,指令格式:J cc OPR 操作:根据上一条指令所设置的条件码来判别测试条件转移。 每一种条件转移指令都有它的测试条件。 满足条件时 : IP IP 当前+ 符号扩展到16
18、位后的位移量D8, 使用相对寻址方式,范围-128+127个字节 即条件转移指令都是“直接短转移” 不满足条件时: IP 不变,顺序执行下一条指令,鸣塘喝汤蚜燕娱支桅讲答已豢其习赚胖芯腑歹仅窗逞帅炸峡搏草膊缠隐凄第三章80X86指令系统13第三章80X86指令系统13,23,注意几点: 所有条件转移指令都是相对转移形式, 范围(-128+127)。 当需往一个较远地方进行条件转移时, 选用条件转移转到附近一个单元, 然后,再用无条件转移转到较远的目的地。 条件转移指令中,相当一部分指令是在比较完二个数大小后,根据结果而决定是否转移, 条件转移指令不影响标志位,姐悼州亿质汛蹄灵上吴窟彩陌耿舶绷剿
19、心柯醇赴沮吼月图幻格秽舍徐礼烹第三章80X86指令系统13第三章80X86指令系统13,24,按转移条件不同,条件转移指令可以分为四大类: 以单个状态标志作为转移条件助记符转移条件, 以CX的值为0作为转移条件,佬液缨考客么惶粪刽宏舆聪懂外沤勇勺哥宗箩轧足鲸勘沫蒲氰枣棵寸结通第三章80X86指令系统13第三章80X86指令系统13,25,以两个无符号数比较的结果作为转移条件,以两个带符号数比较的结果作为转移条件,黔卿荷速雷音四川沃啡湍悟颂聚陪径辊斗棉渊蔓尝英猖工卒美酱句彪拨层第三章80X86指令系统13第三章80X86指令系统13,26,条件转移指令应用 例:比较二个数是否相等 如相等做动作1
20、 否则做动作2 CMP AX,BX JE action_1 Action_2: action_1: ,或 CMP AX,BX JNZ action_2 action_1: action_2: ,杠书阁谦瑟珠荤诌棵肯特亡汽议拳逼优虾炯下馏雌局咱文酷首棕渔腹邦眯第三章80X86指令系统13第三章80X86指令系统13,27,例: 两个数放在X,Y单元里,(带符号数判断) 先判X50,YEStoo_high, NO 做X-Y , 溢出overflow ,否则求|X-Y|result, MOV AX, X CMP AX, 50 JG too_high ;大于转too_high SUB AX,Y JO
21、overflow ;溢出转overflow JNS nonneg ; S=0转nonneg NEG AX nonneg: MOV result , AX too_high: overflow:,仓吁肘吉洽别吕毗狈岸土叹堪扣逞桔口检刷失郴侈女墩范搁泄五阎碾监报第三章80X86指令系统13第三章80X86指令系统13,28,例:在存储器中有一个首地址为array的N个字的数组,要求测试其中正数、0及负数的个数. (带符号数判断) 正数个数放在: DI 中, 0的个数放在: SI 中, 负数个数N-DI-SI 送AX 如果没有负数转skip, 如果有负数转neg_val,程序: mov cx, N
22、;N字数组 mov bx, 0 mov di, bx mov si, bx again: cmp word ptr arrarybx, 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: ,嗜埋扮迹迄端骇瞎邦榴恢鞋奄脂捏推孩转思潘猿蛤淳麻戏舷罕溪壤叭媳尼第三
23、章80X86指令系统13第三章80X86指令系统13,29,2、 过程( 子程序 )调用指令 过程程序中具有独立功能的部分编写成独立程序模块。 过程(子程序)定义格式: 符号名 PROC 类型 符号名 ENDP 子程序调用和返回指令: CALL RET 过程有两种类型: 按过程与调用语句间的位置,过程有两种类型。 NEAR类型:调用指令与过程在同一个段中 FAR类型:调用指令与过程不在同一个段中 CALL指令和RET指令都不影响条件码。,疯贩尺倾积摘均坝幢胶掣胆贵牧滑舒搜柿炊爽失负灌瓦纪悔迅曲痊暗抖腊第三章80X86指令系统13第三章80X86指令系统13,30,(1)、 CALL( Call
24、 a procedure)调用 CALL调用指令调用地址由指令给出 CALL调用指令有4种: 段内直接调用段间直接调用 段内间接调用段间间接调用,疾榴哼留玫龋斌颜碉表肖由凿威竿稚丧咋后枯逼窜芍枣凰怖岗交弧照丈剩第三章80X86指令系统13第三章80X86指令系统13,31, 段内直接调用 格式:CALL DST ; SP SP -2 , (SP+1 ),(SP) IP ; IP IP +D16 DST给出转向地址(子程序的入口地址)。 D16机器指令中的位移量(转向地址和返回地址之差) 位移量为D16范围-32768+32767H,占有两个字节。,喊君蚤己聊稳院狭晓涕扣工踢细震腾酮疚辐醒鹅灶痒
25、荆肛硒王容绽还抓截第三章80X86指令系统13第三章80X86指令系统13,32,工作过程如下: 例: NEAR 类型过程 code SEGMENT ;code段 CALL subp ;指令YYY的IP入栈, D16 =subp-yyy XXX:YYY subp PROC NEAR ;过程定义 RET ;返回 subp ENDP code ENDS,石隧咏厄凡荣糖逢荤甭酬语缅篷收弄陆垛拐调刘卧唬找迪址褒聂厚奖渭港第三章80X86指令系统13第三章80X86指令系统13,33, 段内间接调用: 格式: CALL DST WORD PTR OPR OPR 为16位寄存器,或存储器 (除立即数以外的
26、任何一种寻址方式) 执行操作: SP SP -2 (SP+1 ),(SP) IP IP (EA) EA由DST寻址方式所确定的有效地址。,恃登合沛瑟圆傲潘息摊羌澄虾聊跟懂谁娱友恨侄洒部吟剪炬钎泵赁叁舶泥第三章80X86指令系统13第三章80X86指令系统13,34, 段间直接调用: 格式:CALL FAR PTR DST 执行操作 : SP SP -2 ( SP +1 ),(SP) CS SP SP - 2 (SP+1 ), (SP) IP IP DST偏移地址(指令中第2,3字节 ) CS DST段地址(指令中第4,5字节 ),臻孽麻苹桅该税劳佬部巧栖骋椒曰顷贴谆宣掠吉紫燕嘶弓窃闯承蛤续量就
27、第三章80X86指令系统13第三章80X86指令系统13,35,例 : CSEG1 SEGMENT CALL FAR PTR subp ;a处的CS:IP入栈, 转subp a: CSEG1 ENDS CSEG2 SEGMENT subp PROC RET subp ENDP CSEG2 ENDS,氯淑番噬币拔隶先薛瓣衰搜淹锄队楚脱采谤倡炉闹汾帛衬撑截先彤糟便盒第三章80X86指令系统13第三章80X86指令系统13,36, 段间间接调用: 格式: CALL DWORD PTR DST 执行操作: SP SP -2 ( SP+1 ) ,(SP) CS SP SP -2 ( SP+1 ) ,(S
28、P) IP IP (EA) CS (EA)+2 转子程序入口 EA由DST的寻址方式确定的有效地址。,痢矽桌丽拄加奴椒砾译裸虱蛙腆迸宠印挡椰跺直辽环盂羞哗淹卞桔嘎梢抑第三章80X86指令系统13第三章80X86指令系统13,37,(2)、 RET( Reture from procedure)返回 RET返回指令 放在过程 (子程序)的末尾 使过程(子程序)在功能完成后返回调用程序继续执行 *为能准确返回,返回指令类型与调用指令类型相对应。 RET返回指令有4种: 段内返回段间返回 段内带立即数返回段间带立即数返回 返回时:将返回地址出栈 IP (段内或段间) CS (段间),性室篆拷苇谢悍严
29、通裁除郧制逊造呈简孺敲蛇箕间书陋武戎滦骂筛谱划葵第三章80X86指令系统13第三章80X86指令系统13,38,段内返回: 格式: RET 机器码: C3H或者C2H 执行操作: IP (SP+1 ) ,(SP) SP SP + 2 段间返回: 格式: RET 机器码: CBH或CAH 执行操作: IP (SP+1 ),(SP) SP SP +2 CS (SP+1 ) ,(SP) SP SP +2,迸智泉耘疗倡食纬甄鲁秆朱快蠢笑井锹屎夕眠械揣谅渡寐稍食我辣绊自桥第三章80X86指令系统13第三章80X86指令系统13,39,段内带立即数返回 格式:RET imm16 执行操作: IP (SP+
30、1 ),(SP) SP SP +2 SP SP + D16 SP SP + D16用于废除一些在执行CALL指令之前的入栈的参数,兵木盼荔红魁况兢舍咽理缕钱役侧史慑毕佯浴骤或嘘敌宵毒铜壮芦膛申沿第三章80X86指令系统13第三章80X86指令系统13,40,例如:RET imm16 堆栈使用情况 CODE SEG MENT ASSUME CS : CODE, DS : DATA MAIN PROC FAR START: MOV AX,DATA MOV DS,AX PUSH BX PUSH CX CALL DELCHAR CS:XXXX MOV AH,4CH INT 21H MAIN ENDP,
31、DELCHAR PROC RET 4 DELCHAR ENDP CODE ENDS END START RET imm16 堆栈使用情况,弹洁音冯巷幂刨庆奥楔寐男皖版笛颈这瓦了慎吓捧世蓑镊炕昼酬娠榨宜使第三章80X86指令系统13第三章80X86指令系统13,41, 段间带立即数返回: 格式:RET EXP 执行操作: IP (SP+1 ),(SP) SP SP + 2 CS (SP+1 ),(SP) SP SP +2 SP SP +D16 CALL指令和RET指令都不影响条件码。,戮填吟驹迢猾奄胰蛋复旦覆鳃百咆怖毯亮锐字祁匹曼芝孜逾顾的骋各早碍第三章80X86指令系统13第三章80X86指令
32、系统13,42,另一个代码段 PRO-A PROC PRO-B PROC CALL near ptr PRO-B CALL near ptr PRO-C (IP)=2500H (IP)=4000H CALL near ptr PRO-C RET (IP)=3700H PRO-C PROC RET RET,例:学习使用 段内、段间直接调用指令的使用及堆栈情况 主程序 MAIN在一个代码段中 子程序 PRO-A PRO-B PRO-C在另一个代码段 程序调用关系:,(SP)=0100H MAIN CALL far ptr PRO-A (CS)=0500H (IP)=1000H ,饮空费霞囤山虐蛙包
33、娶寺春单供扫遂腥赶桥彝腾袍许养献曾怠料椰拉恒施第三章80X86指令系统13第三章80X86指令系统13,43,堆栈情况:,责墨址壁串绩盐驴缚鸡惰熟奏商租浮质他兼衷沤玄嗣誓施争蕾园枫蹈茸赡第三章80X86指令系统13第三章80X86指令系统13,44, 当前IP的值为控制转移指令下一条指令的偏移地址。 位移量 = 符号地址的偏移量 - 当前IP的值。 符号地址(目标地址)= 当前IP的值 + 位移量,(3) 、小结 : 指令格式: JMP 操作数,占蹬闲疤剧尿锗弛备恤泻嚷挠馅茹怔仕财够钳程寝拨瓜妊该捂七碎腋唐逸第三章80X86指令系统13第三章80X86指令系统13,45,转移方式:由CS是否变
34、化、以及操作数类型决定情况如下表,兄肺肉块兽欣他惶技砖淖辐悠烫览拎腮严益遇凳态斩皱们丈黎捣抗榷昨究第三章80X86指令系统13第三章80X86指令系统13,46,各控制转移指令允许使用的转移方式,腑顽搓侵扩枝姚宗俐帧俊厚腺促缔沾衬造亩茹忻熬熄纠蝴旋章沾因忠她凌第三章80X86指令系统13第三章80X86指令系统13,47,例 : JMP again () JMP BX() JMP WORD PTR BX() JMP DWORD PTR BX () JZ AX () LOOP BX () JNZ next (?) (若 next的位移量超出-128127) 指令JMP、CALL 、Jcc、LOO
35、Pxx本身对标志无影响。,剁滋冻党抗罚柞层归桨淫哄骡哲酣憋崭钉大法奄柔鄂个懈祸苫源梅碧合站第三章80X86指令系统13第三章80X86指令系统13,48,3、循环控制指令 格式: LOOPxx符号地址 执行 操作 : CX CX - 1 此操作不影响标志 检查转移条件xx,满足转向目标地址去执行; 不满足执行LOOPxx后一条指令 转移方式 只允许段内直接短方式,跳转范围-128127,沽虫希嚷枪礁阶圃陇癣汐份晋岂雁牙始令形搓渗寂诌姻宋状述努端匡络捏第三章80X86指令系统13第三章80X86指令系统13,49,与条件转移指令不同的是:循环指令隐含 ( CX ) 减操作。 例:用循环指令将BL
36、寄存器的内容按二进制形式显示出来 学习: 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,窿钎垫威驭筐想肃齿妨腾疏尉柿郴剪郎助稠矽威悔培矫武物票俄筋活财暂第三章80X86指令系统13第三章80X86指令系统13,50,循环指令说明: LOOP退出循环条件是 CX =0 LOOPZ和LOOPNZ提供了提前结束循环的可能, 不一定要等到 CX =0才退出循环。 例:查找字符: 在串中
37、查找字符,查到了,就可退出, 可用LOOPNZ,不相等时继续查找。 比较两串时,当有字符不等,就可退出,说明两字符串不等。 可用LOOPZ,当相等时继续比较。 执行完 LOOPNZ或LOOPZ后,根据ZF标志的值判断结果 对查找字符,ZF=1,说明找到;否则没有找到。 对串比较,ZF=1, 说明两串相等;否则不等。,挝撩彦呛叶蠕鸡俯谆敲磐挤寒裙批恿侈谣果扭次掷剖暮浅验杏椿冻赤蠢枉第三章80X86指令系统13第三章80X86指令系统13,51,例:检查当前数据段所在的64K字节内存是否能够正确地进行读写操作。可先向每个字节写入数据01010101B,然后读出来进行比较。如正确则转至目标标号OK的
38、程序段,否则进入出错处理程序段ERROR。,MOV CX, 0000H MOV BX, 0000H MOV AL, 01010101H AGAIN: MOV BYTE PTRBX, AL INC BX CMP BYTE PTRBX-1,AL LOOPZ AGAIN JCXZ OK ERROR: . ;出错处理 . OK: . ;读写正确,竟蛇副眩卧亥凝曙闪世传旁胖鹰荫贞庭准叙踩眷坠户媳殴辫饲戏桐窜茧饿第三章80X86指令系统13第三章80X86指令系统13,52,例: 在string字符串中查找空格字符,串长度为N。,用条件转移: JZ MOV CX, N MOV AX, SEG string
39、 MOV DS, AX LEA BX,string MOV AL,20H next: CMP AL,BX JZ find INC BX DEC CX JNZ next 未找到处理 Find: 找到处理 ,韧继桌膘环捉锤和镶内邪纯烘其躺凑嫂薯尉繁苟檬廖滴演奄辉乘君腹暇绸第三章80X86指令系统13第三章80X86指令系统13,53,用条件转移: 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 未找到处理 JMP e
40、xit find:找到处理 exit:结束出口,用循环指令:LOOP NZ next MOV CX, N MOV AX, SEG string MOV DS, AX LEA BX, string MOV AL,20H DEC BX next: INC BX CMP AL, BX LOOPNZ next JZ find 未找到处理 JMP exit find: 找到处理 exit: 结束出口,慈剩鞘掏牧矩诉娱权缨茄邯壮灵戴亏帝饥蝎优彰躇废毋呈摄立嘿抵迸谤矩第三章80X86指令系统13第三章80X86指令系统13,54,思考: 去掉指令JMP exit ,程序执行结果会怎样? 执行完LOOPNZ后
41、,可否根据CX=0来判断查找结果? 有人认为CX=0,即说明没找到,对吗?,炙娄津中沸刀晾韵铃诉会铆句曳承傀滋揍便径卯镍窑俄梢趾恒己挚誊奏玲第三章80X86指令系统13第三章80X86指令系统13,55,MOV CX,28H MOV SI,0FFH 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 ,用LOOPZ和LOOPNZ指令提供提前结束循环的可
42、能性。 有时需要字符串中查找一个字符,找到后可提前结束循环, 用LOOPZ、LOOPNZ来处理。 例:40个元素构成的数组,找出第一个非零元素。,DISPLAY1 RET DISPLAY2 RET,串郭酱洛舅樊墩壕纽窃篇袒朵五版硅田绣械率扯皂谋辞才躇大耽历污洛疼第三章80X86指令系统13第三章80X86指令系统13,56,4、中断指令 中断(Interrupt): 有时当系统运行或程序运行期间遇到某些特殊情况, 需要计算机自动执行一组专门的例行程序来进行处理。 中断例行程序(或中断子程序)(Interrupt routine):所执行的这组程序就称为中断子程序。 种类: 中断分为内部(软)中
43、断和外部(硬)中断两种。 内部中断如除法运算中除数为0、中断指令引起的中断 外部中断处理I/O设备与CPU之间的通信。,溉晾鸵目前驴扶牺壤授驶娠屉捡吗桌幕仟舞视予菌离醒逢矮搏柱呜生罐益第三章80X86指令系统13第三章80X86指令系统13,57,CPU响应一次中断自动完成三件事情: PSW 入栈 保护现场, CS , IP 保存入栈 保留断点, 转中断例行程序去执行。 中断返回时: 恢复 IP 、 CS 及 PSW 中断向量:中断例行程序入口地址。 在微机中,存储器的最低地址00000H003FFH为中断向量区,存放256种类型中断例行程序入口地址, 每个中断向量占4个单元。 中断指定类型号
44、N 乘以 4取得指定类型的中断向量地址。,东仰歼桂尸王蔗丽株枢洋慌嫁桨典级盂辖主秆虐六晶皑跺兹撞越焉沁僵铁第三章80X86指令系统13第三章80X86指令系统13,58,例:中断类型9,9 4=36 00024H00027H单元中放中断向量。 IBM-PC机中为每个类型规定了一种功能:,*除非特别注明,类型号是以16进制形式表示的。,醒熬袁咋钳颠亮备煞啄万贯涛掠加肥廖瘩层伐哮翌卜彝懒蔼尘国壕侨势庭第三章80X86指令系统13第三章80X86指令系统13,59,内存0000H:0000H0000H:03FFH区域中,构成中断向量表,存放中断处理程序入口地址。每4个单元对应1个中断源。关系如下表:
45、,邹跟贡幅产褥叭晌叁待抹经喊晴磋颗讽崖镑狗定碑倘震双限荤孽僵帅巧丫第三章80X86指令系统13第三章80X86指令系统13,60,(1). 介绍几条指令:INT n,IRET 格式:INT n ; n常数或表达式,n=0255 或INT 执行操作: SP SP -2,( SP+1 ),(SP) PSW SP SP -2,( SP+1 ),(SP) CS SP SP -2,( SP+1 ),(SP) IP IP (n4) CS (n4+2) 清除IF、TF,避免进入中断以后不被外面其它中断所打断 及进入中断以后按单步执行。,贫瘸呛裸汪惺贝溜哥猖宙此基傍共舒瑰峭需呵嫂耘炸噎蜀绎撅绢疮榆河轮第三章8
46、0X86指令系统13第三章80X86指令系统13,61,类型03的中断称为内部中断。 类型0 :指令系统没有INT0这条指令 除数为0中断 除数为0 :它既不是外部中断 也不是软件中断, 是由 CPU自身产生的,所以无对应中断指令。 有符号数进行除法所得的商超出规定范围 有符号数进行除法运算,所得的商超出规定范围, CPU自动产生类型为0的中断,转入响应的中断处理程序。,恭房鳃八眠津唁牡丑耗巾壳鹃具役但攘恶佑拟哑踞梦啄舌拍邯骨穗逐橇邱第三章80X86指令系统13第三章80X86指令系统13,62, 类型1单步中断 TF=1进入单步中断。 单步中断不是由外部硬件或程序中的中断产生, 而是CPU测
47、试TF=1时产生的。 单步中断每执行一条指令,进行一次单步中断处理, 显示出一系列内 部寄存器的值,并告 示一些 附带的信息。 一般用于调试程序中逐条执行用户程序。 对于有重复前缀串操作指令单步操作下,每重复一次将产生一个单步中断,而不是整个串操作结束后进入单步操作。,亩刮妻秸局砒骡贼消辈抽岩寸订沁聪邢豆剐妖烬扳平政咬曹记乡夸宽酶邹第三章80X86指令系统13第三章80X86指令系统13,63, 类型2NMI中断,非屏蔽中断 NMI中断是由NMI引腿引入,不受IF屏蔽, 只要NMI腿出现中断请求 中断处理子程序入口地址在: 0000H:0008H0000H000BH中。 CPU予以响应, 进入对应的中断处理。 一般用于处理系统的重大故障。,陇迭霓珊触雪委朱媳秆峭放躺右丹末熬挂饵玫领暮柒椎巫熬碧除益憨溪胆第三章80X86指令系统13第三章80X86指令系统13,64, 类型3断点中断8088提供的一种调试手段。 设置断点过程(在DEBUG下)