| 作者 | 主题 |
|---|---|
|
芳季 至圣
经验值:72116 发帖数:15505 精华帖:101 |
楼主
主题:子程序要用上16个以上传入传出参数,你可以这么做。
方法我想到了两个。
第一。间接寻址。 第二。库内存。 下面简单解释一下。 间接寻址需要在子程序内部重新计算指针,然后才能做相应的读写。因为你再没有多余的参数可以接驳子程序。每次使用额外的参数都要这么做。 因为间接寻址作为参数的话只有一种方法(也可以适当变通),就是把&Xyyyy作为参数传进去子程序,然后这个参数目标的下一个地址&X(yyyy+1)要通过双字加指令对指针进行加法操作,然后读写。至于这个双字加计算,可以在子程序里加任何一个值(或者减)就可以找到任何的地址。 要子程序每次都这么的计算一次双字加指令挺费时间的。想稍微缓解一下这个事情,可以把很经常用的地址计算好后的值写入L里面。 例如:传入参数是&vb0。vb0这个参数可以直接使用传入参数就可以读写,不必计算。而vb16这个地址也经常使用,也希望可以直接引用。就可以用双字加计算了vb0+16的结果,然后把结果(80000010)保存在LD56里面。以后就可以直接引用*LD56找到目的地址。此时L区可以帮你保存好几个待命指针值。 然而,LD的范围相当有限,当你记录了好几个直接引用的结果的时候,LD区域几乎耗尽了,剩下的空间是要留一部分让出来给temp参数使用的,输入输出参数就更加必须的啦。所以还有参数要传入的话就只能再次经过双字加计算了。耗费时间的情况不可避免。 这个时候你还希望有更多空间可以直接引用的话,那么话题来了。库内存。 把上述事情的计算结果直接写到库内存里面,这就有相当大的空间保存待命指针值了。 更进一步,把参数直接写在库内存里面,就可以直读参数。错了,错了,这个错了,不可以直接把参数保存在库里面。因为一个子程序多次调用的,而每个子程序的参数不尽相同。你不可能做库程序的时候可以预知而且预留这个子程序可以使用n次的参数空间。所以你只能把跟多的待命参数保存在库中。(这里可能很难理解,回帖再议论) 以上L区相当于电脑cpu的L1L2高速缓存,库相当于电脑的常规内存。高速缓存就是经常用的数据的存放的。一个子程序调用一次,某一个地址有可能要使用到几次十几次的,是有必要把指针缓冲到高速缓存。 综上所述,使用间接寻址是可以非常灵活地把参数扩展成任意的。 那么库呢? 简单讲,库不可以直接装载参数,除非此子程序只使用一次。 |