第十章call和ret指令.ppt

上传人:本田雅阁 文档编号:2918060 上传时间:2019-06-05 格式:PPT 页数:34 大小:207.52KB
返回 下载 相关 举报
第十章call和ret指令.ppt_第1页
第1页 / 共34页
第十章call和ret指令.ppt_第2页
第2页 / 共34页
第十章call和ret指令.ppt_第3页
第3页 / 共34页
第十章call和ret指令.ppt_第4页
第4页 / 共34页
第十章call和ret指令.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《第十章call和ret指令.ppt》由会员分享,可在线阅读,更多相关《第十章call和ret指令.ppt(34页珍藏版)》请在三一文库上搜索。

1、第十章 call和ret指令,转移指令,本章要点,ret和retf指令 call指令的各种格式 模块化程序设计 参数传递的方法,ret和retf,ret指令:用栈中的数据修改IP的内容 执行的操作: (ip)=(ss)*16+(sp) (sp)=(sp)+2 retf指令:用栈中的数据修改CS和IP的内容 执行的操作: (ip)=(ss)*16+(sp) (sp)=(sp)+2 (cs)=(ss)*16+(sp) (sp)=(sp)+2,=POP IP,=POP IP =POP CS,例1 下面程序ret指令执行后,CS:IP指向?,assume cs:code stack segment d

2、b 16 dup (0) stack ends code segment mov ax,4c00h int 21h start: mov ax,stack mov ss,ax mov sp,16 mov ax,0 push ax mov bx,0 ret code ends end start,例2 下面程序中retf指令执行后,CS:IP指向?,assume cs:code stack segment db 16 dup (0) stack ends code segment mov ax,4c00h int 21h start:mov ax,stack mov ss,ax mov sp,1

3、6 mov ax,0 push cs push ax mov bx,0 retf code ends end start,检测点10.1,补全程序实现从内存1000:0处开始执行指令 assume cs:code stack segment db 16 dup (0) stack ends code segment start:mov ax,stack mov ss,ax mov sp,16 mov ax, _ push ax mov ax, _ push ax retf code ends end start,call指令,格式: call 标号 call far ptr 标号 call r

4、eg call word ptr mem call dword ptr mem,call指令(续)call 标号,依据位移进行转移的call指令 功能:将当前的IP压栈后,转到标号处执行指令 操作: (sp)=(sp)-2 (ss)*16+(sp)=(IP) (IP)=(IP)+16位位移 说明: 16位位移=“标号”处的地址-call指令后第一个字节的地址 16位位移的范围是转移到段内的任意位置 16位位移是由编译程序在编译时算出 检测点10.2,相当于 Push ip Jmp near ptr 标号,call指令(续)段间直接转移,格式:call far ptr 标号 转移的目的地址在指令

5、中的call指令 功能:将当前的CS和IP压栈后,转到标号处执行指令 操作: (sp)=(sp)-2 (ss)*16+(sp)=(CS) (sp)=(sp)-2 (ss)*16+(sp)=(IP) (CS)=标号所在段的段地址 (IP)=标号在段中的偏移地址 检测点10.3,相当于 Push cs Push ip Jmp far ptr 标号,call指令(续)call reg,转移地址在寄存器中的call指令 功能:将当前的IP压栈后,转到寄存器中所存放的偏移地址处执行指令 操作: (sp)=(sp)-2 (ss)*16+(sp)=(IP) (IP)=(16位寄存器) 检测点10.4,cal

6、l指令(续),转移地址在内存单元中的call指令 格式1:call word ptr mem 操作:push IP jmp word ptr mem 例:mov sp,10h mov ax,0123h mov ds:0,ax call word ptr ds:0,call指令(续),格式2:call dword ptr mem 操作:push cs push IP jmp dword ptr mem 例:mov sp,10h mov ax,0123h mov ds:9,ax mov word ptr ds:2,0 call dword ptr ds:0 检测点10.5,call和ret的配合使

7、用,问题10.1 下面程序返回前,bx中的值是多少? assume cs:code code segment start: mov ax,1 mov cx,3 call s mov bx,ax mov ax,4c00h int 21h s:add ax,ax loop s ret code ends end start,(bx)=8,考虑下面程序的执行过程:,执行过程为:,前四条指令依次执行 call s读入后,(IP)=000Eh,指令缓冲器中机器码为:E8 05 00,执行后,当前IP压栈, (IP)= 0013h cpu从0013处开始执行程序 ret指令读入后,(IP)=0016h,指

8、令缓冲器中机器码为C3,执行后,(IP)=000Eh cpu回到cs:000Eh处继续执行,结论,可以写一个具有一定功能的程序段,称为子程序。需要的时候,用call指令转去执行,在子程序的后面使用ret指令,用call指令所存放在栈中的指令的地址去设置IP的值,从而转到call指令后面的代码处继续执行。,call和ret配合实现子程序机制,子程序框架: 标号: 指令 ret,call和ret配合实现子程序机制,具有子程序的源程序框架: assume cs:code code segment main: : : call sub1 : mov ax,4c00h int 21h sub1: : :

9、 call sub2 : ret sub 2: : : ret code ends end main,mul乘法指令无符号数乘法,mul指令:两操作数指令 功能:完成两个数的相乘 两个数要么都是8位,要么都是16位 若为8位,则一个默认在al中,另一个可以在一个8位寄存器中,也可以是一个字节单元,结果默认放在ax中 若为16位,一个默认放在ax中,另一个在一个16位寄存器中或一个字单元中,结果高位默认放在dx中,低位放在ax中 格式:mul reg/mem,乘法运算指令,例1:计算10010 程序如下: mov al,100 mov bl,10 mul bl 例2:计算10010000 程序如

10、下: mov ax,100 mov bx,10000 mul bx,模块化程序设计参数和结果传递的问题,设计子程序,根据提供的N,计算N的3次方 分析: 两个问题:参数N的存储位置;结果的存储位置 子程序设计如下: ;说明:计算N的3次方 ;参数:(bx)=N ;结果:(dx:ax)=N3 cube: mov ax,bx mul bx mul bx ret 结论:可以用寄存器来存放单个的参数和结果,编程:计算data段中第一组数据的3次方,结果保存在后面的一组dword单元中,assume cs:code data segment dw 1,2,3,4,5,6,7,8 dd 0,0,0,0,0

11、,0,0,0 data ends,批量数据的传递,多个参数或结果传递的情况,将批量数据存放到内存中,然后将其所在内存空间的首地址放在寄存器中,传递给需要的子程序。 例如:设计一个子程序,实现将一个全是字母的字符串转化为大写 子程序可以写作: capital : and byte ptr si,11011111b inc si loop capital ret 主程序: 传递批量数据的方法二:使用栈传递,寄存器冲突的问题,设计一个子程序,将一个全是字母,以0结尾的字符串,转换为大写 假设字符串如下定义: db conversation,0 子程序定义如下:,子程序的应用,将data段中字符串转换

12、为大写 assume cs:code data segment db conversation,0 data ends 最终完成代码: mov ax,data mov ds,ax mov si,0 call capital,子程序的应用(续),将下面data段中的字符串全部转换为大写 assume cs:code data segment db word,0 db unix,0 db wind,0 db good,0 data ends 完整的程序:,问题10.2,上面程序的错误: cx的使用发生冲突 如何避免冲突 编写主程序时,不要使用会和调用的子程序冲突的寄存器 编写子程序时,不要使用会产

13、生冲突的寄存器 解决的办法:在子程序开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前再恢复。可以使用栈来保存这些寄存器的内容。,编写子程序的标准框架,子程序开始:子程序中使用的寄存器入栈 子程序内容 子程序中使用的寄存器出栈 返回(ret,retf),改进的子程序capital,注意:寄存器入栈和出栈的顺序,传递批量数据的方法二:使用栈传递,在主程序里把参数地址保存到堆栈中,在子程序中从堆栈取出参数以达到传递参数的目的。 例如:设计一个子程序,计算(a-b)3,其中a,b为word型数据 主程序为:mov ax,1 ;b=1 push ax mov ax,3 ;a=3 push

14、 ax call difcube,传递批量数据的方法二:使用栈传递,子程序设计如下: ;说明:计算(a-b)3,a、b为word型数据 ;参数,进入子程序时,栈顶放IP,后面依次是a、b ;结果:(dx:ax)= (a-b)3 Difcube: push bp mov bp,sp mov ax,bp+4 sub ax,bp+6 mov bp,ax mul bp mul bp pop bp ret 4,ret n的含义为:pop ip add sp,n,程序执行过程中栈的变化,本章总结,ret和retf指令 call指令的各种格式 模块化程序设计方法 参数传递的方法 单个参数传递的方法 批量参数的传递方法,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1