Page 1 of 5

Trouble with assembler subroutines

PostPosted: Mon Nov 21, 2011 10:32 am
by RISCCISCInstSet
I've been having trouble with assembler subroutines - can you give me some help as to how they work?

Thanks

Re: Subroutines

PostPosted: Mon Nov 21, 2011 12:41 pm
by enrico-sorichetti
I posted this link already quite a few times
http://www.simotime.com/
the examples, COBOL,JCL,VSAM,ASSEMBLER are pretty clear and well documented/explained.

it Does not make any difference from a coding point of view if the Subroutine is <inline>( in the same source file) or <external> ( in a different source file )
only the compile link jcl will be different

Re: Subroutines

PostPosted: Mon Nov 21, 2011 6:39 pm
by BillW
There are multiple reasons to use subroutines in your assembler program. After awhile of writing assembler, you will notice yourself repeating a section of logic, changing only the variables that require manipulation,inspection,etc. You may think that you are clever and actually use the editor and copy the section of code that performs the logic you intend, then manually go in and change the variable names to the new ones you are working on, yet not change what you are doing to them. A real life example you ask. Well, suppose you want to look at a variable and determine the first blank character position (address) and the length of the non-blank portion. You could code up a small section of logic to do this, looping through the variable, inspecting each character in turn (from left to right, as that is how we store character variables in English (not sure what one would do in those cultures that do not). You have just learned a reason to use a subroutine.

The subroutine allows the programmer to write a section of logic and use it multiple times to perform the same (similar) action on different variables. To the previous example. We could write a small subroutine that takes as parameters the character variable starting address and the length of the variable, performs the search for the first blank character in the character variable, then returns the address of the first blank character and the count of the number of characters in the character variable from the start to the blank character. An important item here is that usually, we pass to the subroutine the address of a variable that we wish to work with (although there are other ways and methods). By passing the address of the variable, and having the subroutine use this address, we can make the subroutine useful for differing variables and hence not repeat common logic in the program.

Now that is one reason to use subroutines and there are many nuances to using subroutines. One of the larger things to think about is how to pass the values the subroutine requires to do it's work (or function). For an internal subroutine, this is easier, as you have complete control of how it is written and what it does. This is not necessarily the case for those routines written by others and linked in to your program. You have to be very careful to match what the subroutine expects for parameters (and how they are to be passed). Also, most external routines require that you provide the standard save area so that they may preserve the contents of the registers and restore them to the original values when it returns to you (unless a register is supposed to pass a value back in a register, like a return code in R15.

So there you have a brief introduction into why you would use a subroutine (but not so much how, as there are multiple ways to do so).

Hope this helps you.

Re: Trouble with assembler subroutines

PostPosted: Tue Nov 22, 2011 6:26 am
by steve-myers
It would help us if you provided some idea of the type of trouble you are having. Both BillW and Enrico are helpful but very generic. When I first looked at this Monday I thought of a generic response, but different than Enrico's and BillW's posts, but I think we need something more specific to really assist you.

Re: Trouble with assembler subroutines

PostPosted: Tue Nov 22, 2011 7:27 am
by RISCCISCInstSet
What I need to understand is: how shall I start up a simple internal subroutine such that I can call it? To call the subroutine, I invoke BAL
R14,subroutine - with subroutine being a selected name. To return from a subroutine, I code BR R14.

According to the material, a program begins with
ONE CSECT
       SAVE      (14,12)
       BALR      12,0
       USING     *,12
       LA          2,SAVEAREA
       ST          2,8(,13)
       ST          13,4(,2)
       LR          13,2
       â€¦
SAVEAREA DS 18F


A New Instruction - BAL

— The Branch and Link instruc4on or the Branch and Link Register
instruction is used, normally, for subroutine calls
— Their formats are:
     BAL  R_1,D_2(X_2,B_2)
     BALR  R_1,R_2
— The address of the next instruc4on is stored in R_1  before branching


Save Areas
A 72-­‐byte area
− SAVEAREA + 0 = unused
− SAVEAREA + 4 = Previous save area
− SAVEAREA + 8 = Next save area − SAVEAREA+12 = Return Address − SAVEAREA + 16 = EPA
− SAVEAREA+20 = Register 0
− SAVEAREA+24=Register 1
− …
− SAVEAREA + 68 = Register 12


Leaving a Program
       L    13,4(,13) 
−  Unchain save areas 
−  Point register 13 to the previous save area 
       RETURN  (14,12) 
−  An IBM macro 
−  Restores registers 14 through 12 from the values in the save area 
addressed by register 13 
−  Branches to the address in register 14


SUMRTN DS 0H
             PACK WORK8,0(5,R1)
             AP TOTAL,WORK8
             BR R15

Re: Trouble with assembler subroutines

PostPosted: Tue Nov 22, 2011 8:23 am
by steve-myers
You didn't show us how you call SUMRTN, perhap like this -
         LA    R1,DATA
         BAL   R15,SUMRTN
         ...
DATA     DC    CL5'00800' or perhaps ZL5'800'

Re: Trouble with assembler subroutines

PostPosted: Tue Nov 22, 2011 8:34 am
by RISCCISCInstSet
Actually I presented a subroutine call (abridged from that) in the form of BAL R14,subroutine, and a new line cut it off. I'm copying and pasting from a pdf, and it's treating me weird.

Is there any other information you have to offer?

Re: Trouble with assembler subroutines

PostPosted: Tue Nov 22, 2011 10:04 am
by RISCCISCInstSet
Complete Information about subroutine calls:

— Because the next instruc4on address is place in R1 before 
branching, R1 can be used as a return address from a 
subroutine 
— To enter a subroutine, you would code 
     BAL  R14,subroutine 
— To return from a subroutine, you would code 
     BR    R14

Re: Trouble with assembler subroutines

PostPosted: Tue Nov 22, 2011 11:39 am
by steve-myers
RISCCISCInstSet wrote:Complete Information about subroutine calls:...

— Because the next instruc4on address is place in R1 before 
branching, R1 can be used as a return address from a 
subroutine 
— To enter a subroutine, you would code 
     BAL  R14,subroutine 
— To return from a subroutine, you would code 
     BR    R14
This is far from complete, and it is not correct.
  • In the first bullet replace "R1" with "the link register".
  • There are many ways to call a subroutine.
    • The BAL, BAS, or BRAS instructions as indicated in the second and third bullets. These instructions do not place the address of the subroutine into register 15
    • The CALL macro. CALL is not commonly used for an internal routine, but there is no reason why it cannot be used.
    • The LINK macro to call a program in another load module.
    • The ATTACH macro to call a program in another load module and create a subtask to run the module asynchronously from the task that performs the ATTACH.
    • The LOAD macro to load a subroutine in another load module followed by the CALL macro to call the subroutine and the DELETE macro to remove the load module from storage. This sequence may be preferable to the LINK macro if it is done many times and the subroutine is reusable or reenterable.

Re: Trouble with assembler subroutines

PostPosted: Tue Nov 22, 2011 4:35 pm
by RISCCISCInstSet
There are many ways to call a subroutine.
Sorry; I didn't mean to imply it was the only possible way to call a subroutine.