Page 1 of 1

Assembler first program failed with S0C1

Posted: Mon Jun 04, 2018 11:12 pm
by kingo
Hi,

I am trying to learn and practice Assembler. I tried to execute one of the program in Bill Quall's book and it failed with s0c1

Code: Select all

----+----1----+----2----+----
*****************************
         PRINT  NOGEN
TEST     START  0
         BASR   15,0
         USING  *,15
         WTO    T1
T1       DC     C'TEST'
         END    TEST
I got the abend below :

Code: Select all

COMPLETION CODE      SYSTEM = 0C1      REASON CODE = 00000001

  PSW AT ENTRY TO ABEND   078D0000  00007014  ILC  06  INTC  0001
PSW LOAD MODULE             ADDRESS = 00007000  OFFSET = 00000014
What could be the issue,could someone guide me please?

Re: Assembler first program failed with S0C1

Posted: Mon Jun 04, 2018 11:49 pm
by Robert Sample
After the WTO, you then attempt to execute 'TEST' as assembler instructions. This is not going to work -- obviously (even if the hex values were valid assembler instructions, you're almost certainly not going to have the required data for the assembler instructions available). You need to have a BR 14 (or whatever was in the program you copied) to exit the program BEFORE the constant.

Side comment: PRINT NOGEN is not a good thing to put in an assembler program unless it has lots of macros. You want to see the generated offsets because if you have an abend, the offset of the abend is displayed to at least get you started on where to look for the problem.

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 12:22 am
by kingo
Hi Robert,

Thank you for your response

I corrected the code as suggested

Code: Select all

TEST     CSECT
         STM   14,12,12(13)     STANDARD ENTRY
         BASR  12,0
         USING *,12
         ST    13,SAVE+4
         LA    13,SAVE
         L     13,SAVE+4
         WTO   'HELLO'
         WTO   'JUST1'
         WTO   T1
         LM    14,12,12(13)
         LA    15,0
         BR    14
SAVE     DS    18F
T1       DC    C'TEST'
         END   TEST
This executed ok but I don't see T1 being written and the rest HELLO and JUST1 is displayed, could you please tell me why T1 not being displayed?

Thanks

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 1:01 am
by Robert Sample
Try these code changes:

Code: Select all

         WTO   TEXT=(T1)
 .
 .
 .
 T1      0DS   CL6
         DC    H'04'
         DC    C'TEST'
The first two messages have their length known when the assembly is done since they are constants. WTO T1, however, is not a valid WTO message and requires you to use the variable-length record format and hence you have to provide the length of the message as a half-word before the actual text. You use WTO TEXT=(T1) to indicate what the message and its length are. You'll want to read up on WTO if you want to use it for much, as there are a number of things to understand about how it works.

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 2:49 am
by kingo
Hi Robert,

Thanks again, I modified the code as suggested

Code: Select all

TEST     CSECT
         STM   14,12,12(13)     STANDARD ENTRY
         BASR  12,0
         USING *,12
         ST    13,SAVE+4
         LA    13,SAVE
         L     13,SAVE+4
         WTO   'HELLO'
         WTO   'JUST1'
         WTO   TEXT=(T1)
         LM    14,12,12(13)
         LA    15,0
         BR    14
SAVE     DS    18F
T1       0DS   CL6
         DC    H'04'
         DC    C'TEST'
         END   TEST
It fails in compiler with

Code: Select all

** ASMA141E Bad character in operation code - 0DS


Do I need to add X at 72 for group variables?

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 3:01 am
by Robert Sample
No, change the code to

Code: Select all

T1       DS    0CL6
My fault -- I didn't have time to check the syntax before I sent the email, and I was distracted by something else going on.

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 3:19 am
by kingo
Hi Robert,

Thanks it is fixed now and I apologies for not reporting an another error earlier and I did not report it at first place as I assumed it could be due to T1 was not defined earlier.

But after making adjustments I get this error during compile

Code: Select all

  Loc    Object Code      Addr1    Addr2    Stmt  Source Statement
000000A8 18E1                                 58+         LR    14,1
000000AA 1BFF                                 59+         SR    15,15
000000AC 4AF1 0000               00000000     60+         AH    15,0(1,0)
000000B0 1AEF                                 61+         AR    14,15
000000B2 0000 0000               00000000     62+         ST    T1,4(0,1)
** ASMA029E Incorrect register specification - T1

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 3:32 am
by Robert Sample
I don't use WTO often enough to remember it well. Try this:

Code: Select all

         LA    5,T1
         WTO   TEXT=(5)

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 4:04 am
by kingo
Hi Robert,

This worked liked a charm
Thanks a bunch

Code: Select all

TEST     CSECT
         STM   14,12,12(13)     STANDARD ENTRY
         BASR  12,0
         USING *,12
         ST    13,SAVE+4
         LA    13,SAVE
         L     13,SAVE+4
         WTO   'HELLO'
         WTO   'JUST1'
         LA    5,T1
         WTO   TEXT=(5)
         LM    14,12,12(13)
         LA    15,0
         BR    14
SAVE     DS    18F
T1       DS    0CL6
         DC    H'04'
         DC    C'TEST'
         END   TEST
This worked liked a charm

And as my next try I tried to write to spool

by adding logic like below

Code: Select all

TEST     CSECT
         STM   14,12,12(13)     STANDARD ENTRY
         BASR  12,0
         USING *,12
         ST    13,SAVE+4
         LA    13,SAVE
         L     13,SAVE+4
         WTO   'HELLO'
         WTO   'JUST1'
         OPEN  (SYSOUT,OUTPUT)
         MVC   OUTR,T1
         PUT   SYSOUT,OUTR
         CLOSE SYSOUT
         LM    14,12,12(13)
         LA    15,0
         BR    14
SAVE     DS    18F
T1       DS    0CL6
         DC    H'04'
         DC    C'TEST'
OUTR     DS    CL6
SYSOUT   DCB   DDNAME=SYSOUT,DSORG=PS,MACRF=PM,RECFM=FB,LRECL=80
         END   TEST
Though I see an entry in SYSOUT in spool the job is not ending , Have I triggered a loop here ?

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 5:30 am
by Robert Sample
You are not using standard assembler save area linking, so yes it's possible you've got a loop going. Try changing to:

Code: Select all

TEST     CSECT
         BASR  12,0
         USING *,12
         ST    13,SAVE+4     SAVE BACK CHAIN
         LA    11,SAVE       SET UP FORWARD CHAIN
         ST    11,8(13)      SAVE FORWARD CHAIN
         LR    13,11         SET UP FOR NEXT SAVE AREA CHAIN
         WTO   'HELLO'
         WTO   'JUST1'
         OPEN  (SYSOUT,OUTPUT)
         MVC   OUTR,T1
         PUT   SYSOUT,OUTR
         CLOSE SYSOUT
         L     13,SAVE+4     GET BACK CHAIN
         LM    14,12,12(13)  RESTORE REGISTERS
         LA    15,0
         BR    14
SAVE     DS    18F
T1       DS    0CL6
         DC    H'04'
         DC    C'TEST'
OUTR     DS    CL6
SYSOUT   DCB   DDNAME=SYSOUT,DSORG=PS,MACRF=PM,RECFM=FB,LRECL=80
         END   TEST

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 8:23 pm
by kingo
Hi Robert,

I tried your solution it wrote the record to SYSOUT but it is abending with S0C1, I guess it could be something to do with exit is not happening properly not sure though.

PS: Also apologies for replying a bit late I was trying to fix the issue with help of google and I am not successful so far.

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 8:41 pm
by Robert Sample
Well no wonder -- I deleted the line to save the registers somehow!

Code: Select all

         BASR  12,0
         USING *,12
         SAVE (14,12)
         ST    13,SAVE+4     SAVE BACK CHAIN
         LA    11,SAVE       SET UP FORWARD CHAIN
         ST    11,8(13)      SAVE FORWARD CHAIN
         LR    13,11         SET UP FOR NEXT SAVE AREA CHAIN
This code has a slight contradiction -- you are using register 12 as a base register and not saving it before doing so, hence the value of register 12 better not be needed by the calling program. A way to keep register 12 from being wiped out:

Code: Select all

TEST     CSECT
         USING TEST,15
         SAVE  (14,12)
         BASR  12,0
         USING *,12
(since register 15 has the address of TEST when the program starts) and continue with the save area chaining code.

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 8:58 pm
by kingo
Thanks Robert , It worked :)

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 9:12 pm
by Robert Sample
As you get more into assembler, you might want to use YREGS, SAVE, RETURN macros (they are kept in SYS1.MACLIB so you may need to put //SYSLIB DD DISP=SHR,DSN=SYS1.MACLIB in your assembly JCL -- if you are using a prepared procedure (PROC) this may be already present), or create your own copies of the macros. YREGS does equates on R0 through R9, R10 through R15 to 0 through 15. This allows you to see register usage in your assembler cross-reference. SAVE saves your registers and RETURN restores the registers (and optionally sets a return code) before doing a BR 14 to exit. Learn what the options at the top of the assembly output mean and when to use each -- they can be EXTREMELY helpful in providing information that helps you debug problems.

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 10:09 pm
by kingo
Hi Robert,

Yeah, Thanks I am hoping to move on step by step like practising below
- MOVE
- STRING FUNCTIONS
- LOOPS
- CONDITION AND BRANCHING
- FILE OPERATIONS
- ARITHMETIC FUNCTION
- REPORTING
- ADDRESS DB2 CICS ( Again not sure of the feasibility)
- SYSTEM FUNCTION like ( TSO , ISPF , REXX - Not sure if this could be achieved soon But I am determined to Master :)

I might be posting a lot of queries until I master.

Thanks again for your support.

Re: Assembler first program failed with S0C1

Posted: Tue Jun 05, 2018 11:37 pm
by Robert Sample
Also, there is a SNAP macro that can dump memory and / or registers so you don't have to keep using WTO (trust me, operators really don't like superfluous WTO). I'll put together something on its use when I get a chance.

Re: Assembler first program failed with S0C1

Posted: Wed Jun 06, 2018 12:00 am
by kingo
Hi Robert,

Thats why I was trying to figure out writing to SYSOUT so operators don't need to call me :)
I heard about SNAP I am yet to try that.

Re: Assembler first program failed with S0C1

Posted: Wed Jun 06, 2018 12:16 am
by Robert Sample
It's fairly easy to use:

Code: Select all

         OPEN  (SNAPOUT,OUTPUT)
         .
         .
         .
         SNAP  DCB=SNAPOUT,ID=000,PDATA=REGS,STORAGE=(start,end)
         .
         .
         .
         CLOSE (SNAPOUT)
         .
         .
         .
SNAPOUT  DCB   DSORG=PS,RECFM=VBA,MACRF=(W),BLKSIZE=1632,LRECL=125,    X
               DDNAME=SNAPPRNT,DCBE=SNAPOUTX
SNAPOUTX DCBE  RMODE31=BUFF
(start,end) represent the starting and ending locations of memory to dump -- you can use addresses (variable names) in your program or registers in parentheses. The DCBE allows the code to run with 24-bit or 31-bit addressing. ID= can have any value from 0 to 255 and allows you to identify which SNAP output is which, as a part of the page header gives you the ID value. The DCB parameters are what they are for a reason, so just code it as you see it here.

Re: Assembler first program failed with S0C1

Posted: Wed Jun 06, 2018 1:36 am
by kingo
Sure Robert I will try that :) Thank you