Geçersiz işlem kodu (İngilizce: illegal opcode, invalid opcode ya da undefined opcode), bir işlemcinin buyruk kümesinde hiçbir buyruğa atanmamış ya da o işlemcide gerçeklenmemiş işlem kodudur. Çoğu mimari böyle bir kodla karşılaşan işlemcinin ne yapacağını tanımlar. İşlemci buyruğu yürütmez, bir kural dışı durum oluşturur ve işletim sisteminin ya da programın bu iş için hazırladığı yordama geçer. Intel'in x86 belgelerinde bu durumun adı #UD (invalid opcode exception), RISC-V belirtiminde illegal instruction, IBM System/360'ta operation exceptiondır.
Bazı eski mikroişlemciler tanımsız kodları ayırt etmez. Western Design Center'ın veri sayfasına göre NMOS 6502 işlemcisinde geçersiz kodların sonucu tanımsızdır ve bu kodların bazıları ancak işlemci sıfırlanınca sona erer. Tanımsız kodlardan bazıları ise üreticinin belgelerinde yer almadığı hâlde tekrarlanabilir işler yapar; bunlara belgelenmemiş buyruk denir. Zilog Z80'in SLL buyrukları ve x86 işlemcilerde sonradan ortaya çıkarılan bazı kodlar bu türdendir.
Mimarilerin tanımladığı tepki
x86
Intel 64 ve IA-32 mimarisinde geçersiz ya da ayrılmış bir işlem kodu, 6 numaralı vektörü kullanan #UD kural dışı durumunu doğurur. #UD hata (fault) türünden bir kural dışı durumdur ve hata kodu taşımaz. Aynı durum, işlemcinin desteklemediği bir MMX ya da SSE buyruğu yürütülmek istendiğinde, LOCK öneki kilitlenemeyen bir buyruğun önüne konduğunda ya da bir buyruğa uygun olmayan türde işlenen verildiğinde de oluşur.
Intel'in işlem kodu tablolarında boş gözler ayrılmış ya da tanımsız kodları gösterir. Intel bu kodların kullanılmamasını ve o anki işleyişlerine dayanılmamasını ister. "Reserved-NOP" diye işaretli gözler bazı işlemcilerde boş işlem gibi davransa da yine ayrılmış sayılır.
Yazılımın bilerek #UD oluşturabilmesi için Intel UD0 (0F FF), UD1 (0F B9), UD2 (0F 0B) ve UDB (D6) buyruklarını tanımlar. UDB yalnızca 64 bit kipinde böyle davranır, bu kipin dışında D6 kodu SALC buyruğudur. Intel bu buyrukların yazılım sınaması için sağlandığını belirtir; kural dışı durumu doğurmaları dışında işlemcinin durumunu ya da belleği değiştirmezler. Kaydedilen buyruk göstergesi bir sonraki buyruğu değil, UD buyruğunun kendisini gösterir.
Sırasız yürütüm yapan Intel işlemcilerinde #UD, geçersiz buyruğun sonucu kesinleştirilmeye çalışılana kadar oluşmaz. Kodun çözülmesi ya da öngörüye dayalı yürütme sırasında işlenmesi tek başına kural dışı durum doğurmaz. Pentium ve öncesindeki IA-32 işlemcilerinde de geçersiz bir buyruğun önceden getirilmesi ve ilk kod çözme adımından geçmesi #UD'ye yol açmaz.
RISC-V
RISC-V belirtimi iki kodu her zaman geçersiz sayar. Alt 16 biti tümüyle sıfır olan kodlar ve ILEN uzunluğunda tümüyle bir olan kod geçersizdir. Belirtime göre sıfırla dolu bir bellek bölgesine yapılan yanlış bir atlama böylece hemen kural dışı durum doğurur; tümüyle bir olan kod da programlanmamış kalıcı bellekleri, bağlantısı kopmuş bellek yollarını ve bozuk bellekleri yakalar. Yazılım, bilerek geçersiz bir buyruk gerektiğinde hizalı 32 bitlik sıfır sözcüğü kullanabilir, çünkü bu sözcük bütün RISC-V işlemcilerinde geçersizdir.
Geçersiz buyruk, ayrıcalıklı mimaride 2 numaralı kural dışı durum kodudur. mtval yazmacı geçersiz buyruğun bitlerini de taşıyabilir, ama bu özellik isteğe bağlıdır; mepc yazmacı ise buyruğun bellekteki adresini gösterir. Ana işlem kodu tablosunda reserved diye işaretli kodlar gelecekteki standart eklentilere ayrılmıştır, custom-0 ve custom-1 kodları ise üreticilerin kendi eklentilerine bırakılmıştır.
IBM System/360
System/360'ta bir işlem kodu bir buyruğa atanmamışsa ya da atanmış işlem o modelde yoksa operation exception oluşur. İşlem bastırılır (yapılmaz) ve buyruk uzunluğu kodu 1, 2 ya da 3 olur. Bu program kesmesinin kodu 1'dir; işlemci o anki program durum sözcüğünü (PSW) 40 adresine yazar ve yeni PSW'yi 104 adresinden yükler. Aynı kural dışı durum, ondalık aritmetik donanımı olmayan bir modelde EDIT gibi ondalık buyruklar yürütülmek istendiğinde de oluşur. Kod atanmamış olsa bile işlemci, buyruğun bellek ya da yazmaç adresini o buyruk sınıfının kurallarına göre denetleyebilir ve adresleme ya da belirtim hatası verebilir.
PDP-10
DEC'in PDP-10'unda buyruğa atanmamış kodlar uygulanmamış işlem (unimplemented operation) diye yürütülür. İşlemci buyruğun ilk 13 bitini ve etkin adresi belirli bir bellek gözüne yazar, ardından ikinci bir gözdeki buyruğu yürütür. Sekizlik 000-077 aralığındaki kodlar uygulanmamış kullanıcı işlemleridir (UUO). Zaman paylaşımlı çalışmada 001-037 kodları kullanıcı programının kendi 40 ve 41 adreslerini kullanır, 040-077 kodları ise işletim sistemini çağırmaya ayrılmıştır. Atanmamış 100-127 kodları da işletim sistemine gider; kullanıcı yanlış bir kod verdiğinde böylece işletim sistemi devreye girer. Kayan nokta ve bayt işlemlerinin 130-177 kodları, bu buyrukların isteğe bağlı donanımı takılı değilse atanmamış kodlar gibi davranır ve yazılımla yürütülebilir. KA10 işlemcisinde 247 ve 257 kodları belirli sistemlere özel buyruklara ayrılmıştır. Özel donanım yoksa bu kodlar hiçbir şey yapmadan geçer, ama DEC uyumluluk için bunları boş işlem diye sürekli kullanmamayı öğütler.
PDP-11
PDP-11'de ayrılmış ve geçersiz buyruklar işlemciyi sekizlik 10 adresindeki vektörden bir kural dışı durum yordamına götürür. JSR ve JMP buyruklarının yazmaç kipinde kullanılması gibi geçersiz buyruk biçimleri ise tek sayılı adrese sözcük erişimi ve zaman aşımı gibi yol hatalarıyla birlikte 4 adresindeki vektörü kullanır.
Motorola 68000 ailesi
Motorola 68000 ailesinde geçersiz bir bit örüntüsü illegal instruction kural dışı durumuna yol açar. Aile bu durumu bilerek oluşturmak için 4AFC kodlu ILLEGAL buyruğunu tanımlar ve buyruk 4 numaralı vektörü kullanır. Motorola, öteki geçersiz örüntülerin buyruk kümesinin ileride genişletilmesine ayrıldığını ve kural dışı durum oluşturmak için kullanılmaması gerektiğini belirtir. İşlem kodunun ilk dört biti 1010 ve 1111 olan uygulanmamış kodlar ise kendi vektörlerine gider; Motorola bu vektörlere Line 1010 Emulator ve Line 1111 Emulator adını verir. Ailenin işlem kodu tablosunda 1010 satırı atanmamış ve ayrılmıştır, 1111 satırı ise yardımcı işlemci arayüzüne ve MC68040 ile CPU32 eklentilerine verilmiştir.
TMS9900
Texas Instruments'ın TMS9900 veri kitabı, tanımsız kod aralıklarına (0000-01FF, 0320-033F, 0780-07FF ve 0C00-0FFF) bir buyruk gibi 6 saat çevrimi ve bir bellek erişimi süresi verir. İşlemcinin IAQ çıkışı buyruk getirilen her bellek çevriminde etkin olur ve veri kitabına göre geçersiz kodları dış devrelerle yakalamakta kullanılabilir.
Karşılaştırma
| Mimari | Tepkinin adı | İşlemcinin geçtiği yer |
|---|---|---|
| IBM System/360 | Operation exception (program kesmesi, kod 1) | 104 adresindeki yeni PSW |
| PDP-10 | Uygulanmamış işlem (UUO) | 40-41 ya da 60-61 adresleri |
| PDP-11 | Ayrılmış buyruk | Sekizlik 10 adresindeki vektör |
| M68000 ailesi | Illegal instruction | 4 numaralı vektör |
| Intel 64 ve IA-32 | #UD | 6 numaralı vektör |
| RISC-V | Illegal instruction | Kural dışı durum kodu 2 |
| TMS9900 | Tanımsız kodlara 6 çevrimlik süre verilir | IAQ çıkışıyla dış devreler yakalayabilir |
| W65C02S | Kural dışı durum yok, kod boş işlem gibi yürütülür | Bir sonraki buyruk |
| NMOS 6502 | Tanımsız | Bazı kodlar ancak işlemci sıfırlanınca sona erer |
İşletim sistemindeki karşılığı
POSIX standardı geçersiz buyruk için SIGILL sinyalini tanımlar. Bu sinyalin varsayılan etkisi sürecin olağan dışı sonlandırılması ve buna ek işlemler yapılmasıdır. Sinyalin nedenini bildiren kodlar arasında geçersiz işlem kodu (ILL_ILLOPC), geçersiz işlenen (ILL_ILLOPN), geçersiz adresleme kipi (ILL_ILLADR) ve ayrıcalıklı işlem kodu (ILL_PRVOPC) vardır.
Belgelenmemiş buyruklar
6502
MOS Technology'nin 1976 tarihli MCS6500 programlama el kitabı, buyruğa atanmamış kodları on altılık listede Future Expansion (ileride genişletme) diye gösterir. Western Design Center'ın W65C02S veri sayfası, NMOS 6502 ile kendi CMOS işlemcisini karşılaştırırken NMOS 6502'de geçersiz kodların sonucunun tanımsız olduğunu ve bazılarının ancak işlemci sıfırlanınca sona erdiğini yazar. W65C02S'te ise bütün geçersiz kodlar ileride kullanılmak üzere ayrılmış boş işlemlerdir. Veri sayfası her biri için bayt ve çevrim sayısını da verir; örneğin 02, 22, 42, 62, 82, C2 ve E2 kodları iki baytlık, iki çevrimlik boş işlemlerdir. W65C02S, 256 kodun 212'sini 70 buyruğa dağıttığından geriye 44 boş kod kalır. Bu yüzden NMOS 6502'de bir iş yapan belgelenmemiş bir kod W65C02S'te hiçbir şey yapmaz.
Zilog Z80
Zilog'un Z80 kullanıcı el kitabı, işlemcinin 8080A'nın 78 buyruğunu da içeren 158 buyruk türünü yürütebildiğini belirtir. Sean Young'ın 2005 tarihli The Undocumented Z80 Documented çalışması ise belgelerde yer almayan kodları önek önek sıralar. CB önekli CB30-CB37 kodları, SLL (shift logical left) diye anılan ve SLA'dan yalnız 0. biti 1 yapmasıyla ayrılan bir kaydırma işlemidir. DD ve FD önekleri, ardından gelen buyrukta HL yazmacı yerine IX ya da IY'yi kullandırır; bu önekler H ya da L yazmacını kullanan bir buyruğun önüne konduğunda işlem IX ve IY'nin yüksek ve düşük baytlarına uygulanır. ED önekli belgelenmemiş kodların çoğu belgelenmiş buyrukların kopyasıdır, listede olmayanlar ise iki boş işlem gibi hiçbir şey yapmaz. DDCB ve FDCB önekli belgelenmemiş kodlar, işlemin sonucunu bellekle birlikte yedi genel yazmaçtan birine de yazar.
x86
Christopher Domas'ın 2017'de Black Hat USA'da sunduğu çalışma, x86 buyruk kümesini fuzzing yöntemiyle baştan sona taramak için bir yol önerir. Yöntem, aday buyruğun ilk baytını yürütülebilir bir sayfanın sonuna, geri kalanını yürütülemeyen sayfaya taşacak biçimde yerleştirir ve buyruk getirilirken oluşan kural dışı durumun hangi adreste doğduğuna bakarak geçersiz buyrukların bile uzunluğunu ölçer. Domas bu tekniğe sayfa hatası çözümlemesi adını verir. Geçersiz bir buyruk #UD, var olan ama ayrıcalık isteyen bir buyruk ise genel koruma hatası (#GP) verdiği için tarayıcı, kullanıcı kipinden çalışırken bile ayrıcalıklı buyrukları var olmayanlardan ayırabilir. Bu yolla 15 baytlık buyrukların yaklaşık 1036 olası birleşimi birkaç milyon adaya iner.
Domas, aracı onlarca işlemcide çalıştırdığını ve bütün büyük işlemcilerde belgelenmemiş buyruklar bulduğunu bildirir. 64 bit kipte çalışan bir Intel Core i7'de ortaya çıkan örnekler arasında 0F 0D kodunun belgelenmemiş yazmaç alanlı biçimleri, Haziran 2016 baskısına kadar yarısı belgelenmeyen ve sonra ayrılmış boş işlem diye eklenen 0F 18 kodları, işlem kodu tablolarında yer almayan DB E0, DB E1 ve DF C0-C7 kodları ile F1 kodu vardır. Domas'a göre bazı kodlar da SAL buyruğunun belgelenmemiş eşleridir.
Belgelenmemiş kodlara güvenmenin sakıncası
Üreticiler belgelenmemiş kodlara dayanılmamasını öğütler. Intel tanımsız ve boş gözlerdeki kodların işleyişine güvenilmemesini ister, Motorola geçersiz örüntülerin ileride buyruk kümesini genişletmek için ayrıldığını belirtir. Ayrılmış alanların durumu da zamanla değişebilir. Domas'ın bulduğu 0F 18 kodları Haziran 2016'dan sonra Intel'in el kitaplarına ayrılmış boş işlem diye eklendi. Intel'in güncel el kitabı da D6 kodunu 64 bit kipinde bilerek #UD doğuran UDB buyruğu, öteki kiplerde ise SALC diye tanımlar. RISC-V belirtimi de reserved kodların ileride standart eklentilere verilebileceğini, bu yüzden üreticilerin kendi eklentilerinde bu kodlardan kaçınması gerektiğini yazar.
Ayrıca bakınız
Kaynakça
- 1 2 3 4 5 6 7 8 9 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. 25 Nisan 2022 tarihinde kaynağından arşivlendi. Erişim tarihi: 7 Ekim 2026.
- 1 2 3 RISC-V International (2024). The RISC-V Instruction Set Manual, Volume II: Privileged Architecture (PDF). 20240411 (İngilizce). RISC-V International. ss. 43, 45. Erişim tarihi: 7 Ekim 2026.
- 1 2 3 4 5 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. 29 Şubat 2012 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 7 Ekim 2026.
- 1 2 3 4 5 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 Young, Sean (18 Eylül 2005). "The Undocumented Z80 Documented" (PDF). 0.91 (İngilizce). ss. 11-13. 9 Ekim 2021 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 7 Ekim 2026.
- 1 2 3 4 Domas, Christopher (17 Temmuz 2017). "Breaking the x86 ISA" (PDF). Black Hat USA 2017 (İngilizce). Erişim tarihi: 7 Ekim 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- 1 2 3 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 Digital Equipment Corporation (1969). PDP-10 System Reference Manual, Book 1: Programming with the PDP-10 Instruction Set (PDF) (İngilizce). Maynard, Massachusetts. ss. 1-7, 2-56, 2-64. 5 Nisan 2017 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 7 Ekim 2026.
- ↑ Digital Equipment Corporation (Haziran 1982). DECsystem-10/DECSYSTEM-20 Processor Reference Manual (PDF). AD-H391A-T1 (İngilizce). Marlborough, Massachusetts. ss. 2-63, 2-64, 3-48. 5 Ocak 2026 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 7 Ekim 2026.
- 1 2 3 Digital Equipment Corporation (1979). PDP-11 Processor Handbook: PDP-11/04/34a/44/60/70 (PDF) (İngilizce). Maynard, Massachusetts. ss. 129, 131. 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. 3 Aralık 2021 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 7 Ekim 2026.
- 1 2 Texas Instruments (Aralık 1976). TMS 9900 Microprocessor Data Manual (PDF) (İngilizce). Houston. ss. 15, 24, 28. Erişim tarihi: 7 Ekim 2026.
- ↑ "signal.h: signals". The Open Group Base Specifications Issue 8, IEEE Std 1003.1-2024 (İngilizce). IEEE ve The Open Group. 2024. Erişim tarihi: 7 Ekim 2026. Arşivlenmesi gereken bağlantıya sahip kaynak şablonu içeren maddeler (link)
- ↑ MOS Technology (Ocak 1976). MCS6500 Microcomputer Family Programming Manual (PDF). 6500-50A, ikinci baskı (İngilizce). Norristown, Pennsylvania. ss. D-1 ile D-5 arası. 8 Ekim 2023 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 7 Ekim 2026.
- ↑ Zilog (2016). Z80 CPU User Manual (PDF). UM008011-0816 (İngilizce). Zilog Inc. ss. 32, 37. 26 Aralık 2023 tarihinde kaynağından arşivlendi (PDF). Erişim tarihi: 7 Ekim 2026.
