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指令实现子程序的调用和返回相关推荐

  1. (十)汇编语言——CALL和RET指令

    (十)汇编语言--CALL和RET指令 文章目录 (十)汇编语言--CALL和RET指令 CALL指令 功能 寄存器 内存 段间转移 返回指令 ret retf 实例 MUL指令 模块化程序设计 寄存 ...

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

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

  3. C语言试题六十八之请编写函数实现亲密数

    1. 题目 编写函数:求一个整数范围数字以内的全部亲密数. 亲密数:如果整数A的全部因子(包括1,不包括A本身)之和等于B:且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密 ...

  4. 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语言笔试.机试.研究 ...

  5. C语言试题四十八之该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。

    1. 题目 请编写一个函数function,它的功能是:该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数. 2 .温馨提示 C语言试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C ...

  6. C语言试题三十八之将s所指字符串中除了下标为偶数、同时ascii值也为偶数的字符外,其余的全都删除;串中剩余字符所形成的一个新串放在t所指的一个数组中。

    1. 题目 请编写一个函数function,它的功能是:将s所指字符串中除了下标为偶数.同时ascii值也为偶数的字符外,其余的全都删除:串中剩余字符所形成的一个新串放在t所指的一个数组中. 2 .温 ...

  7. C语言试题二十八之编写函数function功能是:从字符中删除指定的字符,同一字母的大、小写按不同字符处理。

    1. 题目 编写函数function,该函数的功能是:从字符中删除指定的字符,同一字母的大.小写按不同字符处理. 2 .温馨提示 C试题汇总里可用于计算机二级C语言笔试.机试.研究生复试中C程序设计科 ...

  8. 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 .温 ...

  9. 2021年大数据常用语言Scala(十八):基础语法学习 Map对象

    目录 Map对象 不可变Map 可变Map Map基本操作 Map对象 Map可以称之为映射.它是由键值对组成的集合.在scala中,Map也分为不可变Map和可变Map. 不可变Map 定义 语法 ...

  10. Go语言学习笔记(十八)之文件读写

    25.文件读写 1.文件打开和读 A.文件分类:文本和二进制文件 B.文件存取方式:随机存取和顺序存取 文件打开代码示例: 1: package main 2: 3: import ( 4: &quo ...

最新文章

  1. 安卓adb常用简单指令
  2. Java在linux新建png_教你如何使用libpng显示PNG图片
  3. “华为云杯”2020深圳开放数据应用创新大赛线上推介会成功举办,让深圳大数据在全球“跑”起来...
  4. ZooKeeper的一致性算法赏析
  5. .gitignore for Visual Studio项目和解决方案
  6. 004_淡入淡出效果
  7. Java集合中HashMap日常问题及解决办法
  8. 视频专辑:JAVA语言入门视频教程
  9. linux core无权限,linux – 为什么编辑core_pattern受限制?
  10. Java网络编程-1
  11. 域内计算机策略应用顺序
  12. nbi可视化_教您通过NBI大数据可视化工具零编码轻松实现桑基图的制作
  13. linux查看内存条pn,查看电脑内存条型号的两种方法【图文】
  14. 卡巴斯基终于也免费了:功能太鸡肋
  15. 解决mac可以聊QQ微信不能浏览网页问题
  16. 高校讲座信息APP的设计与实现
  17. 金山WPS计算机视觉算法工程师
  18. Destroying assets is not permitted to avoid data loss.
  19. 新起点,新希望,为梦想而战!!!
  20. Cortex-M3 处理器内核

热门文章

  1. 第二章 Dubbo框架
  2. 今天不忙,咱们来说说域名是什么意思?
  3. Adjustment OfficeInput file
  4. 生成一个16位的随机数字
  5. 领导力 之 《情境领导》
  6. 必应搜索昨日起出现大规模的无法访问
  7. Kodi+Alist v3 挂载阿里云盘他人分享链接打造在线影视库
  8. 高阶篇:4.1.2.2)产品部件级别的QFDII
  9. python快乐数,快乐数
  10. 202. 快乐数 (Python 实现)