当前位置: 首页 > news >正文

Call指令和Ret指令讲解02 - 零基础入门学习汇编语言49

第十章:Call指令和Ret指令讲解02

 

让编程改变世界

Change the world by program


 

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

  前面讲解的call指令,其对应的机器指令中并没有转移的目的地址 ,而是相对于当前IP的转移位移。 指令“call far ptr 标号”实现的是段间转移。  

CPU执行“call far ptr 标号”这种格式的call指令时的操作:

(1)

(sp) = (sp) – 2

((ss) ×16+(sp)) = (CS)

(sp) = (sp) – 2

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

(2)

(CS) = 标号所在的段地址

(IP) = 标号所在的偏移地址

  从上面的描述中可以看出,如果我们用汇编语法来解释此种格式的 call 指令,则: CPU 执行指令 “call far ptr 标号” 时,相当于进行:

push CS

push IP

jmp far ptr 标号

 

检测点10.3

 

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

  格式:call 16位寄存器 功能:

(sp) = (sp) – 2

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

(IP) = (16位寄存器)

汇编语法解释此种格式的 call 指令,CPU执行call 16位reg时,相当于进行:

push IP

jmp 16位寄存器

 

检测点10.4

 

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

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

(1) call word ptr 内存单元地址

(2) call dword ptr 内存单元地址

(1) call word ptr 内存单元地址

汇编语法解释:

push IP

jmp word ptr 内存单元地址

比如下面的指令:

mov sp,10h

mov ax,0123h

mov ds:[0],ax

call word ptr ds:[0]

执行后, (IP)=0123H,(sp)=0EH  

(2) call dword ptr 内存单元地址

汇编语法解释:

push CS

push IP

jmp dword ptr 内存单元地址

比如,下面的指令:

mov sp,10h

mov ax,0123h

mov ds:[0],ax

mov word ptr ds:[2],0

call dword ptr ds:[0]

执行后, (CS)=0,(IP)=0123H,(sp)=0CH  

检测点10.5

 

call指令和ret指令的配合使用

  前面,我们已经分别学习了 ret 和call指令的原理。现在我们看一下,如何将它们配合使用来实现子程序的机制。  

问题10.1

右面程序返回前,bx中的值是多少? 思考后看分析。 [codesyntax lang="asm"]
assume cs:code

code segment
start:	
    mov ax,1
    mov cx,3
    call s
    mov bx,ax    ;(bx) = ?
    mov ax,4c00h
    int 21h
s:  add ax,ax
    loop s
    ret
code ends

end start
[/codesyntax]  

问题10.1分析

  我们来看一下 CPU 执行这个程序的主要过程: (1)CPU 将call s指令的机器码读入,IP指向了call s后的指令mov bx,ax,然后CPU执行call s指令,将当前的 IP值(指令mov bx,ax的偏移地址)压栈,并将 IP 的值改变为标号 s处的偏移地址; (2)CPU从标号 s 处开始执行指令,loop循环完毕,(ax)=8; (3)CPU将ret指令的机器码读入,IP指向了ret 指令后的内存单元,然后CPU 执行 ret 指令 ,从栈中弹出一个值(即 call 先前压入的mov bx,ax 指令的偏移地址)送入 IP 中。则CS:IP指向指令mov bx,ax; (4)CPU从 mov bx,ax 开始执行指令,直至完成。   因此,程序返回前,(bx)=8 。我们可以看出,从标号s 到ret的程序段的作用是计算2的N次方,计算前,N的值由CX提供。 我们再来看下面的程序 [caption id="attachment_370" align="aligncenter" width="300"] Call指令和Ret指令讲解[/caption] 请大家课后从栈的角度来分析call s和ret的过程。 也就是把栈画出来,栈指针画出来,栈数据填进去……观察CPU如何利用栈来实现call指令和ret指令。 [buy]  获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LGSDUDLFVFPB']视频下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2011/01/22/3847015.html

相关文章:

  • dubbo 入门
  • CentOS下rpm包与yum安装与卸载 更新系统源
  • Angular Service入门
  • 利用Jsoup解析HTML
  • 开源yYmVc项目,邀您和我一起开发:)
  • 家庭网络互联技术发展趋势探讨
  • 在ASP.NET MVC 3上使用依赖注入更加容易了
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Kafka集群磁盘使用率瞬超85%,幕后元凶竟是它?
  • 如何挑选服务器?哪个牌子的最好?(1万元以下的)
  • SNMP、ASN.1、MIB之间的关系
  • Oracle浅谈之逻辑体系第一回
  • 迁移TFS2008后,项目门户网站及Team Explorer的报表均无法正常显示的原因
  • Word编辑故障经典问答
  • java 是否输出是整数
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Gradle 5.0 正式版发布
  • java中具有继承关系的类及其对象初始化顺序
  • JS 面试题总结
  • js继承的实现方法
  • JS实现简单的MVC模式开发小游戏
  • node和express搭建代理服务器(源码)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Puppeteer:浏览器控制器
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 翻译--Thinking in React
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 使用parted解决大于2T的磁盘分区
  • 手写双向链表LinkedList的几个常用功能
  • 学习ES6 变量的解构赋值
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用jquery写贪吃蛇
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • #14vue3生成表单并跳转到外部地址的方式
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (zhuan) 一些RL的文献(及笔记)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (一)基于IDEA的JAVA基础12
  • (转)h264中avc和flv数据的解析
  • *2 echo、printf、mkdir命令的应用
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET : 在VS2008中计算代码度量值
  • .NET 8.0 中有哪些新的变化?
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET4.0并行计算技术基础(1)
  • .NET设计模式(11):组合模式(Composite Pattern)
  • .net下的富文本编辑器FCKeditor的配置方法