zoukankan      html  css  js  c++  java
  • [汇编学习笔记][第十章 CALL和RET指令]

    第十章 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)
  • 相关阅读:
    centos 7 nginx 安装
    搭建Nuget.Server push时,"Failed to process request. 'Method Not Allowed'"
    Failed to create prime the NuGet cache
    Centos 7 安装 Visual stdio Code
    diskpart 格式化u盘 制作u盘启动盘方法
    sql server 2012 数据库日志文件过大,怎么缩小?
    浏览器同源政策及其规避方法
    redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
    php的闭包
    hash一致性算法
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480517.html
Copyright © 2011-2022 走看看