zoukankan      html  css  js  c++  java
  • 王爽《汇编语言》第三版 第十章 call和ret指令

    引言

      call和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现自程序的设计。

    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

      CPU执行ret指令时,相当于进行:
        pop IP
      CPU执行retf指令时,相当于进行:
        pop IP
        pop CS


    10.2 call 指令

      call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作:
      1.将当前的 IP 或 CS和IP 压入栈中
      2.转移(jmp)

    10.3 依据位移进行转移的call指令

      call 指令不能实现短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同。
      call 标号(将当前的 IP 压栈后,转到标号处执行指令)
      CPU 执行指令“call 标号”时,相当于进行:
        push IP
        jmp near ptr 标号


    10.4 转移的目的地址在指令中的call指令

      call far ptr 标号(实现的是段间转移)
      CPU 执行指令 “call far ptr 标号” 时,相当于进行:
        push CS
        push IP
        jmp far ptr 标号


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

      call 16位寄存器
      CPU执行指令“call 16位寄存器”时,相当于进行:
        push IP
        jmp 16位寄存器


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

      转移地址在内存中的call指令有两种格式:

      1.call word ptr 内存单元地址:

        push IP
        jmp word ptr 内存单元地址

      2.call dword ptr 内存单元地址:

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


    10.7 call 和 ret 的配合使用


    10.8 mul 指令

    mul是乘法指令。
      相乘的两个数:要么都是8位,要么都是16位。
      1.8 位: 乘数位于AL中和 8位寄存器或内存字节单元中,结果位于AX中;
      2.16 位: 乘数位于AX中和 16 位寄存器或内存字单元中,结果位于DX(高位)和AX(低位)中。

      内存单元可以用不同的寻址方式给出,比如:
        mul byte ptr ds:[0]
        含义为: (ax)=(al)*((ds)*16+0);

        mul word ptr [bx+si+8]
        含义为:
          (ax)=(al)*((ds)*16+(bx)+(si)+8)结果的低16位;
          (dx)=(al)*((ds)*16+(bx)+(si)+8)结果的高16位;


    10.9 模块化程序设计


    10.10 参数和结果传递的问题


    10.11 批量数据的传递


    10.12 寄存器冲突的问题

    参考资料:《小甲鱼汇编零基础入门》

     

         《汇编语言》第三版

  • 相关阅读:
    Scrapy 扩展中间件: 针对特定响应状态码,使用代理重新请求
    Scrapy 扩展中间件: 同步/异步提交批量 item 到 MySQL
    Scrapy 隐含 bug: 强制关闭爬虫后从 requests.queue 读取的已保存 request 数量可能有误
    Scrapyd 改进第二步: Web Interface 添加 STOP 和 START 超链接, 一键调用 Scrapyd API
    简单示例理解神闭包
    ejs 模板使用方法
    我使用的开源组件汇总,以备学习使用
    了不起的Node.js--之五 TCP连接
    Windows7下Java运行时环境搭建
    了不起的Node.js--之四
  • 原文地址:https://www.cnblogs.com/mubu/p/6379524.html
Copyright © 2011-2022 走看看