0

I have a Metal C program where I am trying to add some static data via an __asm(“…” : DS(staticdata)) statement, but I am having some issues with the generated assembler code.

When I use my own prolog and epilog code, I get:

0007E6                00000 009A8  1997 CKKTESTR CSECT ,                                                         000000
0007E8                             1998 $STATIC  DS    0D                                                        000000
0007E8 0000000000000000            1999          DC    (336)X'00'                                                000000
000938                00938 00828  2000          ORG   $STATIC+64                                                000000
000828 0000000100000030            2001          DC    XL8'0000000100000030'                                     000000
000830                00830 00830  2002          ORG   $STATIC+72                                                000000
000830 F2F1C3E2D9C5C3D7            2003          DC    XL8'F2F1C3E2D9C5C3D7'                                     000000
000838                00838 007F8  2004          ORG   $STATIC+16                                                000000
0007F8 C5E2C54000000001            2005          DC    XL16'C5E2C540000000010000000100000090'                    000000
000808 0000009000000020            2006          DC    XL16'0000009000000020C5E2C3C100000001'                    000000
000818 0000000100000080            2007          DC    XL16'00000001000000800000008000000014'                    000000
000828                00828 007E8  2008          ORG   $STATIC                                                   000000
0007E8 00010000                    2009          DC    XL4'00010000'                                             000000
0007EC                007EC 007EC  2010          ORG   $STATIC+4                                                 000000
0007EC F2F1C3E200000000            2011          DC    XL12'F2F1C3E2000000007FFFFBAD'                            000000
0007F8                007F8 00938  2012          ORG   ,                                                         000000
                                   2013          LCLC  &DSMAC                                                    000000
                                   2014          LCLA  &DSSIZE                                                   000000
                                   2015          LCLA  &MSIZE                                                    000000
000938                00938 00838  2016          ORG   $STATIC+80                                                000000
                      00838        2017 @@LAB@3  EQU   *                                                         000000
000838                             2018          DS    0D                      Start copyright text on a         000000
                      00838        2019 TheESET  EQU   *                       Address of the ESES               000000
000838 F2F1C3E2                    2020          DC    CL4'21CSESES'           Control block eyecatcher          000000
                                   2021 *.DC.F'1'.Control block version                                          000000
                                   2022 *.DC.CL8'CKKTESTR'.CSECT name                                            000000
                                   2023 *.DC.CL8'HTES120'.FMID                                                   000000
                                   2024 *.DC.CL8'XXRMIDXX'.RMID                                                  000000
                                   2025 *.DC.CL8'21CS-TS1'.PID                                                   000000
                                   2026 *.DC.CL19'2020-07-04 02:25:21.816513'                                    000000
                                   2027 *.DC.CL5'    '.Pad with blanks                                           000000
                                   2028 *.DC.C'Copyright '.Copyright text                                        000000
                                   2029 *.DC.C'(C) Teracloud S.A. '.Copyright Teracloud S.A.                     000000
                                   2030 *.DC.C'1991,2001'.Insert the year(s)                                     000000
000840                             2031 EndCKKModId DS 0D                      End of ESES and copyright         000000
                      00008        2032 @@LAB@3L EQU   *-@@LAB@3                                                 000000
                                   2033 &DSMAC   SETC  '@@LAB@3'                                                 000000
                                   2034 &DSSIZE  SETA  256                                                       000000
                                   2035 &MSIZE   SETA  @@LAB@3L                                                  000000
** ASMA032E Relocatable value or unresolved symbol found when absolute value required - OPENC/@@LAB@3L                 
** ASMA435I Record 944 in SSAF.METALC.C.ASM(CKKTESTR) on volume: TSO001                                                
                                   2036          AIF   (&DSSIZE GE &MSIZE).@@OK@3                                000000
                                   2037 .@@OK@3  ANOP                                                            000000

Record 944 is “&MSIZE SETA @@LAB@3L”.

When I remove my #pragmas for the prologs and epilogs of the various routines in the module, I get very similar code, but it assembles cleanly (I renamed the program for expediency):

0002AA                00000 0044A   850 CKKTESTP CSECT ,                                                         000000
0002B0                              851 $STATIC  DS    0D                                                        000000
0002B0 0000000000000000             852          DC    (336)X'00'                                                000000
000400                00400 002F0   853          ORG   $STATIC+64                                                000000
0002F0 0000000100000030             854          DC    XL8'0000000100000030'                                     000000
0002F8                002F8 002F8   855          ORG   $STATIC+72                                                000000
0002F8 F2F1C3E2D9C5C3D7             856          DC    XL8'F2F1C3E2D9C5C3D7'                                     000000
000300                00300 002C0   857          ORG   $STATIC+16                                                000000
0002C0 C5E2C54000000001             858          DC    XL16'C5E2C540000000010000000100000090'                    000000
0002D0 0000009000000020             859          DC    XL16'0000009000000020C5E2C3C100000001'                    000000
0002E0 0000000100000080             860          DC    XL16'00000001000000800000008000000014'                    000000
0002F0                002F0 002B0   861          ORG   $STATIC                                                   000000
0002B0 00010000                     862          DC    XL4'00010000'                                             000000
0002B4                002B4 002B4   863          ORG   $STATIC+4                                                 000000
0002B4 F2F1C3E200000000             864          DC    XL12'F2F1C3E2000000007FFFFBAD'                            000000
0002C0                002C0 00400   865          ORG   ,                                                         000000
                                    866          LCLC  &DSMAC                                                    000000
                                    867          LCLA  &DSSIZE                                                   000000
                                    868          LCLA  &MSIZE                                                    000000
000400                00400 00300   869          ORG   $STATIC+80                                                000000
                      00300         870 @@LAB@5  EQU   *                                                         000000
000300                              871          DS    0D                      Start copyright text on a         000000
                      00300         872 TheESET  EQU   *                       Address of the ESES               000000
000300 F2F1C3E2                     873          DC    CL4'21CSESES'           Control block eyecatcher          000000
                                    874 *.DC.F'1'.Control block version                                          000000
                                    875 *.DC.CL8'CKKTESTR'.CSECT name                                            000000
                                    876 *.DC.CL8'HTES120'.FMID                                                   000000
                                    877 *.DC.CL8'XXRMIDXX'.RMID                                                  000000
                                    878 *.DC.CL8'21CS-TS1'.PID                                                   000000
                                    879 *.DC.CL19'2020-07-04 02:25:21.816513'                                    000000
                                    880 *.DC.CL5'    '.Pad with blanks                                           000000
                                    881 *.DC.C'Copyright '.Copyright text                                        000000
                                    882 *.DC.C'(C) Teracloud S.A. '.Copyright Teracloud S.A.                     000000
                                    883 *.DC.C'1991,2001'.Insert the year(s)                                     000000
000308                              884 EndCKKModId DS 0D                      End of ESES and copyright         000000
                      00008         885 @@LAB@5L EQU   *-@@LAB@5                                                 000000
                                    886 &DSMAC   SETC  '@@LAB@5'                                                 000000
                                    887 &DSSIZE  SETA  256                                                       000000
                                    888 &MSIZE   SETA  @@LAB@5L                                                  000000
                                    889          AIF   (&DSSIZE GE &MSIZE).@@OK@5                                000000
                                    890 .@@OK@5  ANOP                                                            000000 

For whatever reason, the generated DS uses @@LAB@5, but the “&MSIZE SETA @@LAB@5L” assembles without error here. Odd, because @@LAB@3L in the first program and @@LAB@5L in the second program evaluate to the same value:

                      00008        2032 @@LAB@3L EQU   *-@@LAB@3                                                 000000
-----------------------------------------------------------------------------------------------------------------------
                      00008         885 @@LAB@5L EQU   *-@@LAB@5                                                 000000

When I compare the two snippets (I removed the hex offsets and sequence information on the right), this is what I get:

====== CKKTESTR CSECT ,                                                                      
.OAAAA CKKTESTP CSECT ,                                                                      
000002 $STATIC  DS    0D                                                                     
000003          DC    (336)X'00'                                                             
000004          ORG   $STATIC+64                                                             
000005          DC    XL8'0000000100000030'                                                  
000006          ORG   $STATIC+72                                                             
000007          DC    XL8'F2F1C3E2D9C5C3D7'                                                  
000008          ORG   $STATIC+16                                                             
000009          DC    XL16'C5E2C540000000010000000100000090'                                 
000010          DC    XL16'0000009000000020C5E2C3C100000001'                                 
000011          DC    XL16'00000001000000800000008000000014'                                 
000012          ORG   $STATIC                                                                
000013          DC    XL4'00010000'                                                          
000014          ORG   $STATIC+4                                                              
000015          DC    XL12'F2F1C3E2000000007FFFFBAD'                                         
000016          ORG   ,                                                                      
000017          LCLC  &DSMAC                                                                 
000018          LCLA  &DSSIZE                                                                
000019          LCLA  &MSIZE                                                                 
000020          ORG   $STATIC+80                                                             
====== @@LAB@3  EQU   *                                                                      
.OAAAB @@LAB@5  EQU   *                                                                      
000022          DS    0D                      Start copyright text on a                      
000023 TheESET  EQU   *                       Address of the ESES                            
000024          DC    CL4'21CSESES'           Control block eyecatcher                       
000025 *.DC.F'1'.Control block version                                                       
000026 *.DC.CL8'CKKTESTR'.CSECT name                                                         
000027 *.DC.CL8'HTES120'.FMID                                                                
000028 *.DC.CL8'XXRMIDXX'.RMID                                                               
000029 *.DC.CL8'21CS-TS1'.PID                                                                
000030 *.DC.CL19'2020-07-04 02:25:21.816513'                                                 
000031 *.DC.CL5'    '.Pad with blanks                                                        
000032 *.DC.C'Copyright '.Copyright text                                                     
000033 *.DC.C'(C) Teracloud S.A. '.Copyright Teracloud S.A.                                  
000034 *.DC.C'1991,2001'.Insert the year(s)                                                  
000035 EndCKKModId DS 0D                      End of ESES and copyright                      
====== @@LAB@3L EQU   *-@@LAB@3                                                              
====== &DSMAC   SETC  '@@LAB@3'                                                              
.OAAAC @@LAB@5L EQU   *-@@LAB@5                                                              
.OAAAD &DSMAC   SETC  '@@LAB@5'                                                              
000038 &DSSIZE  SETA  256                                                                    
====== &MSIZE   SETA  @@LAB@3L                                                               
======          AIF   (&DSSIZE GE &MSIZE).@@OK@3                                             
====== .@@OK@3  ANOP                                                                         
.OAAAE &MSIZE   SETA  @@LAB@5L                                                               
.OAAAF          AIF   (&DSSIZE GE &MSIZE).@@OK@5                                             
.OAAAG .@@OK@5  ANOP                                                                         

The snippets are exactly the same, except for the labeling difference.

Any thoughts as to what I could have done in either/both of my prologs and epilogs which would perturb the assembler to cause this error.

Thanks, Scott

1 Answers1

0

With a great deal of online help from Steve Smith and Alex Brodsky, they (independently) discovered that "above" the displayed code (generated within my prolog), I had a DS statement that had a variable duplication factor that relied on a value that was "below" (declared by one of the macros in an insert_asm statement). This keeps the assembler from knowing at the time of the failing SETA statement what the location counter is and it fails, even though the results of the statement only needs the relative offsets.

For clarity, the point of the code being generated by the compiler is to ensure that the data generated within the __asm(...:DS...) statement is less than or equal to the length specified (defaults to 255).

From a user perspective, the error messages are inscrutable.

** ASMA032E Relocatable value or unresolved symbol found when absolute value required - OPENC/@@LAB@3L                 
** ASMA435I Record 944 in SSAF.METALC.C.ASM(CKKTESTR) on volume: TSO001

I'm guessing that OPENC means "open code," @@LAB@3L is where the failure is occuring, but looking at the output after the assembler is finished doesn't make it obvious that @@LAB@3L was somehow defective when the SETA was being processed.