call和ret指令PPT教学课件_第1页
call和ret指令PPT教学课件_第2页
call和ret指令PPT教学课件_第3页
call和ret指令PPT教学课件_第4页
call和ret指令PPT教学课件_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、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页/共33页例1 下面程序ret指令执行后,CS:IP指向? assume cs:code stack segment db 16 dup (0) stack ends code segment mov ax,4c00h int 21h st

2、art: mov ax,stack mov ss,ax mov sp,16 mov ax,0 push ax mov bx,0 ret code ends end start第2页/共33页例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,16mov ax,0push cspush axmov bx,0retf code ends end sta

3、rt第3页/共33页检测点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第4页/共33页call指令 格式: call 标号 call far ptr 标号 call reg call word ptr mem call dword ptr mem第5页/共

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

5、令 操作: (sp)=(sp)-2 (ss)*16+(sp)=(CS) (sp)=(sp)-2 (ss)*16+(sp)=(IP) (CS)=标号所在段的段地址 (IP)=标号在段中的偏移地址 检测点10.3相当于Push csPush ipJmp far ptr 标号第7页/共33页call指令(续)call reg 转移地址在寄存器中的call指令 功能:将当前的IP压栈后,转到寄存器中所存放的偏移地址处执行指令 操作: (sp)=(sp)-2 (ss)*16+(sp)=(IP) (IP)=(16位寄存器) 检测点10.4第8页/共33页call指令(续) 转移地址在内存单元中的call指

6、令 格式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第9页/共33页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第10页/共33页call和ret的配合使用 问题10.1

7、 下面程序返回前,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第11页/共33页考虑下面程序的执行过程:第12页/共33页执行过程为: 前四条指令依次执行 call s读入后,(IP)=000Eh,指令缓冲器中机器码为:E8 05 00,执行后,当前IP压栈, (IP)= 0013h cpu从0013处开始执行程序 ret指令读入后,(IP)=

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

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

10、: mov al,100 mov bl,10 mul bl 例2:计算10010000 程序如下: mov ax,100 mov bx,10000 mul bx第18页/共33页模块化程序设计参数和结果传递的问题 设计子程序,根据提供的N,计算N的3次方 分析: 两个问题:参数N的存储位置;结果的存储位置 子程序设计如下: ;说明:计算N的3次方 ;参数:(bx)=N ;结果:(dx:ax)=N3 cube: mov ax,bx mul bx mul bx ret 结论:可以用寄存器来存放单个的参数和结果第19页/共33页编程:计算data段中第一组数据的3次方,结果保存在后面的一组dword

11、单元中 assume cs:code data segment dw 1,2,3,4,5,6,7,8 dd 0,0,0,0,0,0,0,0 data ends第20页/共33页批量数据的传递 多个参数或结果传递的情况,将批量数据存放到内存中,然后将其所在内存空间的首地址放在寄存器中,传递给需要的子程序。 例如:设计一个子程序,实现将一个全是字母的字符串转化为大写 子程序可以写作: capital : and byte ptr si,11011111b inc si loop capital ret 主程序: 传递批量数据的方法二:使用栈传递第21页/共33页寄存器冲突的问题 设计一个子程序,将

12、一个全是字母,以0结尾的字符串,转换为大写 假设字符串如下定义: db conversation,0 子程序定义如下:第22页/共33页子程序的应用 将data段中字符串转换为大写 assume cs:code data segment db conversation,0 data ends 最终完成代码: mov ax,data mov ds,ax mov si,0 call capital第23页/共33页子程序的应用(续) 将下面data段中的字符串全部转换为大写 assume cs:code data segment db word,0 db unix,0 db wind,0 db g

13、ood,0 data ends 完整的程序:第24页/共33页问题10.2 上面程序的错误: cx的使用发生冲突 如何避免冲突 编写主程序时,不要使用会和调用的子程序冲突的寄存器 编写子程序时,不要使用会产生冲突的寄存器 解决的办法:在子程序开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前再恢复。可以使用栈来保存这些寄存器的内容。第25页/共33页编写子程序的标准框架 子程序开始:子程序中使用的寄存器入栈 子程序内容 子程序中使用的寄存器出栈 返回(ret,retf)第26页/共33页改进的子程序capital 注意:寄存器入栈和出栈的顺序第27页/共33页传递批量数据的方法二:使用栈传递 在主程序里把参数地址保存到堆栈中,在子程序中从堆栈取出参数以达到传递参数的目的。 例如:设计一个子程序,计算(a-b)3,其中a,b为word型数据 主程序为:mov ax,1 ;b=1 push ax mov ax,3 ;a=3 push ax call difcube第28页/共33页传递批量数据的方法二:使用栈传递 子程序设计如下: ;说明:计算(a-b)3,a、b为word型数据 ;参数,进入子程序时,栈顶放IP,后面依次是a、b ;结果:(dx:ax)= (a-b)3 Difcube: push bp mov

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论