010第十章Call和Ret指令概要.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
010第十章Call和Ret指令概要

第十章 Call 和 Ret 指令 目 录 10.1 ret 和 retf 10.2 call 指令 10.3 依据位移进行转移的call指令 10.4 转移的目的地址在指令中的call指令 10.5 转移地址在寄存器中的call指令 10.6 转移地址在内存中的call指令 10.7 call 和 ret 的配合使用(使程序的調和返回成為可能) 10.8 mul 指令 10.9 模块化程序设计 10.10 参数和结果传递的问题 10.11 批量数据的传递 10.12 寄存器冲突的问题 引 言 想想程序之间的加载返回过程(cmd-debug)。 call和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现自程序的设计。这一章,我们讲解call和ret 指令的原理。 10.1 ret 和 retf (一)ret指令用栈中的数据,修改IP的内容,从而实现近转移! CPU执行ret指令时,进行下面两步操作: (1)(IP)=((ss)*16+(sp)) (2)(sp)=(sp)+2 (二)retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移; CPU执行retf指令时,进行下面两步操作: (1)(IP)=((ss)*16+(sp)) (2)(sp)=(sp)+2 (3)(CS)=((ss)*16+(sp)) (4)(sp)=(sp)+2 可以看出,如果我们用汇编语法来解释ret和retf指令,则: CPU执行ret指令时,相当于进行:pop IP CPU执行retf指令时,相当于进行: pop IP pop CS 分析源码ret指令: assume cs:codesg stack segment db 16 dup (0) stack ends codesg 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 ;pop值給ip codesg ends end start 程序中ret指令执行后,(IP)=0,CS:IP指向代码段的第一条指令。 retf指令: assume cs:codesg stack segment db 16 dup (0) stack ends codesg segment mov ax,4c00h int 21h start: mov ax,stack mov ss,ax mov sp,16 mov ax,0 push cs push ax mov bx,0 retf codesg ends end start 程序中retf指令执行后,CS:IP指向代码段的第一条指令。 检测点10.1 10.2 call 指令 call指令经常跟ret指令配合使用,因為CPU执行call指令,进行两步操作: (1)将当前的 IP 或 CS和IP 压入栈中; (2)转移(jmp)。 call 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同。 下面的几个小节中 ,我们以给出转移目的地址的不同方法为主线,讲解call指令的主要应用格式。 10.3 依据位移进行转移的call指令 call 标号(将当前的 IP 压栈后,转到标号处执行指令) CPU执行此种格式的call指令时,进行如下的操作: (1) (sp) = (sp) – 2 ((ss)*16+(sp)) = (IP) (2) (IP) = (IP) + 16位位移 call 标号 16位位移=“标号”处的地址-call指令后的第一个字节的地址; 16位位移的范围为 -32768~32767,用补码表示; 16位位移由编译程序在编译时算出。 演示 从上面的描述中,可以看出,如果我们用汇编语法来解释此种格式的 call指令,则: CPU 执行指令“call 标号”时,相当于进行: push IP jmp near ptr 标号 检测点10.2 10.4 转移的目的地址在指令中的call指令 前面讲解的call指令,其对应的机器指令中并没有转移的目的地址 ,而是相对于当前IP的转移位移。 指令“call far ptr 标号”实现的是段间转移。 CPU执行“call far ptr 标号”这种格式的call指令时的操作: (1) (sp) = (sp) – 2 ((ss) ×16+(sp)) = (CS) (sp)

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档