汇编-子程序参数传递的三种方式-寄存器法,堆栈法,参数赋值法【详述后两者】
汇编-子程序参数传递的三种方式:
寄存器法,堆栈法,参数赋值法
子程序结构如下:
名称 PROC FAR|NEAR;DO SOMETHINGRET [N];返回断点地址,N可忽略,加了必须对SP进行 平栈 操作名称 ENDP
结合此结构,我们来看,
1.寄存器法
这个方法最简单易用,但是要注意对寄存器的选择,一般选ABCD[X]通用寄存器就可以了。
步骤如下:
1.通过MOV指令将参数存到寄存器
2.再在子程序中调用寄存器即可【注意保护寄存器】
样例就不给了。
2.堆栈法
过程是:
1.先将参数入栈
2.然后在子程序中使用SP,BP,SI这三个寄存器,对栈值(参数)进行取出利用
样例如下:
参数压栈:
MOV CX,01H; 压入初始奇数1参数PUSH CX; 压入结束参数50MOV CX,50PUSH CX
子程序参数利用:
; 利用栈指针SP取栈值MOV BP,SP; 取结束参数50,字; 栈底是高地址段MOV AX,[BP+2]; 取初始参数1MOV BX,[BP+4]
注意:
在利用寄存器取值时要注意参数存储的物理结构,本例参数都是字变量,所以以2为单位进行取值
栈的地段的地址段会越来越高
既是:例如取栈顶时:
应当取SP+2,当然写成[SP+2]是错的,
需要:[BP+2]
如上例。
3.参数赋值法
这一个最是麻烦,但是用会了也就没什么了。
原理如下:
代码段CS定义变量进行参数存储,然后供各个程序模块【子程序,同一源文件】使用【特殊的存取】。
将参数存放到CALL指令后的一串单元中,子程序通过返回地址【断点地址】存取参数并修改返回地址。
步骤是:
在CALL指令调用后,在CS定义自己的数据参数
然后利用SP,BP获取CALL指令执行后的断点地址
此时断点地址后就是对应的参数区
可通过SI取得对应参数
最后在RET前修改栈顶的值为参数区后的地址值【不强制规定,但一般都是】,
做PUSH(一定要先将原断点POP)
就能越过参数区做下一步操作
样例如下:
对参数的定义,
; call求和子程序CALL sumsub; 参数定义NUM DW 50;结束参数DW 1;初始奇数; 输出NEXT: CALL pf
子程序调用参数:
; 获取断点地址做SIMOV BP,SPMOV SI,[BP]; 取代码段中变量;结束50MOV AX,CS:[SI+0]; 开始1MOV BX,CS:[SI+2];;;参数利用;;;修改当前断点【修改栈顶的地址断点】;清除默认断点地址POP CX;取自己要执行的断点位置地址MOV CX,OFFSET NEXT;修改PUSH CX
RET
注意:
NEXT是程序返回后要执行的位置【在参数定义后】
CX不做固定,根据自己需要可以更换寄存器,只是不能使得入栈的变量是一个立即数罢了。
在子程序取得了当前执行断点后,开始取定义在CS中的参数,
需要修改默认段基址DS为CS
完。
可能写的不好,但还是求赞!
努力!
汇编-子程序参数传递的三种方式-寄存器法,堆栈法,参数赋值法【详述后两者】相关推荐
- 第二周项目1函数参数传递的三种方式
/* .*Copyright (c) 2014,烟台大学计算机学院 *All right reserved. *文件名称:函数参数传递的三种方式.cpp *作者:彭子竹 *完成日期:2015年9月11 ...
- Java 定义数组的三种方式,int...x动态参数列表
定义数组的三种方式 以 int型 的一维数组为例,说说三种定义方式 int[] arr = new int[3]; 这是最常用的方式,定义时就含有默认值,可以后续赋值 public class Dem ...
- python中函数参数传递的三种方式_python中函数参数传递的几种方法
转自 http://www.douban.com/note/13413855/ Python中函数参数的传递是通过"赋值"来传递的.但这条规则只回答了函数参数传递的"战 ...
- 项目1- C/C++语言中函数参数传递的三种方式
<span style="font-size:18px;">问题及代码:</span> <span style="font-size:18p ...
- c/c++语言中函数参数传递的三种方式——徐吉平
此篇为本人处女作,希望大家多多指正 1.这是c/c++中的函数传值方式,函数中只交换了 形参x,y的数值,而实参a,b的值并没有发生变化 #include <stdio.h> void m ...
- 第2周项目1c++语言中函数参数传递的三种方式
copyright (t) 2017,烟台大学计算机学院*All rights reserved.*文件名称:1.cpp*作者:邵雪源*完成日期:2017年9月7日*版本号:v1.0 */ #incl ...
- 二维数组作为函数参数传递的三种方式
指针 1.形参声明为二维数组 2.形参声明为一级指针 3.形参声明为二级指针 指针 关于指针的介绍和基础应用推荐一位B站up主的视频 [C指针]十分钟.你要是听不懂.我当场就把这个编译器- 1.形参声 ...
- struts2获取请求参数的三种方式及传递给JSP参数的方式
接上一篇文章 package test;import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.*; impor ...
- 函数参数传递三种方式(传值方式,地址传递,引用传递)
函数参数传递三种方式(传值方式,地址传递,引用传递) 形参与实参 形参即形式上的参数,对实参的一种抽象类型描述只是声明一个函数能够接受什么类型的实参,而不确定接受的实参的具体内容是什么 实参即传递给函 ...
最新文章
- qt 制作记事本_23.QT记事本
- php session修改时间,PHP如何修改SESSION有效时间?
- vue-devtools chrome 开发工具
- 豆瓣9.6分!再一次被BBC的纪录片震惊!
- lock是悲观锁还是乐观锁_图文并茂的带你彻底理解悲观锁与乐观锁
- PAT 1012 数字分类 (20 分)(C语言)
- python之路-操作系统
- lm opencv 算法_LM算法
- 百度网盘链接在线解析网站_利用在线服务下载百度网盘的文件
- 计算机产品校园营销方案,惠普笔记本电脑校园营销策划方案.doc
- Android基础篇-四大组件之使用ContentProvider实现数据共享
- Mysql数据库用户密码暴力破解
- 重定向时,将Unreal4骨骼调整为Tpose
- java程序笑脸怎么打_我编写的JAVA程序为什么在编译执行后会先打出一个笑脸呢?...
- ij idea(2021)的jdk版本可能和本地的有冲突
- Unity3D之协程(Coroutines Yield )
- 图片存储到webapp同级目录
- 极路由B70刷breed,刷灯大固件,简明步骤(转自恩山无线论坛)
- 2020复工后刷脸支付将迎来高潮
- 备份文件系统中的文件到磁带库中(四)
热门文章
- Nuget 多平台多目标快速自动打包
- maven选包算法(两个相同的包)
- MVC4将Controller与views分开
- 学术与技术(与队长交流偶得)
- 【数据结构与算法】之深入解析“组合总和III”的求解思路与算法示例
- Git之深入解析工作流程、常用命令与Reset模式分析
- 【数据结构与算法】之深入解析“贪心算法“的原理解析和算法实现
- HarmonyOS之基础环境和应用开发流程
- 实现iOS App的在线安装
- 2018/Province_Java_A/1/分数