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
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.
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.