CALL和RET指令
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指令的时候进行两步操作:
- 将当前的IP或CS和IP压入栈中;
- 转移
call指令不能实现短转移除此之外,call指令实现转移的方法和jmp指令的原理相同
依据位移进行转移的call指令
call 标号(将当前IP压栈之后,转到标号处执行指令)
CPU执行此种格式的CALL指令时,进行如下的操作:
- (sp) = (sp) - 2
((ss)*16+(sp)) = (IP) - (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做乘法指令的时候要注意一下两点:
- 两个相乘的数:两个相乘的的数,要么都是8位,要么都是16位。如果都是8位,一个默认在AL中,另一个放在8位的reg或内存字节单元中;如果是16位,一个默认在AX中,另一个放在16位reg或内存字单元中。
- 结果:如果是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指令相关推荐
- call指令和ret指令的配合使用
call指令和ret指令的配合使用 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846633.html
- Call指令和Ret指令讲解
Call指令和Ret指令讲解 转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/28/3846630.html
- 汇编语言随笔(2)-CPU指令周期和无条件转移指令(包括call和ret指令)
指令周期 在执行一条指令的过程中,由CPU完成的操作序列构成一个指令周期,通常每一个指令周期一定会包含两个子周期:即取指令子周期和执行指令子周期.在取指令子周期,CPU将要执行的指令从内存中CS:IP ...
- 汇编语言笔记10-CALL和RET指令
☞模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程序来解决一个复杂的问题. 子程序的框架 1 assume cs:code 2 ...
- 汇编 CALL和RET指令
1 ret 和 retf call 和 ret 指令都是转移指令,他们都修改ip,或同时修改cs和ip,他们经常被共同用来实现子程序的设计. ret:该指令用栈中的数据,修改ip的内容,从而实现近转移 ...
- 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计
第10章 call 和 ret 指令 10.1 ret 和 reft 指令 call 和 ret 指令都是转移指令,他们都修改 IP,或同事修改 CS 和 IP .他们经常被共同来实现子程序的设计. ...
- 汇编语言(第三版)第十章 CALL 和 RET 指令 笔记
call 和 ret 都是可以改变 ip 或是 cs 和 ip .经常用来实现子程序设计. 10.1 ret 和 retf ret指令用栈中的数据,修改IP实现近转移 retf指令用栈中的程序,修改c ...
- 7 call和ret指令
call和ret指令 call 和ret 指令都是转移指令,它们都修改IP,或同时修改CS和IP.它们经常被共同用来实现子程序的设计. 1 ret和retf ret 指令用栈中的数据,修改IP 的内容 ...
- call指令和ret指令【笔记+详解】
笔记目录 call指令和ret指令[笔记] 1 引子 2 call和ret的简单运用 3 call指令本质含义详解 4 ret指令 5 总结及汇编环境资源 call指令和ret指令[笔记] 1 引子 ...
- 汇编 第十章 call和ret指令
第十章 call和ret指令 call和ret指令都是转移指令,它们都能修改ip,或同时修改cs和ip 10.1 ret和retf 1.ret指令用栈中的数据,修改ip的内容,从而实现[近转移]CPU ...
最新文章
- AAAI2020-图神经网络(GNN)过去、现在、应用和未来最新研究进展分享
- PTA基础编程题目集-6-12 判断奇偶性
- hibernate+mysql时,会出现事物不管用
- 编程5年了,养成的臭脾气
- nginx+keepalived安装配置(整理中)
- 实时获取vuex更新的新数据_京东手机销量实时数据更新 荣耀Play4T Pro位列第一
- 表的字段中的值需要替换怎么办?【if 函数,case when函数,中间表思路】
- oracle中关于删除表purge语句和闪回语句的基本使用
- kbmmw中向服务器端传递对象的一种简单方式
- 今日早上出来还是阴天
- oracle 查表的用户名和密码,查看Oracle数据库中的所有用户名
- L2-014. 列车调度-PAT团体程序设计天梯赛GPLT
- tf.nn.embedding_lookup()函数
- 阿里巴巴牵手福特 共同打造智联网汽车
- ps制作公章教程,沿着圆圈打字,斑驳效果
- Simulink模块介绍
- (一)数据分析——企业的贤内助(数据分析的价值)
- html5是什么语言,html5 css3是什么?
- Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题
- 个人注册PowerBI账号申请
热门文章
- Kaldi安装+编译+egs/yesno脚本运行
- ETC1/DXT1 compressed textures are not supported when publishing to iPhone
- 面向对象知多少(二)论域分析和应用分析
- 前后端分离经典处理方案总结-再也不用担心跨域认证不会做了
- 因子风险溢价——EAP.fama_macbeth.Factor_mimicking_portfolio
- 企业微信自建应用授权登录demo
- PM25文本相似度算法JAVA实现
- 项目实训-千寻-服务端框架搭建
- html 中加载pdf,在HTML中嵌入PDF的推荐方法?
- 锦江酒店(中国区):在变革中拥抱未来 实现高质量发展