CALL和RET指令

call和ret指令都是转移指令,它们都是修改IP,或同时修改CS和IP。它们经常被用来实现子程序的设计。
也就是常用来实现程序的加载和返回

ret和retf

ret指令用栈中的数据,修改IP的内容,从而实现近转移;
retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;
CPU执行ret指令相当于执行;

pop IP

CPU执行retf指令相当于执行:

pop IP
pop CS

call指令

CPU执行CALL指令的时候进行两步操作:

  1. 将当前的IP或CS和IP压入栈中;
  2. 转移
    call指令不能实现短转移除此之外,call指令实现转移的方法和jmp指令的原理相同

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

call 标号(将当前IP压栈之后,转到标号处执行指令)
CPU执行此种格式的CALL指令时,进行如下的操作:

  1. (sp) = (sp) - 2
    ((ss)*16+(sp)) = (IP)
  2. (IP) = (IP) + 16位位移

<==>

push IP
jmp near ptr 标号

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

call far ptr 标号 实现段间转移

CPU执行 call far ptr 标号 时 相当于进行:

    push CSpush IPjmp far ptr 标号

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

指令格式: call 16 位 reg
功能:
<==>

push IP
jmp 16位 reg

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

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

  • call word ptr 内存单元地址

<==>

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

<==>

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

call和ret的配合使用

assume cs:code
code segmentstart:  mov ax,1mov cx,3call smov bx,axmov ax,4c00hint 21hs:    add ax,axloop sret
code ends
end start

分析执行过程:call s之后 进入s: add ax,ax 执行知道(cx)==0; 执行ret 指令 会将IP恢复到call s的下一行执行 ,
即到mov bx,ax处执行

具有子程序的源程序框架如下:

assume cs:code
code segment
main: ::call sub1::mov ax 4c00hint 21
sub1: ::call sub2::retsub2: :::ret
code ends
end main

mul指令

mul指令是乘法指令,使用mul做乘法指令的时候要注意一下两点:

  1. 两个相乘的数:两个相乘的的数,要么都是8位,要么都是16位。如果都是8位,一个默认在AL中,另一个放在8位的reg或内存字节单元中;如果是16位,一个默认在AX中,另一个放在16位reg或内存字单元中。
  2. 结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中存放;
    指令格式:
mul reg
mul 内存单元

内存单元可以由不同的寻址方式给出:

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

模块化程序设计

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

参数和结果传递的问题

设计一个程序,可以根据提供的N,来计算N的三次方;

;说明:计算N的三次方
;参数:(bx)  =  N
;结果:(dx:ax) = N^3
cube: mov ax,bxmul bxmul bxret

批量数据的传递

当程序中传递的参数多于两个之后,使用寄存器传递参数就显得力不从心了,当然对于返回值也有同样的问题
在这种时候,我们可以将批量数据放到内存中,然后将内存空间首地址放到寄存器中,传递需要的子程序,对于批量数据的返回结果也采取同样的方法。
例子:
设计一个子程序,功能:将一个全是字母的字符串转化为大写。

assume cs:code
data segmentdb 'conversation'
data endscode segmentstart: mov ax,datamov ds,axmov si,0mov cx,12call captitalmov ax,4c00hint 21h
capital: and byte ptr [si],11011111binc siloop capitalret
code ends
end start

寄存器冲突问题

设计一个程序,功能:将一个全是字母,以0为结尾的字符,转换为大写;
程序要处理的字符串以零为结尾符,这个字符串可以如下定义:

db 'conversation',0
;说明:将一个全是字母,以0为结尾的字符串,转化为大写
;参数:ds:si指向字符串首地址
;结果:没有返回值
capital: mov cl,[si]mov ch,0jcxz ok     ;如果cx为0结束:如果不是0处理下一行and byte ptr [si],11011111b  ;将ds:[si]所指向的内存单元转换为大写inc si ;ds:si 指向下一个单元jmp short capitalok:  ret

CALL和RET指令相关推荐

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

    call指令和ret指令的配合使用 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846633.html

  2. Call指令和Ret指令讲解

    Call指令和Ret指令讲解 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846630.html

  3. 汇编语言随笔(2)-CPU指令周期和无条件转移指令(包括call和ret指令)

    指令周期 在执行一条指令的过程中,由CPU完成的操作序列构成一个指令周期,通常每一个指令周期一定会包含两个子周期:即取指令子周期和执行指令子周期.在取指令子周期,CPU将要执行的指令从内存中CS:IP ...

  4. 汇编语言笔记10-CALL和RET指令

    ☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程序来解决一个复杂的问题. 子程序的框架 1 assume cs:code 2 ...

  5. 汇编 CALL和RET指令

    1 ret 和 retf call 和 ret 指令都是转移指令,他们都修改ip,或同时修改cs和ip,他们经常被共同用来实现子程序的设计. ret:该指令用栈中的数据,修改ip的内容,从而实现近转移 ...

  6. 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计

    第10章 call 和 ret 指令 10.1 ret 和 reft 指令 call 和 ret 指令都是转移指令,他们都修改 IP,或同事修改 CS 和 IP .他们经常被共同来实现子程序的设计. ...

  7. 汇编语言(第三版)第十章 CALL 和 RET 指令 笔记

    call 和 ret 都是可以改变 ip 或是 cs 和 ip .经常用来实现子程序设计. 10.1 ret 和 retf ret指令用栈中的数据,修改IP实现近转移 retf指令用栈中的程序,修改c ...

  8. 7 call和ret指令

    call和ret指令 call 和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP.它们经常被共同用来实现子程序的设计. 1 ret和retf ret 指令用栈中的数据,修改IP 的内容 ...

  9. call指令和ret指令【笔记+详解】

    笔记目录 call指令和ret指令[笔记] 1 引子 2 call和ret的简单运用 3 call指令本质含义详解 4 ret指令 5 总结及汇编环境资源 call指令和ret指令[笔记] 1 引子 ...

  10. 汇编 第十章 call和ret指令

    第十章 call和ret指令 call和ret指令都是转移指令,它们都能修改ip,或同时修改cs和ip 10.1 ret和retf 1.ret指令用栈中的数据,修改ip的内容,从而实现[近转移]CPU ...

最新文章

  1. AAAI2020-图神经网络(GNN)过去、现在、应用和未来最新研究进展分享
  2. PTA基础编程题目集-6-12 判断奇偶性
  3. hibernate+mysql时,会出现事物不管用
  4. 编程5年了,养成的臭脾气
  5. nginx+keepalived安装配置(整理中)
  6. 实时获取vuex更新的新数据_京东手机销量实时数据更新 荣耀Play4T Pro位列第一
  7. 表的字段中的值需要替换怎么办?【if 函数,case when函数,中间表思路】
  8. oracle中关于删除表purge语句和闪回语句的基本使用
  9. kbmmw中向服务器端传递对象的一种简单方式
  10. 今日早上出来还是阴天
  11. oracle 查表的用户名和密码,查看Oracle数据库中的所有用户名
  12. L2-014. 列车调度-PAT团体程序设计天梯赛GPLT
  13. tf.nn.embedding_lookup()函数
  14. 阿里巴巴牵手福特 共同打造智联网汽车
  15. ps制作公章教程,沿着圆圈打字,斑驳效果
  16. Simulink模块介绍
  17. (一)数据分析——企业的贤内助(数据分析的价值)
  18. html5是什么语言,html5 css3是什么?
  19. Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题
  20. 个人注册PowerBI账号申请

热门文章

  1. Kaldi安装+编译+egs/yesno脚本运行
  2. ETC1/DXT1 compressed textures are not supported when publishing to iPhone
  3. 面向对象知多少(二)论域分析和应用分析
  4. 前后端分离经典处理方案总结-再也不用担心跨域认证不会做了
  5. 因子风险溢价——EAP.fama_macbeth.Factor_mimicking_portfolio
  6. 企业微信自建应用授权登录demo
  7. PM25文本相似度算法JAVA实现
  8. 项目实训-千寻-服务端框架搭建
  9. html 中加载pdf,在HTML中嵌入PDF的推荐方法?
  10. 锦江酒店(中国区):在变革中拥抱未来 实现高质量发展