汇编语言笔记 CALL和RET指令
转载地址:http://www.cnblogs.com/dennisOne
☞模块化程序设计
- 模块化程序设计
汇编语言通过call和ret指令实现了模块化程序设计。可以实现多个相互联系、功能独立的子程序来解决一个复杂的问题。
- 子程序的框架
1 assume cs:code
2 code segment
3 main: :
4 :
5 call sub1 ; 调用子程序sub1
6 :
7 :
8 mov ax, 4c00h
9 int 21h
10
11 sub1: : ; 子程序sub1开始
12 :
13 call sub2 ; 调用子程序sub2
14 :
15 :
16 ret ; 子程序返回
17
18 sub2: : ; 子程序sub2开始
19 :
20 :
21 ret ; 子程序返回
22 code ends
23 end main
☞call和ret指令
指令 |
功能 |
汇编语法解释 |
备注 |
||||||||||||
ret |
用栈中的数据,修改IP的内容, 实现近转移。 |
pop IP |
|||||||||||||
retf |
用栈中的数据,修改CS和IP的内容, 实现远转移。 |
pop IP pop CS |
|||||||||||||
retn |
pop IP add sp, n |
见后面 |
|||||||||||||
call |
call指令分为两步: (1) 将当前的IP或者CS和IP压入栈中。 (2) 转移。 |
|
call 指 令 不 能 实 现 短 转 移 |
☞mul和div指令
指令格式 |
解释 |
示例 |
mul reg mul 内存单元 |
(1) 8位乘法:默认乘子一个放在AL中,另一个放在8位reg或者内存字节单元中。默认结果放在AX中 (2)16位乘法:默认乘子一个放在AX中,另一个放在16位reg或者内存字单元中。默认结果放在DX|AX中。 |
mul byte ptr ds:[0] ; (ax)=(al)*((ds)*16+0) mul word ptr [bx+si+8] ; (dx|ax)=(ax)*((ds)*16+(bx)+(si)+8) |
div reg div 内存单元 |
(1)16位/8位: 被除数默认放在AX中,除数放在8位reg或者内存字节单元中。结果AL(商),AH(余数)。 (2)32位/16位: 被除数默认DX|AX中,除数放在16位reg或者内存字单元中。结果AX(商), DX(余数)。 (3)会产生越界问题(如何设计安全的div见后面) |
div byte ptr ds:[0] div word ptr [bx+si+8] ; (ax)=(ax)/((ds)*16+(bx)+(si)+8)的商 ; (dx)=(ax)/((ds)*16+(bx)+(si)+8)的余数 |
☞参数和结果传递
位置 |
优点 |
缺点 |
示例 |
放在寄存器中 |
最常见的方法 快速 |
寄存器数量有限, 寄存器可能会冲突 |
; 说明:计算N的3次方 ; 参数: (bx)=N ; 结果: (dx:ax)=N^3 cube: mov ax, bx mul bx mul bx ret |
放在数据段中 |
批量数据的传递 |
速度慢 |
; ds:si指向字符串(批量数据)所在空间的首地址 ; cx存放字符串的长度 capital: and byte ptr [si], 11011111b inc si loop capital ret |
放在栈中 |
C语言的方式 简单方便 |
详细解释 |
- 附1:用栈传递参数
结合C语言的函数调用来学习栈传递参数的思想。
1 ; 说明:计算(a-b)^3,a、b为字型数据
2 ; 参数:进入子程序时候,栈顶存放IP,后面依次存放a、b
3 ; 结果:(dx:ax)=(a-b)^3
4 difcube: push bp
5 mov bp, sp
6 mov ax, [bp+4] ;将栈中a的值送入ax中
7 sub ax, [bp+6] ; a-b
8 mov bp, ax
9 mul bp
10 mul bp
11 pop bp
12 ret 4 ; 弹出参数(将栈顶指针修改为调用前的值)
13
14 ;指令ret n的含义:
15 ; pop ip
16 ; add sp,n使用栈进行参数传递,所以调用者在汇编程序的时候要向栈中压入参数,子程序在返回的时候可以使用ret n指令将栈顶指针修改为调用前的值。
- 附2: C语言处理方式(局部变量,也是使用栈)
1 void add(int, int, int);
2
3 void main()
4 {
5 int a = 1;
6 int b = 2;
7 int c = 0;
8 add(a, b, c);
9 c++;
10 }
11
12 void add(int a, int b, int c)
13 {
14 c = a + b;
15 }
汇编语言笔记 CALL和RET指令的更多相关文章
- 汇编语言---call和ret指令
汇编语言--call和ret指令 call和ret指令 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP. 它们经常被共同用来实现子程序的设计. ret和retf ret指令用栈 ...
- 汇编学习笔记(7)call和ret指令
ret和retf CPU执行ret指令时进行以下两步操作: (IP)=((ss)*16+(sp)) (sp)=(sp)+2 这相当于pop IP CPU执行retf指令时进行以下四步操作: (IP)= ...
- [汇编学习笔记][第十章 CALL和RET指令]
第十章 CALL和RET指令 call和ret指令都是转移指令,它们都修改CS和IP.经常被共同用于实现子程序的设计.这一章,我们讲解call和ret指令的原理 10.1 ret和retf ret指令 ...
- 王爽汇编第十章,call和ret指令
目录 王爽汇编第十章,call和ret指令 call和ret指令概述: ret和retf ret指令 retf指令 call 和 ret 的配合使用 call指令详解 call原理 call指令所有写 ...
- call 和 ret 指令
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 汇编-10.0-CALL和RET指令
call和ret指令都是转移指令,他们都是修改IP,或同时修改CS和IP.它们常被共同用来实现子程序设计. 1.ret和retf ret指令用栈中的数据,修改IP的内容,从而实现近转移: retf指令 ...
- angular学习笔记(6)- 指令
angular1学习笔记(6)- 指令 restrict-匹配模式 1.A - 属性 <my-menu title=Products></my-menu> 2.M - 注释 & ...
- 第十章 Call 和 Ret 指令
引言 想想程序之间的加载返回过程. call 和 ret 指令都是转移指令,它们都修改 IP,或同时修改 CS 和 IP. call 和 ret 经常被共同用来实现自程序的设计. 这一章,我们讲解 c ...
- 自己总结:汇编CALL和RET指令
ret指令,相当于 pop IP:修改IP的内容,从而实现近转移 retf指令,相当于 pop IP pop CS:修改CS和IP的内容,从而实现远转移 -------------- CPU执行cal ...
随机推荐
- golang 执行命令行(二)--修改进程启动用户
继续上文所述,有时候我们需要设置进程的启动用户,操作与设置进程组的方式类似,不多说直接上代码: // 修改进程的执行用户 func withUserAttr(cmd *exec.Cmd, name s ...
- twbsPagination.js分页插件
分页插件在使用时注意,如果页面中存在其他异步加载的数据,在运行分页方法第一次后,页面上的分页样式与分页中的data数据就是第一次的数据,如果异步加载重新在页面上录入数据,并希望分页继续在新的数据上实现 ...
- centos 7 安装nginx并启动(笔记)
参考 https://www.cnblogs.com/liujuncm5/p/6713784.html Nginx 是 C语言 开发 一. gcc 安装安装 nginx 需要先将官网下载的源码进行编译 ...
- AD域控服务器更改IP地址步骤
1.cmd命令行,先停止netlogon服务:net stop netlogon 2.修改本机的IP地址 3.清楚IP缓存:ipconfig /flushdns 4.重启netlogon服务:net ...
- PHP 常用数据库操作
1.建立与数据库服务器的连接(前提数据库服务器必须打开) 第一个参数:本地地址 第二个参数:数据库账户 第三个参数:数据库密码 第四个参数:数据库名称 $connection = mysqli_con ...
- JAVA基础之Servlet
个人理解: servlet是用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.需要注意的在创建的服务器端的目录和实际上存在差别的,并且访 ...
- Java 之 web 相关概念
一.软件架构 1.C/S:客户端/服务器端 2.B/S:浏览器/服务器端(目前常用) 二.网络资源 1.静态资源 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源,静态资源可以直接被浏览器 ...
- 利用.bat脚本使得可运行jar开机自动运行
1.利用Elipse到处可运行的jar包 2.写.bat脚本[点此下载],相应目录自己根据需要修改即可 3.将此脚本放在"启动"文件夹中
- Java经典逻辑编程50题 (转)
注: 转自https://blog.csdn.net/Alias_fa/article/details/52985112 (摘了题目部分和部分分析,想看原作代码的见原作链接) [程序1] 題目:古典 ...
- MySQL Replication--开启GTID模式下匿名事务异常
错误环境: OS: CentOS release 6.5 (Final) MySQL: MySQL 5.7.19 主从参数配置: master_info_repository = TABLE rela ...