汇编语言笔记10-CALL和RET指令
☞模块化程序设计
- 模块化程序设计
汇编语言通过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 }
汇编语言笔记10-CALL和RET指令相关推荐
- 王爽 《汇编语言》 读书笔记 十 CALL和RET指令
第十章 CALL和RET指令 call和ret都是转移指令,它们都修改IP,或同时修改CS和IP,常用于子程序的设计. 10.1 ret 和 retf ret用栈中的数据,修改IP的内容,从而实现近转 ...
- 王爽老师汇编语言第四版第十章CALL和RET指令——小白笔记
目录 10.1 ret和retf (1) ret: (2)retf: 10.2 call指令 10.3依据位移进行转移的CALL指令 10.4 转移的目的地址在指令中的CALL指令 10.5转移地址 ...
- 汇编语言笔记(10)CALL和RET指令
call和ret指令都是转移指令,它们都修改IP,或者同时修改CS和IP ret和reft ret指令用栈中的数据,修改IP的内容,从而实现近转移: retf指令用栈中的数据,修改CS和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 ...
- 《汇编语言》第10章 call和ret指令
call和ret指令都是转移指令,经们都修改IP,或同时修改CS和IP.它们经常被共同用来实现子程序的设计.这一章,我们讲解call和ret指令的原理. 10.1 ret和retf ret指令用栈中的 ...
- 汇编语言——第10章 CALL和RET指令
目录 引言 10.1 ret和retf 检测点10.1 10.2 call指令 10.3 依据位移进行转移的call指令 检测点10.2 10.4 转移的目的地址在指令中的call指令 检测点10.3 ...
- call指令和ret指令【笔记+详解】
笔记目录 call指令和ret指令[笔记] 1 引子 2 call和ret的简单运用 3 call指令本质含义详解 4 ret指令 5 总结及汇编环境资源 call指令和ret指令[笔记] 1 引子 ...
- 《汇编语言》第十章 call 和 ret 指令
call指令和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP,它们经常被共同用来实现子程序的设计 10.1 ret 和 retf ret指令用栈中的数据,修改IP的内容,从而实现近转移 ...
最新文章
- 低数值精度推理和训练
- 京东金融App收集用户敏感信息?致歉来了
- css03层次选择器
- Spring AOP中定义切点(PointCut)和通知(Advice)
- 【JVM性能调优】jstack和线程dump分析
- JAVA程序设计----练习题
- python学习总结----时间模块 and 虚拟环境(了解)
- c#课程设计简单题目_《C#项目案例》课程设计题目
- Linux笔记-centos7配置网卡及iftop的使用
- Qt工作笔记-QML自定义圆形进度条(C++后端处理数据)
- 爬虫-ProxyHandler代理类-通过代理发起请求
- JFreeChart柱状图单组柱子的不同颜色显示
- BarnBridge出现前端错误
- C#中根据传入的字符串字段返回实体Lambda表达式
- 数控加工中心编程和UG编程和什么区别
- c++ 取模和求余运算
- 51单片机--时钟芯片ds1302
- 2021裁判文书网抓取
- 命令行基础-vim编辑器
- php guzzlehttp,PHP 使用 Guzzle 发送 HTTP 请求
热门文章
- hdu4122 制作月饼完成订单的最小花费
- C语言经典例22-乒乓球比赛名单问题
- 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )
- 【C 语言】文件操作 ( 学生管理系统 | 命令行接收数据填充结构体 | 结构体写出到文件中 | 查询文件中的结构体数据 )
- 【Google Play】管理目标受众群体 ( 加入“亲子同乐计划“ 由于政策原因 “更新被拒“ 后的处理 )
- 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )
- css 垂直居中的几种方式
- [docker] 04 使用docker容器
- Protocol Buffer搭建及示例
- ASP.NET MVC笔记