İşlem kodu tablosu

İşlem kodu tablosu (İngilizce: opcode table, opcode map ya da opcode matrix), bir buyruk kümesindeki işlem kodlarını, kodun bitlerine göre satır ve sütunlara dizerek gösteren çizelgedir. Her göz bir işlem koduna karşılık gelir ve o kodun buyruğunu, çoğunlukla anımsatıcısını ve işlenen türlerini verir. Boş gözler hiçbir buyruğa atanmamış ya da ileride kullanılmak üzere ayrılmış kodlardır.[1]:Cilt 2D, A-1 Intel'in yazılım geliştirici el kitabı, x86 nesne kodunu yorumlamak için bu tabloların kullanılmasını önerir.[1]:Cilt 2D, A-1
Düzeni
[değiştir | kaynağı değiştir]Sekiz bitlik bir işlem kodu 256 farklı değer alabildiğinden tek baytlık bir buyruk kümesinin tablosu 256 gözlüdür. Intel'in tek baytlık işlem kodu tablosunda satırı kodun üst dört biti, sütunu alt dört biti belirler; böylece tablo 16 satır ve 16 sütundan oluşur.[1]:Cilt 2D, A-1 Bu tabloda 90 kodu satır 9, sütun 0'daki NOP buyruğunu, C3 kodu da satır C, sütun 3'teki yakın RET buyruğunu gösterir.[1]:Cilt 2D, A-7
Western Design Center'ın W65C02S veri sayfasındaki tablo da aynı düzendedir. Satırlar kodun yüksek anlamlı on altılık basamağına, sütunlar düşük anlamlı basamağına göre dizilir ve her gözde anımsatıcının altında adresleme kipi yazılıdır. W65C02S, 256 kodun 212'sini 70 buyruğa dağıtır.[2]:5, 22
Tablonun eksenleri dört bitlik öbeklerden oluşmak zorunda değildir. Bir mimari, kodun hangi bitlerinin buyruk biçimini ya da buyruk grubunu belirlediğine göre başka bir bölümleme kullanabilir. Motorola'nın M68000 ailesinde 16 bitlik buyruk sözcüğünün 15-12. bitleri işlemin türünü seçer ve ailenin işlem kodu tablosu bu dört bite göre 16 satırdan oluşur.[3]:8-4
| 15-12. bitler | İşlem |
|---|---|
| 0000 | Bit işlemleri, MOVEP, anlık değerli işlemler |
| 0001 | Bayt taşıma (MOVE) |
| 0010 | Uzun sözcük taşıma (MOVE) |
| 0011 | Sözcük taşıma (MOVE) |
| 0100 | Çeşitli buyruklar |
| 0101 | ADDQ, SUBQ, Scc, DBcc, TRAPcc |
| 0110 | Bcc, BSR, BRA |
| 0111 | MOVEQ |
| 1000 | OR, DIV, SBCD |
| 1001 | SUB, SUBX |
| 1010 | Atanmamış, ayrılmış |
| 1011 | CMP, EOR |
| 1100 | AND, MUL, ABCD, EXG |
| 1101 | ADD, ADDX |
| 1110 | Kaydırma, döndürme, bit alanı |
| 1111 | Yardımcı işlemci arayüzü, MC68040 ve CPU32 eklentileri |
Atanmamış 1010 satırındaki ve 1111 satırındaki uygulanmamış kodlar, 68000 ailesinde kendi adlarını taşıyan ayrı kural dışı durum vektörlerine gider.[3]:B-2
IBM System/360
[değiştir | kaynağı değiştir]IBM System/360'ta işlem kodu buyruğun ilk baytıdır ve ilk iki biti buyruğun uzunluğunu ve biçimini belirler. 00 ile başlayan kodlar bir yarım sözcüklük RR, 01 ile başlayanlar iki yarım sözcüklük RX, 10 ile başlayanlar iki yarım sözcüklük RS ya da SI, 11 ile başlayanlar üç yarım sözcüklük SS biçimindedir.[4]:13 System/360 Principles of Operation kitabının G ekindeki işlem kodu tabloları bu yüzden biçime göre ayrılmıştır. Her tabloda sütunlar kodun üst dört bitine, satırlar alt dört bitine göre dizilir ve her sütun bir buyruk sınıfını toplar. RR tablosunda 0000xxxx sütunu dallanma ve durum değiştirme, 0001xxxx sütunu sabit noktalı tam sözcük ve mantık, 0010xxxx ve 0011xxxx sütunları uzun ve kısa kayan nokta buyruklarıdır.[4]:145-146
| Alt dört bit | 0100xxxx (sabit noktalı yarım sözcük ve dallanma) | 0101xxxx (sabit noktalı tam sözcük ve mantık) |
|---|---|---|
| 0000 | STH | ST |
| 0001 | LA | boş |
| 0010 | STC | boş |
| 0011 | IC | boş |
| 0100 | EX | N |
| 0101 | BAL | CL |
| 0110 | BCT | O |
| 0111 | BC | X |
| 1000 | LH | L |
| 1001 | CH | C |
| 1010 | AH | A |
| 1011 | SH | S |
| 1100 | MH | M |
| 1101 | boş | D |
| 1110 | CVD | AL |
| 1111 | CVB | SL |
Bu düzen sınıflar arasındaki düzenliliği gösterir. Aynı satırdaki kodlar çoğu zaman aynı işi farklı veri türleri üzerinde yapar. 4A (AH) yarım sözcüğü, 5A (A) tam sözcüğü toplar; RR tablosunda 1A (AR) aynı toplamanın yazmaçtan yazmaca biçimidir. 44 kodlu EX ise yürütme buyruğudur.[4]:145
RISC-V
[değiştir | kaynağı değiştir]
RISC-V'te 32 bitlik buyrukların en düşük iki biti 11'dir ve ana işlem kodu 7 bittir. Belirtimdeki ana işlem kodu tablosu, kalan beş biti iki eksene böler. Satırlar 6. ve 5. bitlere, sütunlar 4., 3. ve 2. bitlere göre dizilir; böylece 4 satır ve 8 sütunluk tabloda 32 ana kod yer alır. Son sütun 32 bitten uzun buyruklara ayrılmıştır.[5]:553
| 6-5. bitler | 4-2. bitler | |||||||
|---|---|---|---|---|---|---|---|---|
| 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | |
| 00 | LOAD | LOAD-FP | custom-0 | MISC-MEM | OP-IMM | AUIPC | OP-IMM-32 | 48 bit |
| 01 | STORE | STORE-FP | custom-1 | AMO | OP | LUI | OP-32 | 64 bit |
| 10 | MADD | MSUB | NMSUB | NMADD | OP-FP | OP-V | custom-2/rv128 | 48 bit |
| 11 | BRANCH | JALR | ayrılmış | JAL | SYSTEM | OP-VE | custom-3/rv128 | 80 bit ve üstü |
Tablodaki her göz tek bir buyruğu değil, bir buyruk grubunu gösterir; grubun içindeki buyruk çoğunlukla funct3 ve funct7 alanlarıyla seçilir.[5]:553-554 Belirtim ayrılmış (reserved) diye işaretli kodların ileride standart eklentilere verilebileceğini, custom-0 ve custom-1 kodlarının ise standart eklentilerde kullanılmayacağını ve üreticilerin kendi eklentilerine bırakıldığını yazar. custom-2/rv128 ve custom-3/rv128 kodları 128 bitlik RV128 için ayrılmıştır, ama RV32 ve RV64'te üretici eklentileri de bunları kullanabilir.[5]:553
Önekler, kaçış baytları ve ek tablolar
[değiştir | kaynağı değiştir]x86
[değiştir | kaynağı değiştir]x86'da tek baytlık tablo yetmediği için Intel ek tablolar tanımlar. 0F baytı iki baytlık işlem kodlarına geçişi sağlayan kaçış baytıdır; ardından gelen bayt ayrı bir 256 gözlü tablonun satır ve sütununu seçer. 0F 38 ve 0F 3A dizileri üç baytlık işlem kodlarının iki ayrı tablosunu açar. 66, F2 ya da F3 zorunlu önekleri aynı gözde duran birden çok buyruğu birbirinden ayırır.[1]:Cilt 2D, A-1, A-4 VEX önekli buyruklar ayrı bir tablo kullanmaz. VEX önekinin mmmmm alanı, kastedilen tablonun 0F, 0F 38 ya da 0F 3A tablolarından hangisi olduğunu kodlar ve öneki taşıyan buyrukların anımsatıcıları çoğunlukla "v" harfiyle başlar.[1]:Cilt 2D, A-5
Bazı gözler tek bir buyruğu değil bir buyruk grubunu gösterir. Bu kodlarda ardından gelen ModR/M baytının 3-5. bitleri işlem kodunun uzantısıdır ve buyruk ayrı bir grup tablosunda aranır. Örneğin 80 kodu 1. gruptadır ve uzantı alanı 000 ise buyruk ADD olur.[1]:Cilt 2D, A-17 x87 kayan nokta buyrukları da D8-DF kaçış kodlarıyla başlar. ModR/M baytı 00-BF aralığındaysa 3-5. bitleri buyruğu seçer, bu aralığın dışındaysa baytın tamamı işlem kodunun uzantısı sayılır.[1]:Cilt 2D, A-21
Intel'in tablolarında bazı gözlerin yanına kipe özgü imler konur. 64 bit kipinde 40-4F aralığındaki tek baytlık INC ve DEC kodları REX öneklerine dönüşür; bu kipte INC ve DEC için FE ve FF kodlarının grupları kullanılır.[1]:Cilt 2D, A-6
Zilog Z80
[değiştir | kaynağı değiştir]Zilog Z80, 8080A'nın 78 buyruğunu da yürüten bir işlemcidir ve 158 buyruk türünü tanır.[6]:32 Sean Young'ın belgelenmemiş Z80 kodları üzerine çalışmasına göre CB, ED, DD, FD, DDCB ve FDCB önekleri ardından gelen kodun yorumunu değiştirir; öneksiz bütün kodlar tek baytlık ve belgelenmiş buyruklardır.[7]:11 Zilog'un el kitabı DD ve FD ile başlayan dizinli buyrukları iki baytlık işlem kodlu gösterir.[6]:37
Toplama buyruğunun tablolardaki yeri
[değiştir | kaynağı değiştir]Aynı işlemin farklı tablolarda nereye düştüğü, tabloların düzenini karşılaştırmanın bir yoludur. Intel'in tek baytlık tablosunda toplama buyrukları 0. satırın ilk altı gözünü doldurur. 00-03 kodları yazmaç ve bellek işlenenli biçimleri, 04 ve 05 kodları AL ve EAX yazmaçlarına anlık değer ekleyen biçimleri gösterir.[1]:Cilt 2D, A-7 Anlık değerli 80, 81 ve 83 kodlarının gözleri ise tek bir buyruğu değil bir buyruk grubunu gösterir ve toplama, grup tablosunda 000 uzantısıyla seçilir.[1]:Cilt 2D, A-17
System/360'ın biçime göre ayrılmış tablolarında toplama buyrukları aynı satırda, 1010 satırında toplanır. Yazmaçtan yazmaca AR (1A) RR tablosunun 0001xxxx sütununda, tam sözcüklü A (5A) ve yarım sözcüklü AH (4A) RX tablosunun 0101xxxx ve 0100xxxx sütunlarındadır. Aynı satırın sütunlar boyunca izlenmesi, aynı işlemin farklı veri türlerindeki biçimlerini verir.[4]:145-146
M68000 ailesinin tablosunda ADD, ADDX ile birlikte 1101 satırını paylaşır; ikisi buyruk sözcüğünün öteki bitleriyle ayırt edilir.[3]:8-4 RISC-V'de ADD tek başına bir göz değildir. Satır 01, sütun 100'deki OP gözünde SUB, AND ve OR gibi buyruklarla birlikte durur ve funct3 ile funct7 alanlarıyla seçilir.[5]:553-554 Zilog Z80'de ADD A,r buyruğunun kodları on altılık 80-87 aralığını doldurur. Bu aralıktaki 86 kodu ise bellekteki işlenenle çalışan ADD A,(HL) buyruğudur.[6]:145, 148 W65C02S'te ayrı bir toplama buyruğu yoktur. Elde bitini de ekleyen ADC buyruğunun anlık değerli biçimi, tablonun 6. satırı ile 9. sütununun kesiştiği gözdedir.[2]:22 MIPS32'de ADD ana tabloda yer almaz. Ana tablonun SPECIAL (000000) gözü ayrı bir işlev alanı tablosu açar ve ADD bu tablonun 100 satırında ADDU, SUB ve SUBU ile yan yana durur.[8]:451, 452 ARM'ın A32 kodlamasında veri işleme buyruklarının tablosu 24-20. bitlere göre dizilir. ADD, bu bitleri 0100x olan satırdır; son bit S bitidir ve bayrakları güncelleyen biçimi ayırır.[9]:A5-195
Boş gözler
[değiştir | kaynağı değiştir]Tablodaki boş gözler, mimarinin henüz bir buyruğa vermediği kodlardır ve geçersiz işlem kodu sorununu doğurur. Bu gözlerin nasıl gösterildiği ve işlemcinin onlara nasıl davrandığı mimariden mimariye değişir. Intel boş gözlerin ayrılmış olduğunu ve kullanılmaması gerektiğini yazar; "Reserved-NOP" diye işaretli gözler bazı işlemcilerde boş işlem gibi davransa da ayrılmış sayılır.[1]:Cilt 2D, A-1 MOS Technology'nin 1976 tarihli 6502 programlama el kitabı atanmamış kodları on altılık listede Future Expansion diye gösterir.[10] W65C02S'te bu gözlerdeki kodların hepsi boş işlem gibi yürütülür.[2]:30 System/360'ta ise atanmamış bir kod operation exception adlı kural dışı durumu doğurur.[4]:78
Mimarilere göre işlem kodu tabloları
[değiştir | kaynağı değiştir]| Mimari | İşlem kodunun yeri | Tablonun eksenleri | Ek tablolar |
|---|---|---|---|
| IBM System/360 | İlk bayt | Sütun üst dört bit, satır alt dört bit[4]:145 | Biçime göre dört tablo (RR, RX, RS ve SI, SS) |
| M68000 ailesi | Buyruk sözcüğünün 15-12. bitleri | 16 satır[3]:8-4 | Her buyruğun bit düzeni ayrı bir biçim özetinde verilir |
| W65C02S | İlk bayt | Satır yüksek, sütun düşük on altılık basamak[2]:22 | Tek tablo |
| Zilog Z80 | İlk bayt ya da önekten sonraki bayt | Tek baytlık ana tablo[7]:11 | CB, ED, DD, FD, DDCB ve FDCB önekleri |
| Intel 64 ve IA-32 | Bir, iki ya da üç bayt | Satır üst dört bit, sütun alt dört bit[1]:Cilt 2D, A-1 | 0F, 0F 38 ve 0F 3A tabloları, ModR/M grupları, x87 için D8-DF tabloları |
| RISC-V | 7 bitlik ana kod (en düşük iki bit 11) | Satır 6-5. bitler, sütun 4-2. bitler[5]:553 | funct3 ve funct7 alanları |
Ayrıca bakınız
[değiştir | kaynağı değiştir]Kaynakça
[değiştir | kaynağı değiştir]- 1 2 3 4 5 6 7 8 9 10 11 12 13 Intel (Eylül 2026). Intel 64 and IA-32 Architectures Software Developer's Manual, Combined Volumes. 325462-093US (İngilizce). Intel Corporation. ss. Cilt 2B: 4-737; Cilt 2D: A-1, A-4, A-5, A-6, A-7, A-17, A-21; Cilt 3A: 7-3, 7-32, 7-33. Erişim tarihi: 7 Ekim 2026.
- 1 2 3 4 Western Design Center (8 Nisan 2022). W65C02S 8-bit Microprocessor (PDF) (İngilizce). The Western Design Center, Inc. ss. 5, 22, 30. Erişim tarihi: 7 Ekim 2026.
- 1 2 3 4 5 Motorola (1992). M68000 Family Programmer's Reference Manual (PDF) (İngilizce). Motorola Inc. ss. 4-107, 8-4, B-2. Erişim tarihi: 7 Ekim 2026.
- 1 2 3 4 5 6 7 IBM (1964). IBM System/360 Principles of Operation (PDF). A22-6821-0 (İngilizce). International Business Machines Corporation. ss. 13, 60, 62, 65, 78, 145-148. Erişim tarihi: 7 Ekim 2026.
- 1 2 3 4 5 6 RISC-V International (2024). The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture (PDF). 20240411 (İngilizce). RISC-V International. ss. 17, 553-554. Erişim tarihi: 7 Ekim 2026.
- 1 2 3 Zilog (2016). Z80 CPU User Manual (PDF). UM008011-0816 (İngilizce). Zilog Inc. ss. 32, 37, 145, 148. Erişim tarihi: 7 Ekim 2026.
- 1 2 Young, Sean (18 Eylül 2005). "The Undocumented Z80 Documented" (PDF). 0.91 (İngilizce). ss. 11-13. Erişim tarihi: 7 Ekim 2026.
- ↑ MIPS Technologies (15 Aralık 2016). MIPS Architecture for Programmers Volume II-A: The MIPS32 Instruction Set Manual (PDF). MD00086, 6.06 (İngilizce). ss. 33, 35, 36, 38, 451, 452. 23 Ağustos 2018 tarihinde kaynağından (PDF) arşivlendi. Erişim tarihi: 10 Ekim 2026.
- ↑ ARM (29 Mart 2018). ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition. ARM DDI 0406C.d (İngilizce). ARM Limited. ss. A5-195, A8-306, A8-307, A8-310. Erişim tarihi: 10 Ekim 2026.
- ↑ MOS Technology (Ocak 1976). MCS6500 Microcomputer Family Programming Manual (PDF). 6500-50A, ikinci baskı (İngilizce). Norristown, Pennsylvania. ss. D-1 ile D-5 arası. Erişim tarihi: 7 Ekim 2026.