c语言子程序返回指令,十八、使用call和ret指令实现子程序的调用和返回
1. 子程序实现的基础——跳转:
1) 汇编中的子程序即等价于C语言的函数,即实现程序的模块化;
2) 在汇编语言中,子程序其实就是以一个标号起始,最后有类似C函数的返回指令的一段代码块,主程序可以在中途调用该代码块(其实就是跳转到子程序执行),调用结束后再从子程序返回到调用处(其实就是从子程序处跳转回调用它的地方);
3) 也就是说子程序实现的基础就是跳转,即需要转移指令的支持;
2. 利用call和ret指令来调用子程序和从子程序返回:
1) call的使用方法是:call 子程序入口处地址,该地址可以是标号,也可以存放在寄存器和内存中;
2) ret的使用方法就是直接在子程序中使用ret指令即可,可以没有参数,执行该指令会直接返回至调用子程序的位置处;
3) 这两条指令是如何实现的?
i. 由于调用和返回都是通过跳转实现的,因此两条指令的背后肯定都修改了cs:ip;
ii. 考虑到最后要返回至调用处,则肯定需要在调转至子程序处之前先保存好返回时的位置(即call后面一条指令的地址),待子程序运行完后再恢复该位置并赋给cs:ip,而保存和恢复的工具必然是栈了;
iii. 因此call、ret其实是一组复合动作,其执行流程是:
call proc_addr:
push ++(cs:ip)
jmp -> proc_addr
ret:
pop (cs:ip) 4) 由于call和ret背后也是转移,因此也是要分段内跳转和段间元跳转的:
i. 段内跳转call:
*1. call near ptr proc_tag:等价于jmp near ptr,因此也是一种位移转移,其中near ptr可以省略,但不建议这样做,将near ptr写上可以联想到jmp near ptr,这样不会导致记忆混乱,并且使程序清晰易读;
*2. call 16-bit-register:子程序段内偏移地址存在16位寄存器中,等价于jmp 16-bit-register,因此是直接修改ip但不修改cs;
*3. call word ptr 内存单元:子程序段内偏移地址存在内存单元中,等价于jmp word ptr 内存单元,也是只修改ip
*注意:它们都会在跳转之前先push ip进行备份!没有段内你短转移!
ii. 远跳转call:直接同时修改cs:ip
*1. call far ptr proc_tag:等价于jmp far ptr
*2. call dword ptr 内存单元:等价于jmp dword ptr,第16位是偏移地址,高16位是段地址;
*注意:在跳转之前都会先保存cs:ip的值,顺序是先push cs再push ip;
iii. 段内跳转ret:直接ret即可,其实就等价于pop ip
iv. 远跳retf:注意,远跳是retf,即return far的缩写,f不要忘了,等价于pop (ip, cs),注意和远跳的call对应(栈是后进先出的!)
5) call和ret要对应使用,即段内跳的call就和ret配合使用,远跳的call就和retf配合使用,千万不能交叉配合使用,虽然这样编译不会报错,但是一定会发生运行时错误或者是不可预料的错误,因为段内跳push和pop16位的地址,而远跳push和pop32位的地址,交叉使用就会相差16位,从而导致cs:ip指向异常!
一定要牢记这点!
4. 乘法指令mul:
1) mul有两种类型,一种是两个8位相乘得到一个16位的结果,另一种是两个16位相乘得到一个32位的结果;
2) 双8位相乘:一个乘数默认放在al中,另一个乘数可以放在任意一个8位寄存器或者内存中,结果默认放在ax中;
3) 双16位相乘:一个乘数默认放在ax中,另一个乘数可以放在任意一个16位寄存器或者内存中,结果的高16位默认放在dx中,低16位默认放在ax中;
4) 使用格式:
; 8-bit mul 8-bit
moval, XXX
mov8-bit-register/memory, XXX
mul8-bit-register/memory
; -> ax
; 16-bit mul 16-bit
movax, XXX
mov16-bit-register/memory, XXX
mul16-bit-register/memory
; -> [dx:ax] 5) 示例:
100 × 10和100 × 10000:
assume cs:code
code segment
dd 0
start:
moval, 100
movah, 10
mulah
movax, 100
movdx, 10000
muldx
movword ptr cs:[0], ax
movword ptr cs:[2], dx
movax, 4C00H
int21H
code ends
end start运行结果:
*1. ax -> 03E8H
*2. 将结果保存在了代码段开头定义的数据区中,结果是000F4240H
c语言子程序返回指令,十八、使用call和ret指令实现子程序的调用和返回相关推荐
- (十)汇编语言——CALL和RET指令
(十)汇编语言--CALL和RET指令 文章目录 (十)汇编语言--CALL和RET指令 CALL指令 功能 寄存器 内存 段间转移 返回指令 ret retf 实例 MUL指令 模块化程序设计 寄存 ...
- 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计
第10章 call 和 ret 指令 10.1 ret 和 reft 指令 call 和 ret 指令都是转移指令,他们都修改 IP,或同事修改 CS 和 IP .他们经常被共同来实现子程序的设计. ...
- C语言试题六十八之请编写函数实现亲密数
1. 题目 编写函数:求一个整数范围数字以内的全部亲密数. 亲密数:如果整数A的全部因子(包括1,不包括A本身)之和等于B:且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密 ...
- C语言试题五十八之请编写函数fun,:计算并输出下列多项式的值(sn=1+1/1!+1/2!+1/3!+1/4!+…+1/n! )
1. 题目 请编写函数fun,其功能时:计算并输出下列多项式的值 sn=1+1/1!+1/2!+1/3!+1/4!+-+1/n! 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究 ...
- C语言试题四十八之该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。
1. 题目 请编写一个函数function,它的功能是:该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C ...
- C语言试题三十八之将s所指字符串中除了下标为偶数、同时ascii值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的一个数组中。
1. 题目 请编写一个函数function,它的功能是:将s所指字符串中除了下标为偶数.同时ascii值也为偶数的字符外,其余的全都删除:串中剩余字符所形成的一个新串放在t所指的一个数组中. 2 .温 ...
- C语言试题二十八之编写函数function功能是:从字符中删除指定的字符,同一字母的大、小写按不同字符处理。
1. 题目 编写函数function,该函数的功能是:从字符中删除指定的字符,同一字母的大.小写按不同字符处理. 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科 ...
- C语言试题十八之根据以下攻势计算s,计算结果作为函数值返回;n通过形参传入。S=1+1/(1+2)+1/(1+2+3)+…….+1/(1+2+3+4+……+n)
1. 题目 编写函数function,功能是:根据以下攻势计算s,计算结果作为函数值返回:n通过形参传入.S=1+1/(1+2)+1/(1+2+3)+--.+1/(1+2+3+4+--+n) 2 .温 ...
- 2021年大数据常用语言Scala(十八):基础语法学习 Map对象
目录 Map对象 不可变Map 可变Map Map基本操作 Map对象 Map可以称之为映射.它是由键值对组成的集合.在scala中,Map也分为不可变Map和可变Map. 不可变Map 定义 语法 ...
- Go语言学习笔记(十八)之文件读写
25.文件读写 1.文件打开和读 A.文件分类:文本和二进制文件 B.文件存取方式:随机存取和顺序存取 文件打开代码示例: 1: package main 2: 3: import ( 4: &quo ...
最新文章
- 安卓adb常用简单指令
- Java在linux新建png_教你如何使用libpng显示PNG图片
- “华为云杯”2020深圳开放数据应用创新大赛线上推介会成功举办,让深圳大数据在全球“跑”起来...
- ZooKeeper的一致性算法赏析
- .gitignore for Visual Studio项目和解决方案
- 004_淡入淡出效果
- Java集合中HashMap日常问题及解决办法
- 视频专辑:JAVA语言入门视频教程
- linux core无权限,linux – 为什么编辑core_pattern受限制?
- Java网络编程-1
- 域内计算机策略应用顺序
- nbi可视化_教您通过NBI大数据可视化工具零编码轻松实现桑基图的制作
- linux查看内存条pn,查看电脑内存条型号的两种方法【图文】
- 卡巴斯基终于也免费了:功能太鸡肋
- 解决mac可以聊QQ微信不能浏览网页问题
- 高校讲座信息APP的设计与实现
- 金山WPS计算机视觉算法工程师
- Destroying assets is not permitted to avoid data loss.
- 新起点,新希望,为梦想而战!!!
- Cortex-M3 处理器内核