Az assembly nyelvből ismert felosztáshoz hasonlóan vannak: bináris operátorok, melyek csak az egész típusokon és a float-on vannak értelmezve, unáris operátor a negáció, objektumra és pointerre nem alkalmazható, összehasonlító utasítások, shift utasítások, túlcsordulásos aritmetikai utasítások. Érdekesség, hogy a mnemonikok követik az OO elvet, és nevükben tartalmaznak pontot a logikus csoportosítás végett: add.ovf.*, mul.ovf.*, sub.ovf.*, ahol az ovf az overflow szóra utal.
conv.* utasításokkal lehet konverziót végezni az egyes típusok között. Abban az esetben, ha a paraméter típusa nem egyezik meg az utasításhoz tartozó argumentum típusával, akkor bizonyos esetekben implicit konverzió következik be. (pl.: int16 utasítás, de int32 tárolás van csak IL alatt)
A változókat a futási verembe lehet tölteni: ldloc, ldarg, menteni: stloc, starg. Az összehasonlítások: beq.*, bne.*, ceq (az első kettő ugrást is végez - branch) null létrehozás: ldnull. Így van speciális értékű referencia, ami nem mutat sehova.
Mint minden alacsonyszintű nyelvben, itt is megtalálható az ugrás utasítás, melyhez az utasítások megcímzése címkével történik a megszokott módon: azonosító: utasítás. Erős megkötés van az ugrásra, csak metóduson belül van rá lehetőség, és ott is csak egyes blokkokon belül. (Nem lehet pl. egy try blokk védett részéből a catch ágba ugratni)
Soremelés az elválasztó két utasítás sor között. Blokkosítás történhet namespace-szel, osztályozással, itt is a blokk jelzésére a {} jel szolgál. A forrás szekciókra van osztva, mint osztálydeklaráció, adatdeklaráció, erőforrás, stb. Ezek szekvenciájából épül fel az assembly.
Sokrétű utasításkészlet van a elágazás kezelésére. Az elágazás hasonló módon történik, mint az assembly nyelvben, csak itt az operandusokat a stack-ből veszi az utasítás. Az utasítás második bájtja határozza meg az ugrás nagyságát a kódban (a kódban természetesen címke szerepel). A különbség, hogy itt nem kell feltétlen 2 utasításnak lenni az összehasonlításnak és az ugrásnak, van rá közvetlen utasításcsoport, mely egyben végzi el a stack tetején lévő két érték összehasonlítását és az ugrást. (pl. beq, bne) Többszörös elágazásra nincs lehetőség.
Ciklus utasítás nincs, ezt az assembly nyelvből ismert csökkentés/ellenőrzés párossal kell végezni, így kialakítható elő- és utótesztelős ciklus.
Kétféle képpen történhet: metódushívás vagy cimkére ugrás. Metódushívásnál lehetőség van paraméterek (argumentumok) átadására stack-en keresztül. Az IL külön kezeli a virtuális és a statikus metódusokat, külön utasításcsoportja is van rá. Implementálásnál ezt figyelembe kell venni.