Instructieset van IBM 360
Dit artikel komt mogelijk voor verwijdering in aanmerking. |
De Systeem/360 instructieset is het geheel van CPU instructies van het IBM 360 systeem. Het mainframe system werd voor het eerst in 1964 door IBM ontwikkeld. Het is een CISC systeem met 8-bit karakters en 24-bit geheugenadressering. Het vormde de basis van belangrijke commerciële computersystemen van de jaren 1960.
Eigenschappen[bewerken | brontekst bewerken]
Parameter | IBM 360 | PDP-11 |
---|---|---|
Eerste implementatie | 1964 | 1970 |
Type | mainframe | minicomputer |
Instructies | CISC | |
Instructietype | ortogonaal | |
Floating point | optioneel | |
Instructielengte (byte) | 2, 4, 6 | |
Aantal registers | 16 | 6 + 2 |
Geheugenadreslengte | 24 bit | 16 bit |
Adreseerbaar geheugen | 16 MB | 64 KB |
Karaktercode | EBCDIC | ASCII |
Endiannes | Big-endian | Little-endian |
De instructies van Systeem/360 zijn 2, 4 of 6 bytes lang. Geheugenadressen zijn drie bytes lang.
De adressering geschiedt door adressen op te bouwen uit de inhoud van een register (basisregister) van 32 bits (waarvan 24 bits voldoende zijn) en een in de instructie opgenomen "displacement", ook "offset" genoemd, van 12 bits. Er zijn 16 registers, dus een register wordt aangewezen met 4 bits. Soms wordt nog een tweede register gebruikt, het "indexregister", dat dan kan worden gebruikt om een tabel te indiceren.
De tabellen hieronder tonen de volledige instructieset van de IBM Systeem/360.[1][2][3]
Instructieformaat[bewerken | brontekst bewerken]
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 (00-3F) | Register 1 | Register 2 | |||||||||||||||||||||||||||||||||||||||||||||
RX | opcode (40-7F) | Register | indeX | Basis | offset | |||||||||||||||||||||||||||||||||||||||||||
SI | opcode (80-BF) | Immediate | Basis | offset | ||||||||||||||||||||||||||||||||||||||||||||
RS | opcode (80-9F) | Register 1 | Register 2 | Basis | offset | |||||||||||||||||||||||||||||||||||||||||||
SS | opcode (C0-FF) | Lengte | Basis 1 | offset 1 | Basis 2 | offset 2 | ||||||||||||||||||||||||||||||||||||||||||
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 instructies[bewerken | brontekst bewerken]
De geprivilegieerde instructies hebben een gele achtergrond.
Sommige instructies zijn alleen beschikbaar op een uitbreiding van het systeem. Het zijn:
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 | STore Character | Insert Character | 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 codes[bewerken | brontekst bewerken]
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 |
Registers[bewerken | brontekst bewerken]
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 instructies[bewerken | brontekst bewerken]
- 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. |
Externe links[bewerken | brontekst bewerken]
Bronnen, noten en/of referenties
|