10 CALL和RET指令

第10章 CALL和RET指令 mov ax, 1000H mov ax, 0 //这里为什么是6而不是3呢? //要回到课本CPU的执行顺序 //先是读取要执行的指令,然后IP指向要执行的指令的下一条指令,然后执行要执行的指令 ax = 6 ax = 1010H ... 阅读详情

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

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

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

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

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

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

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

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

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

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

可以看出,如果我们用汇编语法来解释ret和retf指令,则:

CPU指令ret指令时,相当于进行:

pop IP

CPU执行retf指令时,相当于进行:

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

根据以上得出结论:CPU执行“call 标号”相当于进行:

push IP

jmp near ptr 标号

 

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

前面讲的call指令,其对应的机器指令中并没有转移的目的地址,而实相当于当前IP的转移位移

call far ptr 标号 实现的时段间转移

CPU执行此种格式的call指令时,进行如下的操作:

(1)sp = sp -2

ss*16 + sp = CS

sp = sp -2

ss*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

汇编解释:

push IP

jmp 16位 reg

 

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

CPU执行 call word ptr 内存单元地址时,相当于进行:

push IP

jmp word ptr 内存单元地址

CPU执行 call word ptr 内存单元地址时,相当于进行:

push CS

push IP                //出栈时候先出IP

jmp word ptr 内存单元地址

 

7、call和ret配合使用

相当于函数调用之后返回原来执行的下一条语句

 

8、mul指令(乘法指令)

(1)两个相乘的数,要么都是8位,要么都是16位。如果是8位,一个默认在AL中,另一个放在8位reg或内存字节单元中;如果是16位,一个默认在AX中,另一个放在16位reg或内存字节单元中。

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

 

9、寄存器冲突的问题

如何避免冲突呢?可以有两个方案(引出更NB的方案)

(1)在编写调用子程序的程序时,注意看看子程序中有没有用到会产生冲突的寄存器,如果有,调用者使用别的寄存器

(2)在编写子程序的时候,不要使用会产生冲突的寄存器

分析一下两种的可能性(打脸时刻)

(1)这将给调用子程序的程序编写造成很大的麻烦,因为必须要小心检查所调用的子程序中是否有将产生冲突的寄存器

(2)这个方案是不可能实现的,因为编写子程序的时候无法知道将来的调用情况

可见,我们上面的两个方案都不可行。我们希望:

(1)编写调用子程序的程序的时候不必关心子程序到底是用了哪些寄存器;

(2)编写子程序的时候不必很关心调用者使用了哪些寄存器;

(3)不会发生寄存器冲突

解决这个问题的简捷方法是,在子程序的开始将子程序中所有用到的寄存器中的内容都保存起来,在子程序返回前恢复,可以用栈来保存寄存器中的内容

以后编写子程序的框架如下:

子程序开始: 子程序使用的寄存器入栈

                       子程序内容

                       子程序中使用的寄存器出栈

                        返回(ret、retf)

 

第10章 CALL和RET 指令 1. assume cs:code data segment    db 'Welcome to masm!',0 data ends code segment start: mov dh,8  mov dl,3  mov cl,2  mov ax,data  mov ds,ax  mov si,0  call show_str            mov ax,4 阅读详情

相关推荐

CANOE DIVA 工程怎样在具体服务前增加前置条件

然后会在CANoe的Test Module视窗中发现一个跟系统条件相关的Test Module模块,在该模块中有生成跟系统条件相关的CAPL 脚本。这里需要根据你的实际项目进行更改,diva工程加载到canoe的工程的时候,会同步加入你创建的cdd文件,这里示例的ABS_ESP 就是你的cdd的ECU命名,后面就是具体的前置条件服务。4、配置完成后,测试用例就会如下图Trace窗口所示,在每一次10 02请求之前都会调用CAPL Function的PreconditionCheck函数中定义的脚本。

weixin_45940007的博客 1962

汇编指令 CALL、ACALL、LCALL三条指令的理解与异同点

在汇编语言编程中,CALL、ACALL 和 LCALL 是用于子程序调用的不同指令,它们的主要区别在于寻址方式和有效地址范围:总结来说,三者的异同点主要体现在:

嵌入式Stark 1万+

海康线扫相机平场矫正实战:从原理到精准成像

本文深入解析了海康线扫相机平场矫正的原理与实战操作。通过拆解暗场与明场矫正的物理意义,揭示了其消除系统噪声、补偿像素响应不均的核心机制。文章详细指导了在海康相机上进行平场矫正的标准化流程、关键参数设置(如行高、灰度值控制)及常见误区,并提供了针对高行频匹配、环境稳定性维护等进阶调优技巧与问题排查指南,旨在帮助用户实现从原理理解到精准成像的跨越。

tomato的博客 789

51单片机的一些东西

程序计数器PC:用于存放下一条要执行的指令的地址,cpu要执行哪条指令,就把该地址所在单元的地址送到地址总线,之后PC会自动+1,指向下一个要执行的指令的地址. 堆栈指针SP:用来指示堆栈所处的位置一个存储地址的东西 ,可以理解为指针.堆栈主要用来保存现场,包括中断的返回和子程序的调用 ROM:程序存储器,存放指令的机器码 在51单片机中,有几个特殊的地址跳转到中断服务函数去的 RAM:数据...

木叶飞舞x的博客 733

3D模型文件格式全解析:从STL到glTF,10种主流格式与转换实战指南

在三维数字内容创作与工程制造领域,3D模型文件格式是数据交换与协作的基石。其核心原理在于以不同的数据结构(如三角网格、NURBS曲面、边界表示等)对三维物体的几何、外观及场景信息进行编码。理解这些格式的技术特性,对于保障数据完整性、提升工作流效率具有关键价值,广泛应用于3D打印、游戏开发、影视动画及工业设计等场景。例如,面向增材制造的STL格式以其极简的三角面片结构成为行业通用语,而支持丰富材质与动画的FBX格式则在影视游戏管线中扮演核心角色。本文聚焦于STL、OBJ、FBX、3MF、STEP等10种主流格

weixin_28520495的博客 354

Lmbench测试集 --- 延迟测试工具lat_mem_rd

lmbench测试集简介 以及 lat_mem_rd延迟测试工具: 如何测试、测试结果、源码分析

MonologueYY的博客 1万+

call 指令调用方式

这篇文章中,我们介绍了 call 指令的几种调用方式,举出具体代码示例说明其使用方式,并查看了相应机器码。然后通过反汇编或者直接查看机器码的方式,进一步验证了原理与实际指令布局的契合。原文链接:https://www.jianshu.com/p/55726f7e355a。

zxf347085420的博客 2768

python实现马丁策略(股市) (附完整源码)

python实现马丁策略(股市) (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 603

汇编语言过程

如果大家已经学过了高级编程语言,那么就会知道将程序分割为子过程(subroutine)是多么有用。一个复杂的问题常常要分解为相互独立的任务,这样才易于被理解、实现以及有效地测试。在汇编语言中,通常用术语过程(procedure)来指代子程序。在其他语言中,子程序也被称为方法或函数。就面向对象编程而言,单个类中的函数或方法大致相当于封装在一个汇编语言模块中的过程和数据集合。汇编语言出现的时间远早于面向对象编程,因此它不具备面向对象编程中的形式化结构。汇编程序员必须在程序中实现自己的形式化结构。

顺其自然~专栏 5577

提升JVM性能:CMS垃圾回收器的优化分析与案例研究

本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记,分析了可能导致性能瓶颈的因素如停顿时间过长和内存碎片化。文章还分享了调整垃圾回收参数、结合其他垃圾回收器以及内存优化等方法,帮助提高CMS的回收效率和性能。最后,文章展望了随着JVM发展,结合新一代垃圾回收器优化的趋势,助力Java应用在高并发环境下的性能提升。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 175万+

人工智能数据治理——解读AI时代数据治理白皮书 2025【附全文阅读】

摘要:该白皮书面向企业数字化负责人及AI项目推进人员,探讨AI时代数据治理的战略升级。提出"好数据+好数据知识"双基石理念,强调数据需满足"三高"标准(高精度、一致性、时效性)并构建语义知识库。构建四层治理框架,包括数据采集处理、合规安全、知识库建设及质量改进,并介绍AI赋能治理的新范式,如智能ETL和治理Agent体系。同时分析"软件+AI+好数据"的应用模式,为企业实现智能数据治理提供实践指导。(149字)

cdfunlove的博客 632

Call far ptr指令执行时,依次压入堆栈内容

该指令执行时,依次会向堆栈压入:标志寄存器,CS和IP 为什么要压入标志寄存器? call指令虽然不涉及标志寄存器。但是call指令的本质,它是一条跳转指令,目的是跳到子程序去执行,而子程序是可以改变标志的。 因此需要把标志寄存器也压入堆栈。 ...

Artorias的博客 2612

ThingsBoard3.9.1规则引擎方式发送钉钉通知消息

thingsboard3.9.1/4.0规则链方式发送钉钉通知消息。

hssjf的专栏 530

第10章 CALL 和 RET 指令

call和ret指令都是转移指令,它们都。

yyhshm520的博客 840

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

《汇编语言》第10章 call和ret指令

call和ret指令都是转移指令,经们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。这一章,我们讲解call和ret指令的原理。

chenyijun的专栏 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

汇编语言——第10章 CALL和RET指令

汇编语言——第10章 CALL和RET指令

m0_65159351的博客 9631

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

第10章 CALL和RET指令 笔记

P190 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP。它们经常被共同用来实现子程序的设计。         ret指令用栈中的数据,修改IP的内容,从而实现近转移;         CPU执行ret指令时,相当于进行:    pop IP。         retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。         CPU执行retf指令时,相当于进行:    pop IP    pop CSP199 mul是乘法指令,使用mul做乘法的时候,注意以下两点:

canmeng50401的专栏 724

第10章 CALL和RET指令

10.1  ret和retf ret指令用栈中的数据,修改ip的内容,从而实现近转移; retf指令用栈中的数据,修改cs和ip的内容,从而实现远转移。 10.2  call指令 call是段内转移时,将ip压入栈,执行完后,利用ret返回到当前分支处继续向下执行。 call是段间转移时,将cs和ip压入栈,执行完后

花花的博客 539

汇编语言笔记(10)CALL和RET指令

call和ret的使用

m0_62750704的博客 1707

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

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

xyjikl 697

10.CALL和RET指令

1.call和ret指令都是转移指令,它们都修改IP的值,或同时修改CS和IP的值。它们经常共同用语实现子程序的设计。 2.ret指令用栈中的数据,修改IP的内容,从而实现近转移。 3.retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。 4.CPU执行ret指令时,相当于进行:   pop IP   执行retf指令时,相当于进行:   pop IP   pop C...

weixin_34248849的博客 290

《汇编语言》- 读书笔记 - 第10章-CALL 和 RET 指令

本文是《汇编语言》第十章笔记,详解CALL和RET指令,它们支持汇编语言的模块化设计。CALL用于调用子程序,RET用于返回。文章讨论了不同形式的CALL指令。介绍了乘法 mul。同时,探讨了模块化编程中的参数传递、批量数据传递和寄存器冲突问题,强调了模块化的重要性,以提升代码的可读性和复用性。

灵台方寸山斜月三星洞 1506
上一篇: 9 转移指令的原理
下一篇: 11 标志寄存器
fa1lr4in
博客等级 码龄9年 64粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值