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

1.ret和retf

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

retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;

CPU执行ret指令时,进行下面两步操作:

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

(2).(sp)=(sp)+2

用汇编语法解释,相当于:

pop IP

CPU执行retf指令时,进行下面4步操作:

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

(2).(sp)=(sp)+2

(3).(CS)=((ss)*16+(sp))

(4).(sp)=(sp)+2

用汇编语法来解释,相当于:

pop IP

pop CS

2.call指令

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

(1).将当前的IP或CS和IP压入栈中;

(2).转移

call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同。

3.依据位移进行转移的call指令

call标号(将当前的IP压栈后,转移到标号处执行指令)

CPU执行此操作的call指令,进行如下操作:

(1)(sp)=(sp)-2

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

(2)(IP)=(IP)+16位位移

16位位移=标号处的地址-call指令后的第一个字节的地址;

16位位移的范围为-32768~32767,用补码表示;

16位位移由编译程序在编译时算出。

用汇编语法来解释此种格式call指令,相当于:

push IP

jmp near ptr 标号

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

“call far ptr 标号”是实现段转移。

CPU进行如下操作:

(1).(sp)=(sp)-2

((sp)*16+(sp))=(CS)

(sp)=(sp)-2

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

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

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

汇编解释,CPU执行“call far ptr 标号”时,相当于:

push CS

push IP

jmp far ptr 标号

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

指令格式:call 16位reg

功能:

(sp)=(sp)-2

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

(IP)=(16位reg)

CPU 执行“call 16位reg”时,相当于:

push IP

jmp 16位reg

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

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

push IP

jmp word ptr 内存单元地址

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

push CS

push IP

jmp dword ptr 内存单元地址

7.call和ret的配合使用

可以写一个具有一定功能的程序段,称为子程序,在需要的时候,用call去执行。

call指令在去执行子程序之前,call指令后面的指令的地址将存储在栈中。执行完子程序后,

可以使用ret指令,用栈中的数据设计IP的值,从而转到call指令后面代码处继续继续执行!

aeeume cs:code
code segment
main::
:
call ;调用子程序
:
:
mov ax,4c00h
int 21h sub1: : ;子程序开始
:
call sub2 ;调用子程序sub2
:
:
ret ;子程序返回 sub2: :
:
:
ret ;子程序返回
code ends
end main

8.mul指令

mul是乘法指令:

(1).两个相乘的数:两个相乘的数,要么都是8位,要么都是16位。8位数相乘,一个默认放在AL中,

另一个放在8位reg或内存字节单元中;如果是16位,一个默认在AX中,另一个在16位reg或内存字单元中。

(2).结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中存放。

格式:

mul reg

mul 内存单元内存单元可以用不同的寻址方式给出。

9.模块化程序设计

call和ret指令共同使用支持了汇编语言编程中的模块化设计。

10.参数和结果传递的问题

用寄存器来存储参数和结果是最常用的办法。对于存放参数的寄存器和存放结果的寄存器,

调用和子程序的读写操作恰恰相反:调用者将参数送入参数寄存器,从结果寄存器中取出得到的返回值;

子程序从参数寄存器中取到参数,将返回值送入结果寄存器。

11.批量数据的传递

当子程序只有一个参数或几个时,可以用一个或几个寄存器来存放;但是寄存器的数量终究有限!

我们可以将批量数据存放在内存中,然后将它们所在的内存空间的首地址存放在寄存器中,传递给需要的子程序。

对于具有批量数据的返回结果,也可以用同样的方法。

12.寄存器冲突问题

在子程序的开始将子程序所用到的寄存器的内容都保存起来,在子程序返回前恢复。

编写子程序框架:

子程序开始:子程序中使用的寄存器入栈
子程序内容
子程序中使用的寄存器出栈
返回(ret,retf)

汇编-10.0-CALL和RET指令的更多相关文章

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

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

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

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

  3. [汇编学习笔记][第十章 CALL和RET指令]

    第十章 CALL和RET指令 call和ret指令都是转移指令,它们都修改CS和IP.经常被共同用于实现子程序的设计.这一章,我们讲解call和ret指令的原理 10.1 ret和retf ret指令 ...

  4. 自己总结:汇编CALL和RET指令

    ret指令,相当于 pop IP:修改IP的内容,从而实现近转移 retf指令,相当于 pop IP pop CS:修改CS和IP的内容,从而实现远转移 -------------- CPU执行cal ...

  5. 汇编语言---call和ret指令

    汇编语言--call和ret指令 call和ret指令 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP. 它们经常被共同用来实现子程序的设计. ret和retf ret指令用栈 ...

  6. call 和 ret 指令

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  7. 汇编语言笔记 CALL和RET指令

    转载地址:http://www.cnblogs.com/dennisOne ☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程 ...

  8. call和ret指令

    call和ret都是用来修改ip或cs:ip,可以用来实现子程序的设计:   1.ret和retf ret    ->修改ip的内容,从而实现近转移: retf    ->同时修改cs和i ...

  9. 10.0.0.55训练赛 Writeup

    From LB@10.0.0.55 Misc 0x01 misc100(图片隐写) 首先用binwalk扫了一下,发现没毛病. 然后就搜了一下jpg的文件尾FFD9,如下图,看到了png格式的标志IH ...

随机推荐

  1. JavaScript入门学习笔记(表单验证)

    表单验证: 在数据被送到服务器之前对HTML表单中的输入数据进行验证,避免服务器频繁验证信息造成用户体验差. (1)表单数据是否为空 (2)输入的信息格式是否正确 (3)输入数据的类型是否正确 必填( ...

  2. pl/sql学习(5): 触发器trigger/事务和锁

    (一)触发器简单介绍 触发器是由数据库的特定时间来触发的, 特定事件主要包括以下几种类型: (1)DML: insert, update,delete 增删改 (2)DDL: create, alte ...

  3. 利用CSS3实现鼠标悬停在图片上图片缓慢缩放的两种方法

    1.改变background-size属性 将图片作为某个html元素的背景图片,用transition属性改变图片的大小. .container{ background-size: 100% 100 ...

  4. C++线程中的几种锁

    线程之间的锁有:互斥锁.条件锁.自旋锁.读写锁.递归锁.一般而言,锁的功能越强大,性能就会越低. 1.互斥锁 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量.也就是说是为了避免多个线程在 ...

  5. 【SQL】 MySql与SqlServer差异比较(MySql踩坑全集)

    本文主要记录将数据库从SqlServer移植到MySql的过程中,发现的各种坑爹问题.以SqlServer为主,记录MySql的差异性. 一.IF语句 首先MySql中的的IF语法不同. IF Con ...

  6. UOJ#218. 【UNR #1】火车管理 线段树 主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ218.html 题解 如果我们可以知道每次弹出栈之后新的栈顶是什么,那么我们就可以在一棵区间覆盖.区间求和 ...

  7. .Net Core库类项目跨项目读取配置文件

    在项目开始之前我们可以先去了解一下IConfiguration接口,.Net Core Web应用程序类似于一个控制台,当程序运行到Startup时会自动注入IConfiguration,默认读取当前 ...

  8. .Net简单工厂模式,工厂模式,抽象工厂模式实例

    1.定义   简单工厂模式:是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂模式:定义一个用于创建对象的接口, ...

  9. python田忌赛马

    一,简介 田忌赛马的故事大家都知道我就不展开说了,田忌能用同全面被碾压的马赢了齐威王(公子),我觉得这是十分具有智慧的.但是,如果说这里的条件改为:1,田忌的马比齐威王同等次的马弱一点但是比齐威王下一 ...

  10. Yii2 验证规则

    验证器的使用方法: public function rules() { return [ [['email', 'password'], 'required'], ['password', 'stri ...