Das ewige Problem mit den 4K bei Basisregistern

Text zuletzt geändert am 18.06.12 ./. Code 1.11.06
Jeder Assembler Programmierer hat in seinem Leben irgendwann den Entschluss gefasst "beim nächsten Programm wird alles anders", um das leidige Problem das ein Basisregister eben nur 4096 Bytes adressieren kann, zu lösen.

Wunderbar für eigene Programme- auch für neue Programme, wenn den ein Standards existiert der das Problem adressiert. Aber was ist mit den 3 oder 4 (oder mehr) Programmen, die von anderen geerbt wurden und nun gepflegt werden müssen?

Ich habe Installationen erlebt, in denen für jedes neue Ding (Funktion...es ist egal wie es heißt) musste eine andere Funktion entfernt werden.

Als IBM die R&I (Relative und Immediate Feature) Instruktionen vorgestellt hat (vor mehr als 10 Jahren) habe ich mir nicht vorstellen können, meine Gewohnheiten auf diese neuen Instruktionen umzustellen.

Meine Einstellung hat sich geändert.
Ich sehe die relativen Instruktionen als eine großartige Möglichkeit dem durchschnittlichen Betrieb (aber auch der reinen HLASM Installation) aus dem Dilemma zu helfen, daß Kode gepflegt werden muss der a priori falsch konstruiert wurde, aber keine Möglichkeit hat den Kode neu (von Scratch) zu konstruieren.

Lösung.
Mit einer kleinen Kodeänderung im Prolog/Initkode wie unten und IBMs COPY IEABRC werden alle Branch Instruktionen (nur RX typen) zu relativen Branch Instruktionen.
Die relativen Instruktionen erreichen eine Distanz von 64K vor und 64K nach der Instruktion (das entspricht 16 basis registern).
Die Einsparung liegt in der Verminderung von Basisregistern für den Kode. Wenn nur ein Register für den Kode benötigt wird und 3 Register für die Daten, ist die Einsparung natürlich nur ein Register.

Und der arme VSE Laden.
Bis IBM mein Requirement WAVV200623 oder etwas ähnliches unterstützt, habe ich mich entschieden ein Werkzeug auszugraben, welches ich im Oktober 2002 geschrieben habe (und dann vergessen). Es funktioniert etwas anders (und natürlich besser) als IBMs Werkzeug. Meine Lösung besteht aus
  1. eine SETCF Funktion, welche beim Install katalogisiert wird..
  2. ein COPY Buch, welches auch beim Install katalogisiert wird. 
Diese Methode würde auch im z/OS funktionieren und ich bin gerne bereit den Kode für MVS weiterzugeben, wenn jemand IEABRC nicht benutzen möchte. I weiß, daß Roland Schiradin Teile von SHOWMVS mit meiner Methode zeitweise (vor dem Totalumbau) umgebaut hat.

Kodeanpassungen.
Der Prolog eines Programmes muss angepaßt werden. Das gleiche gilt für den Anfang der Definitionen.Es gibt verschiedene Methoden. Hier ist meine:

nach Sicherung der Register
    BASR  R3,0
AHI R3,BASE_COVERED-*
USING BASE_COVERED,R3
nach allem Kode und vor den Datendefinitionen folgende Zeile einfügen (und LTORG verschieben)
BASE_COVERED  DS  0D
LTORG
Der Rest der Datendefinitionen folgt hier

Andere Probleme.
Ja, es gibt ein paar. Nichts das man nicht lösen kann. Das störendste Problem (m.E) in anderer Leute Kode ist die (z.T. falsche) Benutzung  von Schaltern in Instruktionen (NOP/B).

Ein weiteres Problem sind Makros mit Inlinedaten. Meistens gibt es RENT  Versionen (MF= oder MFG=), die dieses Problem eliminieren.

Es gibt aber Makros, die nicht funktionieren (sie MÜSSEN ein Basisregister haben oder ihre Operanden). Wenn das Problem in offiziellen APIs existiert, können Sie diese Probleme an IBM melden. Hier ist meine Sammlung von eingesandten Problemmakros. Die Macros sind alle aus VSE- Das hat einen einfachen Grund- in dem "anderen Betriebssystem" hat man sich commited derartige Problem sofort zu beheben.
Wenn Sie neue haben (oder eine neue Version ohne Probleme)  kontaktieren Sie mich bitte.
1 CALL (V-const wird generiert im Kode statt einem Literal)
1 EOJ (Name der Phase für LOAD inline statt Literal)
0 LIBRDCB (Die Adresse der EODAD, NOTFND, ERRAD, und SRVEXIT können nur als Register spezifiziert werden)
1 AMODESW (Das Label für Umschalten high/low wird mit LA geladen)
1 GETVCE (Obwohl MFG möglich ist, wird das Problem der Adressierung nicht voll gelöst)
1 DUMP (siehe EOJ und) ICM R15,8,* um einen negativen Wert in R15 zu laden(!)
1 STORAGE OBTAIN - einfache Lösung wäre ein JAS 15,label und dann L 15,0(,15) statt einen B (oder bei z/OS abschreiben)
Umgehung bis es sauber codiert ist:
1= temporäre addressablity nötig
0= Umgehung ist im Text

Aussicht Extra info
Während WAVV 2008 werde ich eine Session zu genau diesem Thema halten.
Diese Session ist eine verbesserte Version der Session von 2007.
Flip-chart & DEMO-program & switch-macros


Während dieser Text ziemlich betriebssystem-neutral ist, hier ein stärker z/OS gefärbter Vortrag zum selben Thema. Ausgezeichnet und gut bearbeitbar selbst ohne Edward Jaffe (der Vortragende) (im Gegensatz zu dem oben verlinktem Material).

Bei Fragen oder Anregungen bitte an mich eine E-Mail