ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University) (12/28/90)
I can use the "reg" directive to give a symbolic name to a set of registers, for example RegsUsed reg d3/a2-a4 Then I can put a movem.l RegsUsed, -(sp) at the beginning of a block of code, and movem.l (sp)+, RegsUsed at the end, and if I ever change the code to use a different set of registers, I only have to update one line to do the proper save/restore, instead of two. However, in this block of code, I also want to access arguments and return results on the stack, using instructions like move.l Result, 4+Something(sp) The problem is this "Something": its value depends on the exact number of registers in RegsUsed. I see no way of automatically computing it from RegsUsed, for example using a hypothetical macro function as follows: move.l Result, 4+4*&NumberOfRegsIn(RegsUsed)(sp) The only alternative seems to be to maintain the register list as a string, and use some of the macro functions to parse this list into its pieces myself, and not use the "reg" directive at all. Otherwise, I have to count up the offset myself, *and* remember to update it if the number of registers I'm using changes. More chances for things to go wrong. Another solution, of course, is to use a stack frame register and offset from that to the result area. But that means saving/restoring another register--and if I weren't worried about the overhead of this, I wouldn't be using assembly language in the first place. Any ideas, anybody? I agree it's only a minor inelegance, but... Lawrence D'Oliveiro fone: +64-71-562-889 Computer Services Dept fax: +64-71-384-066 University of Waikato electric mail: ldo@waikato.ac.nz Hamilton, New Zealand 37^ 47' 26" S, 175^ 19' 7" E, GMT+13:00
Lawrence.DOliveiro@f20.n226.z1.FIDONET.ORG (Lawrence DOliveiro) (12/28/90)
Reply-To: ldo@waikato.ac.nz I can use the "reg" directive to give a symbolic name to a set of registers, for example RegsUsed reg d3/a2-a4 Then I can put a movem.l RegsUsed, -(sp) at the beginning of a block of code, and movem.l (sp)+, RegsUsed at the end, and if I ever change the code to use a different set of registers, I only have to update one line to do the proper save/restore, instead of two. However, in this block of code, I also want to access arguments and return results on the stack, using instructions like move.l Result, 4+Something(sp) The problem is this "Something": its value depends on the exact number of registers in RegsUsed. I see no way of automatically computing it from RegsUsed, for example using a hypothetical macro function as follows: move.l Result, 4+4*&NumberOfRegsIn(RegsUsed)(sp) The only alternative seems to be to maintain the register list as a string, and use some of the macro functions to parse this list into its pieces myself, and not use the "reg" directive at all. Otherwise, I have to count up the offset myself, *and* remember to update it if the number of registers I'm using changes. More chances for things to go wrong. Another solution, of course, is to use a stack frame register and offset from that to the result area. But that means saving/restoring another register--and if I weren't worried about the overhead of this, I wouldn't be using assembly language in the first place. Any ideas, anybody? I agree it's only a minor inelegance, but... Lawrence D'Oliveiro fone: +64-71-562-889 Computer Services Dept fax: +64-71-384-066 University of Waikato electric mail: ldo@waikato.ac.nz Hamilton, New Zealand 37^ 47' 26" S, 175^ 19' 7" E, GMT+13:00 + Organization: University of Waikato, Hamilton, New Zealand -- Lawrence DOliveiro - via FidoNet node 1:105/14 UUCP: ...!{uunet!glacier, ..reed.bitnet}!busker!226!20!Lawrence.DOliveiro INTERNET: Lawrence.DOliveiro@f20.n226.z1.FIDONET.ORG