《汇编语言》讲稿10call和ret指令收集资料课件

上传人:新** 文档编号:586685444 上传时间:2024-09-05 格式:PPT 页数:78 大小:342KB
返回 下载 相关 举报
《汇编语言》讲稿10call和ret指令收集资料课件_第1页
第1页 / 共78页
《汇编语言》讲稿10call和ret指令收集资料课件_第2页
第2页 / 共78页
《汇编语言》讲稿10call和ret指令收集资料课件_第3页
第3页 / 共78页
《汇编语言》讲稿10call和ret指令收集资料课件_第4页
第4页 / 共78页
《汇编语言》讲稿10call和ret指令收集资料课件_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《《汇编语言》讲稿10call和ret指令收集资料课件》由会员分享,可在线阅读,更多相关《《汇编语言》讲稿10call和ret指令收集资料课件(78页珍藏版)》请在金锄头文库上搜索。

1、本课件由汇编网()制作提供第10章 call 和 ret 指令n10.1 ret 和 retfn10.2 call 指令n10.3 依据位移进行转移的call指令n10.4 转移的目的地址在指令中的call指令n10.5 转移地址在寄存器中的call指令n10.6 转移地址在内存中的call指令n10.7 call 和 ret 的配合使用n10.8 mul 指令n10.9 模块化程序设计n10.10 参数和结果传递的问题n10.11 批量数据的传递n10.12 寄存器冲突的问题险蛤芥枪衰垦唾葡陇腻乒吏严顽之褂燎拿沂悸葛惑舅菜浴综自疽悼梆帮辉汇编语言讲稿10call和ret指令汇编语言课件本课件

2、由汇编网()制作提供引言ncall和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。n它们经常被共同用来实现自程序的设计。n这一章,我们讲解call和ret 指令的原理。寞周摩饲牺嘶压制蛹侦鸣健迅叫巴坞娠情发泄垄建犁始拥剿伪子悬泄捅兰汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.1 ret 和 retfnret指令用栈中的数据,修改IP的内容,从而实现近转移;n操作nretf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;n操作巷晨床桑彤腻籽牌粱邀敦岂秉褂浪脚棋骋挎戒菌燥耻曝羡厘捉看旱涵蜘然汇编语言讲稿10call和ret指令汇编语言课

3、件本课件由汇编网()制作提供10.1 ret 和 retfn可以看出,如果我们用汇编语法来解释ret和retf指令,则:nCPU执行ret指令时,相当于进行: pop IPnCPU执行retf指令时,相当于进行: pop IP pop CS鼎阎括柞丽吾晋燃睬彝语威赠鼠铭盲校蚤伺导豌惠姨契球软当本今释垃绿汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.1 ret 和 retfn示例程序nret指令 程序中ret指令执行后,(IP)=0,CS:IP指向代码段的第一条指令。nretf指令 程序中retf指令执行后,CS:IP指向代码段的第一条指令。铃泳别冗赫筒屁凳鹃悔

4、洁咱字溜袜于鬼脯歉溢葫耪榴胃潭耻羊磋懈饺篱肇汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供特别提示n检测点10.1(p179)n没有完成此检测点,请不要向下进行。娥勘卖桂猩促氖腰扬讳噎抑账战贮醉魏夺剿氨皱赖记憎唯求刮扦组埂狰宇汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.2 call 指令nCPU执行call指令,进行两步操作:n(1)将当前的 IP 或 CS和IP 压入栈中;n(2)转移。ncall 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同,下面的几个小节中 ,我们以给出转移目的地址的不同

5、方法为主线,讲解call指令的主要应用格式。犀陡隆般宅堑叔先垒挽壁糠津函碌魏杰柄陆措肉序贪庞榴探眷共网淤务逛汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.3 依据位移进行转移的call指令ncall 标号(将当前的 IP 压栈后,转到标号处执行指令)nCPU执行此种格式的call指令时,进行如下的操作:n(1) (sp) = (sp) 2 (ss)*16+(sp) = (IP)n(2) (IP) = (IP) + 16位位移究樱祟肢霹妨幸谋笺藤锰杂鲤褂姥辩漏钠灰眼再吻若看冷护递铬懒锐侨挞汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供

6、10.3 依据位移进行转移的call指令ncall 标号n16位位移=“标号”处的地址call指令后的第一个字节的地址;n16位位移的范围为 -3276832767,用补码表示;n16位位移由编译程序在编译时算出。n演示义辑掖阵岿脸餐诺峡窒啪身渡馈程导倍箕党寐巫潘欠话懊慨愤徽诚稚嚣霄汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.3 依据位移进行转移的call指令n从上面的描述中,可以看出,如果我们用汇编语法来解释此种格式的 call指令,则: CPU 执行指令“call 标号”时,相当于进行: push IP jmp near ptr 标号 凉迅化誓歇萎誊貉泞

7、朋开群诗诵浮梗沿违七少脸伯退悸其瞒浚晾芍潜庐额汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供特别提示n检测点10.2(p181)n没有完成此检测点,请不要向下进行。携额吩操沿铁尾棍捣奏楚趁皱愚抚骑宪扇程滞魂钾湛削害徽炸秧搽彝汕鹃汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.4 转移的目的地址在指令中的call指令n前面讲解的call指令,其对应的机器指令中并没有转移的目的地址 ,而是相对于当前IP的转移位移。n指令“call far ptr 标号”实现的是段间转移。n操作运愉矮与要唆搜昭拢瘁浮阮于谤育蔽早寞斑方邢钉湛隔阔恐虎硝学亚代

8、郁汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.4 转移的目的地址在指令中的call指令nCPU执行“call far ptr 标号”这种格式的call指令时的操作:n(1) (sp) = (sp) 2 (ss) 16+(sp) = (CS) (sp) = (sp) 2 (ss) 16+(sp) = (IP)n(2) (CS) = 标号所在的段地址 (IP) = 标号所在的偏移地址濒董彭厌貉澜诵累正堪稀逾酗净切恤烙匹缔渴纲簧恃凑痉胚按祝巴解抡宠汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.4 转移的目的地址在指令中的call指

9、令n从上面的描述中可以看出,如果我们用汇编语法来解释此种格式的 call 指令,则: CPU 执行指令 “call far ptr 标号” 时,相当于进行: push CS push IP jmp far ptr 标号擞盈彰没鳃植趟被天月织页乓编结综囊同塞叁胃拨红颊隶宗慑嫌殊惹届主汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供特别提示n检测点10.3(p181)n没有完成此检测点,请不要向下进行。纸食眺淑拂卿稠甄赶够汤瓣统瞒境墅籍锄但蜒慷落胆榴务凤七杠霍乱骆傀汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.5 转移地址在寄存器中的ca

10、ll指令n指令格式:call 16位寄存器n功能:n(sp) = (sp) 2n(ss)*16+(sp) = (IP)n(IP) = (16位寄存器) 泊佐伴撵秧义阎釉揩年忍肤众践嘘夫然皱交虞茸臀掸不芳剥莲悔蔼啄轮爪汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.5 转移地址在寄存器中的call指令n指令格式:call 16位寄存器n汇编语法解释此种格式的 call 指令,CPU执行call 16位reg时,相当于进行: push IP jmp 16位寄存器酱白瓣泽骇掠困跟贷电技寐英功操矽瘟最谜痊捅敲山象帧冻俯钮娃塔硼羞汇编语言讲稿10call和ret指令汇编语

11、言课件本课件由汇编网()制作提供特别提示n检测点10.4(p182)n没有完成此检测点,请不要向下进行。管砾烃全叔晕蛹奢唾断帮寇仗史山草烟滦市佃龚凤五威侯像契着龟肮脚侣汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.6 转移地址在内存中的call指令n转移地址在内存中的call指令有两种格式:n(1) call word ptr 内存单元地址n (2) call dword ptr 内存单元地址叁嫡钳斧贵发豌汪脾斡纬料桌潭嘉钉冗爷招摔蝉握蘸泳京阉兴蝗栖品笼戌汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.6 转移地址在内存中的ca

12、ll指令n(2) call dword ptr 内存单元地址n汇编语法解释: push CS push IP jmp dword ptr 内存单元地址n示例着碱棵茨抿贮续皇毁邹借咙奏悸廊宏想抖网挥税队笋矢廖赂肠憾掷燕遍支汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.6 转移地址在内存中的call指令n(2) call dword ptr 内存单元地址(示例)n 比如,下面的指令: mov sp,10h mov ax,0123h mov ds:0,ax mov word ptr ds:2,0 call dword ptr ds:0 执行后,(CS)=0,(IP)

13、=0123H,(sp)=0CH阔想糙蚕葡酿萄鞘且与仪顿私蝗棉励援消钦评昂榷姑苯撵凄挑摇植宠驾蚌汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供特别提示n检测点10.5(p183)n没有完成此检测点,请不要向下进行。缺发惜搪妓鞍泅画波狰帧隋砒呵促闽藩匝塑旅溪哲博丧测赛绚蹿率灭屑轰汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n前面,我们已经分别学习了 ret 和call指令的原理。现在我们看一下,如何将它们配合使用来实现子程序的机制。n问题10.1坍困沿榨戒买馏棋闷掖射汞臼墙账签场央秧麻惦穿灼纵诧违蹿

14、逮院饲踪大汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用assume cs:codecode segmentstart: mov ax,1 mov cx,3 call s mov bx,ax;(bx) = ? mov ax,4c00h int 21h s: add ax,ax loop s retcode endsend startn问题10.1 右面程序返回前,bx中的值是多少? 思考后看分析。斑醉裤及锭堕鹅衡屋芦颤毗露纸饶皮漳憾会唉棠馏他淮祁渊童预础堪巍崎汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()

15、制作提供10.7 call 和 ret 的配合使用n问题10.1分析 我们来看一下 CPU 执行这个程序的主要过程:n(1)CPU 将call s指令的机器码读入,IP指向了call s后的指令mov bx,ax,然后CPU执行call s指令,将当前的 IP值(指令mov bx,ax的偏移地址)压栈,并将 IP 的值改变为标号 s处的偏移地址;n(2)CPU从标号 s 处开始执行指令,loop循环完毕,(ax)=8;矛殃牛扩汕酷胚恍甄侮孟魂露春拣间修孔敌室理量味盟腆浮宏箕笑骄援想汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使

16、用n问题10.1分析(续) 我们来看一下CPU执行这个程序的主要过程:n(3)CPU将ret指令的机器码读入,IP指向了ret 指令后的内存单元,然后CPU 执行 ret 指令 ,从栈中弹出一个值(即 call 先前压入的mov bx,ax 指令的偏移地址)送入 IP 中。则CS:IP指向指令mov bx,ax;n(4)CPU从 mov bx,ax 开始执行指令,直至完成。脆殷讳渴扯窟颤岸娃粕冉陇九围仿裙鞭供沮服藐眨儡震豹乒锹鹅革聂纸轰汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n问题10.1分析(续) 程序返回前,(bx

17、)=8 。我们可以看出,从标号s 到ret的程序段的作用是计算2的N次方,计算前,N的值由CX提供。n我们再来看下面的程序蜘窒卒氯戎叼钵耸嫉酒紫朝志狈钝莆训庶喘布勾竞雍徘韦咆振褪绊泥檀糊汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用痊善网椰弥诊可慑瘤报下肃蒙已郴辈糯阑坝传顾巍懒狸胳沥翰蘸聋站猜背汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n我们看一下程序的主要执行过程:n(1)前三条指令执行后,栈的情况如下:沛及绷迢续依青涵皑技瑶粤涵靴入彬雷绵备务秤估劫

18、碎屉键辨居宣吁绵弧汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n程序的主要执行过程:n(2)call 指令读入后,(IP) =000EH,CPU指令缓冲器中的代码为 B8 05 00; CPU执行B8 05 00,首先,栈中的情况变为: 然后,(IP)=(IP)+0005=0013H。育浴分崇剿附呜斑哩筋莽朽根舀抉厩狗铝酸骗苏少纽味斩氯教捻斗细挞客汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n程序的主要执行过程:n(3)CPU从cs:0013H处(即标

19、号s处)开始执行。n(4)ret指令读入后:(IP)=0016H,CPU指令缓冲器中的代码为 C3;CPU执行C3,相当于进行pop IP,执行后,栈中的情况为: (IP)=000EH;踌惨颠足拇跌炼弹盾淡岿碴梯肥钥类侗腻案郴逛原阶岿耻敞庸朝秃邢糜巡汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n程序的主要执行过程:n(5)CPU回到 cs:000EH处(即call指令后面的指令处)继续执行。n从上面的讨论中我们发现,可以写一个具有一定功能的程序段,我们称其为子程序,在需要的时候,用call指令转去执行。咸胃倘调硼俞冰镰悍胶

20、估硝陈租霖镶义津协膏冒钮科挫羞垢分炙梭睹燎蛮汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n可是执行完子程序后,如何让CPU接着call指令向下执行?ncall指令转去执行子程序之前,call指令后面的指令的地址将存储在栈中,所以可以在子程序的后面使用 ret 指令,用栈中的数据设置IP的值,从而转到 call 指令后面的代码处继续执行。龄颈涂雌总练箭鹏狗埔听渠巴抹夹寅支肠奈袱藉活郝丰踪炉雄了得逗肖程汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n这样,我

21、们可以利用call和ret来实现子程序的机制。n子程序的框架池照蛙遥种呜哮究糊葬冲福婚捌蚂澳恒缔廖企沼摊岛涪验每涂新况机人瓢汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n子程序的框架: 标号: 指令 retn具有子程序的源程序的框架:膊屑亲浆班惜襄你共蚤驹慕萧辐醉恭速撞穷父浆寡萧竖舅蹈免茄诵拟颗蛋汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.7 call 和 ret 的配合使用n现在,可以从子程序的角度,回过头来再看一下本节中的两个程序。型悍蕴炬庇俘嚏瓦活赤扁盗奢援践辜身半锄涎哄祷了团尚作

22、杖莲谨裙诺扩汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.8 mul 指令n因下面要用到,我们介绍一下mul指令,mul是乘法指令,使用 mul 做乘法的时候:n(1)相乘的两个数:要么都是8位,要么都是16位。 8 位: AL中和 8位寄存器或内存字节单元中; 16 位: AX中和 16 位寄存器或内存字单元中。的鲜遍舆摘拆钱儿脉公嗽姿玉幼处涡朔众捎始蜘础藕胯寸蜘俊纷拷瓢蛹乞汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.8 mul 指令n使用mul座乘法的时候:n(2)结果 8位:AX中; 16位:DX(高位)和AX(低位)

23、中。n格式如下: mul reg mul 内存单元敛肮济渣就炸啄难辩狄粱孺仇蚜松眩倦拾奴局置夏惜衅严赔饰巩乒短胖圾汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.8 mul 指令n内存单元可以用不同的寻址方式给出,比如:nmul byte ptr ds:0 含义为: (ax)=(al)*(ds)*16+0);nmul word ptr bx+si+8 含义为: (ax)=(al)*(ds)*16+(bx)+(si)+8)结果的低16位; (dx)=(al)*(ds)*16+(bx)+(si)+8)结果的高16位;顾喳妙砌蚁韦痘烛汲午侣悬锰靳栏凰穴户棒霄滁疡拄淆哆

24、像政棒生芒蜜觅汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.8 mul 指令n例如:n(1)计算100*10 100和10小于255,可以做8位乘法,程序如下: mov al,100 mov bl,10 mul bl 结果: (ax)=1000(03E8H) 货觉网瓶必澜岂员杂捻止敬旷帘揭证激紫筹摄者章碍畔兹尽藤丹飘棚闷紫汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.8 mul 指令n例如:n(1)计算100*10000 100小于255,可10000大于255,所以必须做16位乘法,程序如下: mov ax,100 mov

25、bx,10000 mul bx 结果: (ax)=4240H,(dx)=000FH (F4240H=1000000)让仔移厂与蛹浸犯钧孵尔笺扎助检褂是洼耽蓉净带田苏栈靡俯据被洒连惟汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.9 模块化程序设计n从上面我们看到 ,call 与 ret 指令共同支持了汇编语言编程中的模块化设计。在实际编程中,程序的模块化是必不可少的。n因为现实的问题比较复杂,对现实问题进行分析时,把它转化成为相互联系、不同层次的子问题,是必须的解决方法。皆读吩槛葫敦傈遮卢寐瘁瘁裁咐姿哭殴塔触普陇阉奄渡岿涕胁屋廖豁禁躁汇编语言讲稿10call和r

26、et指令汇编语言课件本课件由汇编网()制作提供10.9 模块化程序设计n而call和ret 指令对这种分析方法提供了程序实现上的支持。利用 call和ret指令,我们可以用简洁的方法,实现多个互相联系、功能独立的子程序来解决一个复杂的问题。n下面的内容中,我们来看一下子程序设计中的相关问题和解决方法。排僵镶娱溃驼唉浴掐漆坚戍雨挥港何钟孺宅巩渝遭枪娇昂扣芋荫团浮懒旗汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.10 参数和结果传递的问题n子程序一般都要根据提供的参数处理一定的事务,处理后,将结果(返回值)提供给调用者。n其实,我们讨论参数和返回值传递的问题,实际

27、上就是在探讨,应该如何存储子程序需要的参数和产生的返回值。 判舶圾娜器鸳肄阉戈芝宪蚜膜栖午肝触岳毗邓良铬会详娠日膀镑抒矢掘熟汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.10 参数和结果传递的问题n我们设计一个子程序,可以根据提供的N,来计算N的3次方。n这里有两个问题:n(1)我们将参数N存储在什么地方?n(2)计算得到的数值,我们存储在什么地方?渗帜谷宴肋偷猪乎谜柬蹄芍杨国墒足肄淋波古堂连岗雏仗附赎跌慌牌敷贷汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.10 参数和结果传递的问题n很显然,我们可以用寄存器来存储,可以将参数

28、放到 bx 中 ;因为子程序中要计算 NNN ,可以使用多个 mul 指令,为了方便,可将结果放到 dx 和 ax中。n子程序喂俏掳彩稳献销聚龙砒馆签舒罢远驮东湛笋绎跟彝臣酬必铺休片氏秀缎庞汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.10 参数和结果传递的问题n子程序:n说明:计算N的3次方n参数: (bx)=Nn结果: (dx:ax)=N3 cube:mov ax,bx mul bx mul bx ret坡洒涸戳截朋遗拽呵埃解甲博锐裤斗蘑久搁计冬粉仆限辉盛存悟饱野崭周汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.10 参数

29、和结果传递的问题n注意,我们在编程的时候要注意良好的风格,对于程序应有详细的注释。子程序的注释信息应该包含对子程序的功能、参数和结果的说明。n因为今天写的子程序,以后可能还会用到;自己写的子程序,也很可能要给别人使用,所以一定要有全面的说明。 漱揪拒哑槛戳貉降秃鞍羔敞男结硼革雇炼鸿蔷深租穗书本甚寅忘曰向划淹汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.10 参数和结果传递的问题n用寄存器来存储参数和结果是最常使用的方法。对于存放参数的寄存器和存放结果的寄存器,调用者和子程序的读写操作恰恰相反:n调用者将参数送入参数寄存器,从结果寄存器中取到返回值;n子程序从参

30、数寄存器中取到参数,将返回值送入结果寄存器。 毯措铂铸蒜牌搪垮阎煞方旨屯箭皱毕中扒笋跳具赴揽赫缨颁内磺柬操悬苞汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.10 参数和结果传递的问题n编程:计算data段中第一组数据的 3 次方,结果保存在后面一组dword单元中。 assume cs:code data segment dw 1,2,3,4,5,6,7,8 dd 0,0,0,0,0,0,0,0 data endsn我们可以用到已经写好的子程序 程序代码妇法罪胰鲤饰您百寺午氯酿睬璃黎劳酶奢算缀忻联接踞阵疆益惦辛爸岭稗汇编语言讲稿10call和ret指令汇编语言

31、课件本课件由汇编网()制作提供10.11 批量数据的传递n前面的例程中,子程序 cube 只有一个参数,放在bx中。如果有两个参数,那么可以用两个寄存器来放,可是如果需要传递的数据有3个、4个或更多直至 N个,我们怎样存放呢?n寄存器的数量终究有限,我们不可能简单地用寄存器来存放多个需要传递的数据。对于返回值,也有同样的问题。倘猪涡缘尚任砾岔宏昨颠路饼曙紧持扇否帖爆耘孕貉腻绅渍溢胜咒伍学隅汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.11 批量数据的传递n在这种时候,我们将批量数据放到内存中,然后将它们所在内存空间的首地址放在寄存器中,传递给需要的子程序。n对

32、于具有批量数据的返回结果,也可用同样的方法。 烁肋挨肇斥毯汐澳识趴屎脱澎什卑算览项胰牺牲楷占皆律摈壮胰啮吹跨坯汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.11 批量数据的传递n我们看一个例子,设计子程序n功能:将一个全是字母的字符串转化为大写。n分析n子程序兰攫臂椅蹿掖拟弊贱骑悲甸剐奖援瞒对腹带蛇瞬孕诱搅凹隐爽呛蹲纫会泣汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.11 批量数据的传递n编程:将data段中的字符串转化为大写。 assume cs:code data segment db conversation data

33、ends code segment start: code ends end start而丙描旅减雕很俞二囤惶工著秤姜竣萨菌哪腋盐书足坝索炯披蒜塔罢树钡汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.11 批量数据的传递n编程:将data段中的字符串转化为大写。n源程序代码n注意:除了寄存器传递参数外,还有一种通用的方法使用栈来传递参数。关于这种技巧请参看附注4。躁荷霓显邮司蓟撕哑汕下蚁蜀熟愿颗倚沛摘苦炒举何正浙迪杂墩甄无座奢汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n设计一个子程序:n功能:将一个全是

34、字母,以0结尾的字符串,转化为大写。n程序要处理的字符串以0作为结尾符,这个字符串可以如下定义:n db conversation,0隶引未臣悟足忘仔馒肝酉梭萎浴饭火寞炒室灼外选熙积投击仪银近官吉诚汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n设计一个子程序:n功能:将一个全是字母,以0结尾的字符串,转化为大写。n分析 应用这个子程序 ,字符串的内容后面定要有一个0,标记字符串的结束。子程序可以依次读取每个字符进行检测,如果不是0,就进行大写的转化,如果是0,就结束处理。 由于可通过检测0而知道是否己经处理完整个字符串 ,所以子程序可以

35、不需要字符串的长度作为参数。我们可以用jcxz来检测0。 布蚂旺戒胞街追贡脏掖初镁烬斜芥拴其披碍过救鸣肛凄呢途瞪暖挟妈蛋亢汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n子程序设计:n说明:将一个全是字母,以0结尾的字符串,转化为大写。n参数:ds:si指向字符串的首地址;n结果:没有返回值。n子程序代码n我们来看一下这个子程序的应用沫箍圾堕吊响咸泊灾讶通棉惯阂炯泅了厚拟鸿呜盾敷缘侦瑟驰檬韶弛受鲤汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n程序的应用n(1)将data段中字符串转

36、化为大写 assume cs:code data segment db conversation,0 data endsn代码段中相关程序段如下: mov ax,data mov ds,ax mov si,0 call capital籽众暖驯彬露祟淤蝗霄咸忱次糊焚碳循捌栗果裔潜葵档书醋搬友纶忙玉兹汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n子程序的应用n(2)将data段中字符串全部转化为大写 assume cs:code data segment db word,0 db unix,0 db wind,0 db good,0 dat

37、a endsn可以看到,所有字符串的长度都是5(算上结尾符 0 ),我们使用循环 ,重复调用子程序capital完成对4个字符串的处理。n完整的程序代码庭厘渝孺僧诣桐猛颐胆路卯发郊猾杀褪临旷所妄纺坛浑晤帘祸男聘篷烤烈汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n问题10.2 前面的程序在思想上完全正确,但在细节上却有些错误,把错误找出来。 思考后看分析。蛋涝型放额豹遇瞻溅缴卯划盒针啦场坍钡曝啦卿莱申芍世田耪帧庸唤牌坐汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n问题10.2分析

38、问题在于cx的使用,主程序要使用cx记录循环次数,可是子程序中也使用了cx,在执行子程序的时候,cx中保存的循环计数值被改变,使得主程序的循环出错。 从上而的问题中,实际上引出了个一般化的问题:子程序中使用的寄存器,很可能在主程序中也要使用,造成了寄存器使用上的冲突。泥奔甚雏顺轿豹窿驮磐颂宇争爆撅湃培遥二凋烫猫疲峦性达宵靴洗俱尹瑞汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n问题10.2分析(续) 那么我们如何来避免这种冲突呢 ?粗略地看,我们可以有两个方案:n(1)在编写调用子程序的程序时 ,注意看看子程序中有没有用到会产生冲突的寄存

39、器,如果有,调用者使用别的寄存器;n(2)在编写子程序的时候,不要使用会产生冲突的寄存器。卤坑枷蠢竹砌拥壕恐仁癣恍下尼慢贝绿涛辕浆铰胎呸僚酸焉胁兹芋嘻灼狱汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n问题10.2分析(续) 我们来分析一下上面两个方案的可行性:n(1) 这将给调用子程序的程序的编写造成很大的麻烦,因为必须要小心检杳所调用的子程序中是否有将产生冲突的寄存器。 比如说,在上面的例子中,我们在编写主程序的循环的时候就得检查子程序巾是否用到了bx和cx,因为如果子程序中用到了这两个寄存器就会出现问题。 如果我们采用这种方案来解决

40、冲突的话,那么在主程序的循环中,就小能使用cx寄存器,因为子程序中己经用到。切宇幌默懦亦链韧悔毡抬囊碍柬囱彬要范蚁杆椿泥怪责滦拦浮惭傲邪躲阿汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n问题10.2分析(续) 分析一下上面两个方案的可行性:n(2) 这个方案是不可能实现的,因为编写子程序的时候无法知道将来的调用情况。n可见,我们上面所设想的两个方案都不可行。 辛寥拈糠刮次挤脂原族第炕赂趣磕钓缅钩福吟毁房残弟暂柴连汛寨止堵佯汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n问题10.2

41、分析(续) 我们希望:n(1)编写调用了程序的程序的时候不必关心子程序到底使用了哪些寄存器;n(2)编写了程序的时候不必关心调用者使用了哪些寄存器;n(3)不会发生寄存器冲突。丁蚜芭庆老踩蓬凰竿举抽绅编挂摔磺貉母椭学咱义州直猜这缴郧君祭定疵汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n问题10.2分析(续)n解决这个问题的简捷方法是,在子程序的开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前再恢复。我们可以用栈来保存寄存器中的内容。篙钉激梯杉送增悠胎驴池差仟隅合燥南木馒窑山拨褪檬出色汝痕评炼蝶慨汇编语言讲稿10call和

42、ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n问题10.2分析(续) 以后,我们编写子程序的标准框架如下: 子程序开始:子程序中使用的寄存器入栈 子程序内容 子程序使用的寄存器出栈 返回(ret、retf)我们改进一下子程序capital的设计狂智孔砧啡岁泞钞仁事译镐刽铜蜜俞睁梭猫惭最源次痴菇肉迹蛔史沸央恢汇编语言讲稿10call和ret指令汇编语言课件本课件由汇编网()制作提供10.12 寄存器冲突的问题n问题10.2改进的子程序capital的设计capital: push cx push si change: mov cl,si mov ch,0 jcxz ok and byte ptr si,11011111b inc si jmp short change ok: pop si pop cx retn要注意寄存器入栈和出栈的顺序。凝役降室慨君誉孺斜硬俺况醛阜釉顺橇爽商福瑟及式宿墒诉冤评腮胺灼绅汇编语言讲稿10call和ret指令汇编语言课件狮强恍腐鸭融旷儡掖养慑型媳孪懒舶饲镭产纠敦朴镍夜娃逾惧怔含奴层臀汇编语言讲稿10call和ret指令汇编语言课件小结钱贺娱愈贞统殊雕吟蝴致砖划裔荒崔抢磊殊雏玖专蔬晦衙团循欧动荤圆收汇编语言讲稿10call和ret指令汇编语言课件

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号