第十章 CALL和RET指令

callret指令都是转移指令,它们都修改CS和IP。经常被共同用于实现子程序的设计。这一章,我们讲解callret指令的原理

10.1 ret和retf

  • ret指令用中的数据,修改IP的内容,从而实现近转移

    • (IP)=((ss)*16+(sp))
    • (sp)=(sp)+2
    • 等于 pop IP
  • retf指令用中的数据,修改CS和IP的内容,从而实现远转移

    • (IP)=((ss)*16+(sp))
    • (sp)=(sp)+2
    • (IP)=((ss)*16+(sp))
    • (sp)=(sp)+2
    • 等于 pop IP,pop CS

10.2 call指令

CPU执行call指令时,进行两步操作:

  • 将当前的IPCS和IP压入栈中
  • 转移

call指令不能实现短转移,除此之外,call与jmp类似。

接下来以转移地址的不同方式为主线,详解call指令

10.3 根据位移进行转移的call指令(段内转移)

  • 格式: call 标号(压入栈,转移到标号)
  • 执行如下操作

    • (sp)=(sp)-2

      ((ss)*16+(sp))=(IP)

    • (IP)=(IP)+16位位移
  • 相当于

    push IP
    jmp near ptr 标号

10.4 根据目的的进行的call指令(段间转移)

  • 格式:call far ptr 标号实现段间转移

  • 执行如下操作:

    • (sp)=(sp)-2
    • ((ss)*16+(sp))=(CS)
    • (sp)=(sp)-2
    • ((ss)*16+(sp))=(IP)
    • (CS)=标号所在段的段地址
    • (IP)=标号所在段的偏移地址
  • 相当于

    push CS
    push IP
    jmp far ptr 标号
  • 注意先丢CS,再丢IP

10.5 转移地址在寄存器的call指令

  • 格式:call 16位reg
  • 功能

    • (sp)=(sp)-2
    • ((ss)*16+(sp))=(IP)
    • (IP)=(16位reg)
  • 相当于

    push IP
    jmp 16位reg

10.6 转移地址在内存的call指令

  • call word ptr 内存单元地址

    • 相当于

      push IP
      jmp word ptr 内存单元地址
  • call dword ptr 内存单元地址

    • 相当于

      push CS
      push IP
      jmp dword ptr 内存单元地址

10.7 call和ret的配合使用

  • call 相当于 函数调用
  • ret 相当于 return

10.8 mul指令(乘法)

mul 是乘法指令
必须都是8位,或是16位

  • 8位:一个放在AL,另一个放在8位reg或内存单元,结果放在AX
  • 16位: 一个放在AX,另一个放在16位reg或内存单元,结果高位放在DX,低位放在AX

10.10 参数和结果传递的问题

  • 用寄存器来存储参数和结果是最常使用的方法

10.11 批量数据的传递

  • 将批量数据的首地址存入寄存器
  • 返回数据的收地存入寄存器

10.12 寄存器冲突的问题

子程序开始:子程序中使用的寄存器入栈

           子程序的内容

           子程序中使用的寄存器出栈

           返回(ret,retf)

[汇编学习笔记][第十章 CALL和RET指令]的更多相关文章

  1. 汇编学习笔记(11)int指令和端口

    格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...

  2. 王爽汇编第十章,call和ret指令

    目录 王爽汇编第十章,call和ret指令 call和ret指令概述: ret和retf ret指令 retf指令 call 和 ret 的配合使用 call指令详解 call原理 call指令所有写 ...

  3. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  4. 交换机安全学习笔记 第九~十章 HSRP VRRP

    HSRP  (Hot Standby Router Protocol) 热备份路由器协议 思科私有 HSRP消息使用UDP 端口号 1985(IPv6时为2029) 使用多播地址 224.0.0.2( ...

  5. 汇编学习笔记(7)call和ret指令

    ret和retf CPU执行ret指令时进行以下两步操作: (IP)=((ss)*16+(sp)) (sp)=(sp)+2 这相当于pop IP CPU执行retf指令时进行以下四步操作: (IP)= ...

  6. 汇编学习笔记(3)[bx]和loop

    本文是<汇编语言>一书的学习笔记,对应书中的4-6章. 汇编程序的执行 要想将源代码变为可执行的程序需经过编译.连接两个步骤,WIN7操作系统下需要MASM程序来进行编译连接工作.将MAS ...

  7. 第十章 Call 和 Ret 指令

    引言 想想程序之间的加载返回过程. call 和 ret 指令都是转移指令,它们都修改 IP,或同时修改 CS 和 IP. call 和 ret 经常被共同用来实现自程序的设计. 这一章,我们讲解 c ...

  8. 汇编学习笔记(AT&T语法)

    一个最基本的汇编程序如下所示: .section .data .section .text .globl _start _start: movl $, %eax # the number 1 is t ...

  9. 汇编学习笔记——DOS及DEBUG介绍

    转自:https://www.shiyanlou.com/courses/running/332 一.课程简介 声明:该课程基于<汇编语言(第2版)>郑晓薇 编著,机械工业出版社.本节实验 ...

随机推荐

  1. sealed 修饰符

    当对一个类应用 sealed 修饰符时,此修饰符会阻止其他类从该类继承. 在下面的示例中,类 B 从类 A 继承,但是任何类都不能从类 B 继承. class A {} sealed class B ...

  2. Android入门2:从GridView控件使用到自定义Adapter

    在日常手机app的使用中,出现频率最高的便是ListView和GridView.ListView的例子是微信主界面,而GridView的例子则是支付宝的主界面,不明白的小伙伴打开手机便一目了然.然而这 ...

  3. java web实现读取指定盘符下的图像(二)

    之前写了一篇文章是关于如何读取指定盘符下的图片,虽然功能可以实现,但是使用的是I/O流的方式,效率不高.现在发现还有一个更好的办法,使用也更加的方便. 我们知道,当我们的图片是放在tomcat下web ...

  4. Objective-C set/get方法

    主要内容set get方法的使用 关键字 @property 全自动生成set get方法 // 类的声名 @interface People : NSObject{ int _age; // 成员变 ...

  5. 5 HBase 常用Shell命令

    进入hbase shell console $HBASE_HOME/bin/hbase shell 如果有kerberos认证,需要事先使用相应的keytab进行一下认证(使用kinit命令),认证成 ...

  6. 14 java 日期处理 joda-time

    http://www.joda.org/joda-time/ 任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完 ...

  7. [Mugeda HTML5技术教程之15]案例分析:制作移动教育课件

    本文档要分析的案例是一个一氧化碳还原氧化铜的教育小课件,从中可以体会一些Mugeda API的用法和使用Mugeda动画制作移动教育课件的方法.Mugeda为移动教育领域和移动数字出版领域提供理想的教 ...

  8. eclipse 将文件夹作为sourcefolder

    文件夹---右键

  9. 滚动页面时DIV到达顶部时固定在顶部

    本示例使用Javascript实现了滚动页面时,DIV到达顶部时固定在顶部.在IE下效果有点闪,效果网址:http://www.keleyi.com/keleyi/phtml/fixdiv.htm 下 ...

  10. Manasa and Stones

    from __future__ import print_function def main(): t = int(raw_input()) for _ in range(t): n = int(ra ...