Instructieset van IBM 360

De tabellen hieronder tonen de volledige instructieset van de IBM Systeem/360.

Opmaak van instructiesBewerken

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
RR opcode Register 1 Register 2
RX opcode Register indeX Basis offset
SI opcode Immediate Basis offset
RS opcode Register 1 Register 2 Basis offset
SS opcode Lengte Basis 1 offset Basis 2 offset
Lengte 1 Lengte 2

RR: De meeste instructies in de rijen 0, 1, 2 en 3 zijn RR-instructies. Ze zijn twee bytes lang. Na de opcode worden twee registers genoemd. Bijvoorbeeld, de instructie AR 6,14 (interne code 1A6E) telt register 14 bij register 6 op.

RX: De instructies in de rijen 4, 5, 6 en 7 zijn RX-instructies. Ze zijn vier bytes lang. De ene operand is het register R. De andere operand bestaat uit een basisregister (B), een indexregister (X) en een offset van 12 bits. De instructie werkt met een geheugenadres dat wordt bepaald door de offset en de inhoud van B en X bij elkaar op te tellen.

Het basisregister wijst meestal naar het begin van het programma. Het wordt aan het begin van het programma geladen en daarna niet meer veranderd. Een klein programma heeft aan een enkel basisregister voldoende. Het indexregister kan worden gebruikt om arrays te adresseren.

Register 0 kan niet worden gebruikt als basis- of indexregister. Is er geen basis- of indexregister nodig, dan geeft men dus 0 op.

RS: Een aantal instructies in de rijen 8 en 9 zijn RS-instructies. Deze zijn net als RX-instructies, maar er zijn drie operanden: twee registers (R1 en R2) en een adres dat bestaat uit een basisregister en een offset van 12 bits. Er is dus geen indexregister zoals bij de RX-instructies. Bij sommige RS-instructies wordt R2 niet gebruikt.

SI: Andere instructies in de rijen 8 en 9, A en B zijn SI-instructies. Ze zijn vier bytes lang. De ene operand is direct in de instructie opgenomen. Dit heet immediate. De andere operand bestaat uit een basisregister en een offset van 12 bits, dus net als bij de RX-instructies, maar zonder indexregister. Er zijn ook SI-instructies waarbij de immediate operand niet wordt gebruikt.

SS: De instructies in de rijen C, D en F zijn SS-instructies. Ze zijn zes bytes lang. Beide operanden bestaan uit een basisregister en een offset. Verder is in de instructie de lengte van de operanden opgenomen. Soms is er één lengte (8 bits), soms twee (elk 4 bits). De waarde van de lengte is minimaal 1, maximaal 256 respectievelijk 16.

Tabel van instructiesBewerken

De geprivilegieerde instructies hebben een gele achtergrond.

Sommige instructies zijn alleen beschikbaar op een uitbreiding van het systeem. Het zijn:

  • rood: Protection feature
  • blauw: Decimal feature (commerciële instructieset)
  • groen: Floating-point feature (wetenschappelijke instructieset)
  • roze: IBM 370

De tekst bovenaan en links geeft aan wat de meeste instructies in die regel of kolom doen. Hierop zijn uitzonderingen.

tweede nibble→ 0 1 2 3 4 5 6 7 8 9 A B C D E F
Load Positive Load Negative Load & Test Load Comp-
lement
Set Program Mask Branch
And Link
Branch on CounT Branch on Condition Set Storage Key Insert Storage Key Super-
Visor Call
ConVert to Decimal ConVert to Binary
STore Load Address Insert aNd Compare Logical Or Xor Load Com-
pare
Add Sub-
tract
Mult-
iply
Div-
ide
Add Logical Subtract Logical
Halve Loud Rounded Multiply Add Unnormal-
ised
Subtract Unnormal-
ised
eerste nibble↓ EXecute Add Subtract
0 programmabesturing SPM BALR BCTR BCR1 SSK ISK SVC MVCL CLCL
1 32-bits integer in registers LPR LNR LTR LCR NR CLR OR XR LR CR AR SR MR DR ALR SLR
2 64-bits drijvende komma in registers LPDR LNDR LTDR LCDR HDR LRDR MXR MXDR LDR CDR ADR SDR MDR DDR AWR SWR
3 32-bits drijvende komma in registers LPER LNER LTER LCER HER LRER AXR SXR LER CER AER SER MER DER AUR SUR
4 16-bits integer STH LA STC IC EX BAL BCT BC1 LH CH AH SH MH CVD CVB
5 32-bits integer ST N CL O X L C A S M D AL SL
6 64-bits drijvende komma STD MXD LD CD AD SD MD DD AW SW
7 32-bits drijvende komma STE LE CE AE SE ME DE AU SU
eerste nibble↓ Set System Mask Test Mask Load PSW Diagnose WRite Direct ReaD Direct Branch indeX High Branch indeX Low or Equal Shift Right Shift Left Shift Right Shift Left Shift Right Shift Left Shift Right Shift Left
STore MoVe Immediate Test and Set aNd Compare Logical Or Xor Load Start IO Test IO Halt IO Test CHannel
8 schuifinstructies SSM LPSW diagnose WRD RDD BXH BXLE SRL SLL SRA SLA SRDL SLDL SRDA SLDA
9 Immediate STM TM MVI TS NI CLI OI XI LM SIO TIO HIO TCH
A STNSM STOSM SIGP MC
B LRA diverse STCTL LCTL CS CDS CLM STCM ICM
MoVe MoVe Characters MoVe aNd Com-
pare
Logical
Or Xor Zero
and
Add
Com-
pare
Add Sub-
tract
TRans-
late
Trans-
late and Test
EDit Edit
and
MarK
eerste nibble↓ PACK UNPacK Mult-
iply
Div-
ide
C
D reeks bytes in geheugen MVN MVC MVZ NC CLC OC XC TR TRT ED EDMK
E
F decimaal SRP MVO PACK UNPK ZAP CP AP SP MP DP

Uitgebreide mnemonische codesBewerken

1 De instructie BC krijgt als operand een conditie en een sprongadres. Om de programmering te vereenvoudigen zijn er uitgebreide mnemonische codes waarin de conditie al verwerkt is. Ook de instructie BCR heeft die mogelijkheid, maar alleen als de conditie 0 of 15 is. Merk op dat een enkele mnemonic meerdere betekenissen kan hebben: BM betekent if minus of if mixed, te gebruiken op het resultaat van een berekening of op TM. In beide gevallen wordt de conditie geassembleerd als 4.

Mnemonisch Voorwaarde Met BC(R) Opmerking
NOP(R) A geen sprong BC(R) 0,A Hoewel het geen effect heeft, moet er ook na NOP(R) een sprongadres staan.
B(R) A onvoorwaardelijke sprong BC(R) 15,A
BZ A zero, nul BC 8,A Na berekening
zeroes, uitsluitend nullen Na TM
BE A equal, gelijk Na vergelijking
BNZ A niet nul BC 7,A Na berekening
not zeroes Na TM (niet in documentatie)
BNE A niet gelijk Na vergelijking
BH A hoger BC 2,A Na vergelijking
BP A plus, positief Na berekening
BL A lager BC 4,A Na vergelijking
BM A minus, negatief Na berekening
mixed, gemengd nullen en enen Na TM
BNH A niet hoger BC 13,A Na vergelijking
BNP A niet plus Na berekening
BNL A niet lager BC 11,A Na vergelijking
BNM A niet minus Na berekening
not mixed Na TM (niet in documentatie)
BO A overflow BC 1,A Na berekening
ones, uitsluitend enen Na TM
BNO A geen overflow BC 14,A Na berekening (niet in documentatie)
not ones, niet uitsluitend enen Na TM

RegistersBewerken

De architectuur heeft 16 registers van elk 32 bits. Ze zijn genummerd van 0 tot 15 en voor bijna elk doel bruikbaar.

Kan de processor drijvende-kommabewerkingen uitvoeren, dan zijn er ook nog 4 registers van elk 64 bits. Deze hebben de nummers 0, 2, 4, 6. Andere registernummers mogen bij een drijvende-kommabewerking niet worden gebruikt.

Alfabetische lijst van instructiesBewerken

  • R1: het register waarnaar wordt verwezen in de eerste operand.
  • R2: het register waarnaar wordt verwezen in de tweede operand.
Mnemonisch Machinecode Voluit Uitleg
A, AR 5A, 1A Add De tweede operand (32 bits) wordt opgeteld bij R1 en de conditiecode wordt gezet.
AD, ADR
AE, AER
6A, 2A
7A, 3A
idem met drijvende komma
AH 4A Add Halfword De tweede operand (16 bits met teken) wordt opgeteld bij R1 en de conditiecode wordt gezet.
AL, ALR 5E, 1E Add logical Hetzelfde als Add, maar de conditiecode heeft een andere betekenis
AP Add decimal De twee operanden zijn packed decimal (elk maximaal 16 bytes).
AU, AUR
AW, AWR
6E, 2E
7E, 3E
Add unnormalised Als AD en AE, maar zonder normalisatie
AXR 36 Add Normalised optelling van drijvende-kommagetallen (128 bits)
BAL, BALR 45, 05 Branch and link Het huidige executieadres wordt opgeslagen in R1 en er wordt gesprongen naar het adres in de tweede operand. Springen naar het adres in register 0 is niet mogelijk.
BC, BCR 47, 07 Branch on condition Heeft de conditie in R1 een waarde die overeenkomt met de conditiecode, dan wordt er gesprongen naar het adres in de tweede operand. Springen naar het adres in register 0 is niet mogelijk.
BCT, BCTR 46, 06 Branch on count R1 wordt met 1 verminderd. Is het resultaat niet nul, dan wordt de sprong uitgevoerd.
BXH 86 Branch on index high R2 wordt opgeteld by R1. Is het resultaat positief, dan wordt de sprong uitgevoerd.
BXLE 87 Branch on index low or equal
C, CR 59, 19 Compare R1 wordt vergeleken met de tweede operand (32 bits) en de conditiecode wordt gezet.
CD, CDR
CE, CER
69, 29
79, 39
idem met drijvende komma
CH 49 Compare Halfword R1 wordt vergeleken met de tweede operand (16 bits met teken) en de conditiecode wordt gezet.
CL, CLR 55, 15 Compare logical
CLC D5 Compare logical characters
CLI 95 Compare Logical Immediate Vergelijking tussen de eerste operand en de tweede operand
CP F9 Compare decimal Vergelijking tussen packed decimal getallen
CVB 4F Convert to binary De tweede operand (packed decimal, 64 bits) wordt geconverteerd naar binair.
CVD 4E Convert to decimal R1 wordt geconverteerd naar packed decimal (64 bits)
D, DR 5D, 1D Divide R1 (een even register) en het daaropvolgende register worden gedeeld door de tweede operand. de rest komt in R1, het quotiënt in het volgende register.
DD, DDR
DE, DER
6D, 2D
7D, 3D
idem met drijvende komma
83 Diagnose Voor intern gebruik door IBM, heeft geen mnemonische code
DP FD Divide decimal Quotiënt en rest komen naast elkaar in de eerste operand.
ED DE Edit
EDMK DF Edit and Mark
EX 44 Execute De instructie op het aangegeven adres wordt uitgevoerd.
HDR, HER 42, 43 Halve Halveer drijvende-kommagetal
HIO 9D Halt I/O
IC 43 Insert character De tweede operand komt in de rechterbyte van R1, de rest van R1 blijft onveranderd.
ISK 09 Insert storage key
L, LR 58, 18 Load De tweede operand (32 bits) wordt gekopieerd naar R1.
LA 41 Load Address Het adres van de tweede operand wordt in R1 geplaatst, de linker byte van R1 wordt nul.
LD, LDR 68, 28 De tweede operand (64 bits) wordt gekopieerd naar drijvende-kommaregister R1 en het daaropvolgende register.
LCR 13 Load complement Het tegengestelde van R2 wordt gekopieerd naar R1 en de conditiecode wordt gezet.
LCDR, LCER 24, 34 idem met drijvende komma
LE, LER 78, 38 De tweede operand (32 bits) wordt gekopieerd naar drijvende-kommaregister R1.
LH 48 Load halfword De tweede operand (16 bits) wordt gekopieerd naar de rechterhelft van R1 en het tekenbit wordt gepropageerd.
LM 89 Load multiple Een aantal opeenvolgende registers (van R1 t/m R2) worden geladen.
LNR 11 Load negative De negatieve waarde van R2 wordt gekopieerd naar R1 en de conditiecode wordt gezet.
LNDR, LNER 21, 31 idem met drijvende komma
LPR 10 Load positive De absolute waarde van R2 wordt gekopieerd naar R1 en de conditiecode wordt gezet.
LPDR, LPER 20, 30 idem met drijvende komma
LPSW 28 Load program status word
LRDR, LRER 25, 26 Load Rounded De inhoud van R2 wordt afgerond en het resultaat komt in R1.
LTDR, LTER 22, 32 Als LTR, met drijvende komma
LTR 12 Load and test R2 wordt gekopieerd naar R1 en de conditiecode wordt gezet.
M, MR 5C, 1C Multiply De tweede operand (32 bits) wordt vermenigvuldigd met R1 (een even register) en het resultaat komt in R1 en het opvolgende register.
MD, MDR
ME, MER
6C, 2C
7C, 3C
idem met drijvende komma
MH 4C Multiply Halfword De tweede operand (16 bits) wordt vermenigvuldigd met R1 (een even register) en het resultaat komt in R1 en het opvolgende register.
MP FC Multiply decimal De tweede operand mag niet langer zijn dan 8 bytes. De eerste operand moet groot genoeg zijn voor het product.
MVC D2 Move characters een aantal opeenvolgende bytes in het geheugen worden verplaatst.
MVI 92 Move immediate De eerste operand wordt in de tweede operand opgeslagen.
MVN D1 Move Numeric
MVO F1 Move with Offset
MVZ D3 Move Zones
MXD, MXDR 67, 27 Multiply Vermenigvuldiging van drijvende-kommagetallen (64 bits, resultaat 128 bits)
MXR 26 Multiply Vermenigvuldiging van drijvende-kommagetallen (128 bits)
N, NR 54, 14 And Logische En van R1 en de tweede operand
NC D4 And characters
NI 94 And immediate Logische En van de eerste operand en de tweede operand
O, OR 56, 16 Or Logische Of van R1 en de tweede operand
OC D6 Or characters
OI 96 Or immediate Logische Of van de eerste operand en de tweede operand
PACK F2 Pack Conversie van zoned decimal naar packed decimal
RDD 85 Read direct
S, SR 5B, 1B Subtract De tweede operand wordt afgetrokken van R1 en de conditiecode wordt gezet.
SD, SDR
SE, SER
6B, 2B
7B, 3B
idem met drijvende komma
SH 4B Subtract Halfword De tweede operand (16 bits met teken) wordt afgetrokken van R1 en de conditiecode wordt gezet.
SL, SLR 5F, 1F Subtract logical Hetzelfde als Subtract, maar de conditiecode heeft een andere betekenis
SIO 9C Start I/O
SLA 8B Shift left single R1 wordt zoveel bits naar links geschoven als aangegeven in de tweede operand. Het tekenbit verandert niet.
SLDA 8F Shift left double Als SLA, met twee opeenvolgende registers
SLL, SLDL 89, 8D Shift left logical
SP FB Subtract decimal Zie AP
SPM 04 Set program mask
SRA, SRDA 8A, 8E Shift right Als SLA en SLDA. Het tekenbit wordt gepropageerd
SRL, SRDL 88, 8C Shift right logical
SSK 08 Set storage key
SSM 80 Set system mask
ST 50 Store R1 wordt opgeslagen op het adres van de tweede operand.
STC 42 Store Character De rechterbyte van R1 wordt op de tweede operand opgeslagen.
STD, STE 60, 70 Store Drijvendekomma-register R1 (32 of 64 bits) wordt opgeslagen op het adres van de tweede operand.
STH 40 Store Halfword De rechterhelft van R1 wordt op de tweede operand opgeslagen.
STM 90 Store Multiple R1 tot en met R2 worden opgeslagen op het adres van de tweede operand.
SVC 0A Supervisor call het Program status word wordt opgeslagen op adres 20h en een nieuw PSW wordt opgehaald van adres 60h.
SU, SUR
SW, SWR
6F, 2F
7F, 3F
Subtract unnormalised Als SD en SE, maar zonder normalisatie
SXR 37 Subtract Normalised aftrekking van drijvende-kommagetallen (128 bits)
TCH 9F Test channel
TIO 9D Test I/O
TM 91 Test under Mask
TR DC Translate
TRT DD Translate and Test
TS 93 Test and Set Semafoorinstructie: De linkerbit van de operand wordt in de conditiecode gezet en de operandbyte wordt 0FFh.
UNPK F3 Unpack Conversie van packed decimal naar zoned decimal
WRD 84 Write direct
X, XR 57, 17 Xor Logische exclusieve Of van R1 en de tweede operand
XC D7 Xor characters
XI 97 Xor immediate Logische exclusieve Of van de eerste operand en de tweede operand
ZAP F8 Zero and Add De tweede operand wordt gekopieerd naar de eerste. De operanden zijn maximaal 16 bytes lang, maar niet noodzakelijk even lang. Dit komt overeen met het op nul zetten van de eerste operand, waarna de instructie AP wordt uitgevoerd.