事先在存储器开辟一片特定的空间用于存放腔者迅入口参数和出口参数
本质:利用寄存器实现多参数传递(寄存器中保存地址表的首地址)
将所有参数的地址存入地址表中,然后再将地址表的首地址传送到子程序。在嫌镇子程序中,可以按照地址伍此表中给出的地址,依次取出参数
汇编语言中主程序与子程序脊如参数传递的方法有以下几种:
1.寄存器法
寄存器法就是樱液启将入口参数和出口参数存放在约定的寄存器中。
优点:埋派数据传递书读快、编程较方便、节省内存单元。
缺点:当传递参数过多时候,由于寄存器个数有限,及寄存器的频繁使用,将导致寄存器不足。
适用:参数较少的子程序
2。约定单元法:
约定单元法顾名思义是吧入口参数和出口参数都放在事先约定好的单元中
优点:不占用寄存器、参数个数任意、每个子程序要处理的数据和送出的结构都有独立的存储单元
缺点:但用一定数量的存储单元,增加编程中对变量定义的难度
3.堆栈法
堆栈法是利用堆栈来传递参数的。
优点:参数不占用寄存器,和存储单元。参数存放在公共堆栈区,处理完后客恢复。参数个数一般不限
缺点:由于参数和子程序混杂在一起,存取参数时候必须小心计算它在堆栈中的位置。要注意断点的保存和恢复。
4.地址表法
这种方法是把参数组成的一张参数表放在某个存储区中,然后只要主程序和子程序约定好这个存储区的首地址和存放的内容,在主程序中将参数传递给地址表,在子程序中根据地址表给定的参数就可以完成 *** 作。
.global start 定义全局标号.sect ".resect"
B start
.text
.bss x,1 三个变量各为一个字(16位,非初始化段)
.bss y,1
.bss z,1
.textstart:
ldp #0 ;因下面诸变量使用直接寻址,装载DP值
splk #5,x ;变量赋初值,x=5
splk #6,y ; y=2
lacc x ;将x的值装载至累加器
add y ;累加器加上y的值
sacl z ;将累加器结果(32位)的低16位存放到变量z
ldp #4 ;直接寻址,装载DP值,页指针指向片内数据区DARAM B0
splk #1,1 绝对地址201H开始的四个单元存1,2,3,4
splk #2,2
splk #3,3
splk #4,4以下使用间接寻址将201H开始的4个悄型单元的启老猜数
转存到300H开始的4个单元 lar ar0,#201h 源起始地址存在辅助寄存器0
lar ar1,#300h ;目的起始地址存在辅助寄存器1
lar ar2,#3 循环计数值为移动数-1
mar *,ar0 设置当前辅助寄存器为ar0loop1:;开始循环搬移数据
lacc *+,ar1 ;将当前辅助寄存器(ar0);所
;指向的数据内存单元的值装载到acc,
ar0加1,设置当前辅助寄存器为ar1
sacl *+,ar2 acc低16位存放到当前辅助寄存;器(ar1)指定的单元
ar1加1,设置当前辅助寄存器为ar2
banz loop1,ar0 当前辅助寄存器(ar2)如果不等于0则当前辅助寄 存器(ar2)减含神1,转loop1xh: B xh 空循环
.end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)