Montaj - Dizeler
Önceki örneklerimizde zaten değişken uzunluklu dizeler kullandık. Değişken uzunluklu dizeler gerektiği kadar karakter içerebilir. Genel olarak, dizenin uzunluğunu iki yoldan biriyle belirtiriz -
- Dize uzunluğunu açıkça depolamak
- Nöbetçi bir karakter kullanmak
Dize uzunluğunu, konum sayacının geçerli değerini temsil eden $ konum sayaç sembolünü kullanarak açıkça saklayabiliriz. Aşağıdaki örnekte -
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
$, msg dize değişkeninin son karakterinden sonraki baytı gösterir . Bu nedenle,$-msgdizenin uzunluğunu verir. Biz de yazabiliriz
msg db 'Hello, world!',0xa ;our dear string
len equ 13 ;length of our dear string
Alternatif olarak, dize uzunluğunu açıkça depolamak yerine bir dizeyi sınırlandırmak için sonda bir gözcü karakter içeren dizeleri depolayabilirsiniz. Sentinel karakter, bir dizede görünmeyen özel bir karakter olmalıdır.
Örneğin -
message DB 'I am loving it!', 0
Dize Talimatları
Her dizge talimatı bir kaynak işlenen, bir hedef işlenen veya her ikisini de gerektirebilir. 32 bitlik segmentler için, dizgi talimatları sırasıyla kaynak ve hedef işlenenleri işaret etmek için ESI ve EDI kayıtlarını kullanır.
Bununla birlikte, 16 bitlik segmentler için SI ve DI kayıtları sırasıyla kaynağı ve hedefi işaret etmek için kullanılır.
Dizeleri işlemek için beş temel talimat vardır. Onlar -
MOVS - Bu komut 1 Byte, Word veya Doubleword veriyi hafıza konumundan diğerine taşır.
LODS- Bu talimat bellekten yüklenir. İşlenen bir baytlık ise, AL yazmacına yüklenir, işlenen bir sözcükse, AX yazmacına yüklenir ve EAX yazmacına bir çift sözcük yüklenir.
STOS - Bu komut, kayıttan (AL, AX veya EAX) verileri belleğe kaydeder.
CMPS- Bu talimat hafızadaki iki veri öğesini karşılaştırır. Veriler bir bayt boyutunda, sözcükte veya çift sözcükte olabilir.
SCAS - Bu talimat, bir kaydın (AL, AX veya EAX) içeriğini bellekteki bir öğenin içeriği ile karşılaştırır.
Yukarıdaki talimatların her biri bir bayt, kelime ve çift kelime versiyonuna sahiptir ve dize talimatları bir tekrarlama öneki kullanılarak tekrarlanabilir.
Bu talimatlar ES: DI ve DS: SI kayıt çiftlerini kullanır; burada DI ve SI kayıtları, bellekte depolanan baytlara başvuran geçerli ofset adresleri içerir. SI normalde DS (veri segmenti) ile ilişkilidir ve DI her zaman ES (ekstra segment) ile ilişkilidir.
DS: SI (veya ESI) ve ES: DI (veya EDI) kayıtları sırasıyla kaynak ve hedef işlenenleri işaret eder. Kaynak işleneninin DS: SI (veya ESI) konumunda olduğu ve hedef işleneninin bellekte ES: DI (veya EDI) olduğu varsayılır.
16 bit adresler için SI ve DI kayıtları kullanılır ve 32 bit adresler için ESI ve EDI kayıtları kullanılır.
Aşağıdaki tablo, dizi komutlarının çeşitli sürümlerini ve işlenenlerin varsayılan alanını sağlar.
Temel Talimat | Operandlar | Bayt İşlemi | Kelime İşlemi | Çift kelime İşlemi |
---|---|---|---|---|
MOVS | ES: DI, DS: SI | MOVSB | MOVSW | MOVSD |
LODLAR | AX, DS: SI | LODSB | LODSW | LODSD |
STOS | ES: DI, AX | STOSB | STOSW | STOSD |
CMPS | DS: SI, ES: DI | CMPSB | CMPSW | CMPSD |
SCAS | ES: DI, AX | SCASB | SCASW | SCASD |
Tekrarlama Önekleri
REP öneki, bir dizi komutundan önce ayarlandığında, örneğin - REP MOVSB, CX yazmacına yerleştirilen bir sayaca bağlı olarak komutun tekrarına neden olur. REP komutu yürütür, CX'i 1 azaltır ve CX'in sıfır olup olmadığını kontrol eder. Komut işlemeyi CX sıfır olana kadar tekrarlar.
Yön Bayrağı (DF) operasyonun yönünü belirler.
- İşlemi soldan sağa yapmak için CLD'yi (Yön Bayrağını Temizle, DF = 0) kullanın.
- İşlemi sağdan sola yapmak için STD'yi (Yön Bayrağını Ayarla, DF = 1) kullanın.
REP ön ekinde ayrıca aşağıdaki varyasyonlar bulunur:
REP: Koşulsuz tekrardır. CX sıfır olana kadar işlemi tekrarlar.
REPE veya REPZ: Koşullu tekrardır. Sıfır bayrağı eşit / sıfırı gösterirken işlemi tekrarlar. ZF eşit / sıfır olmadığını gösterdiğinde veya CX sıfır olduğunda durur.
REPNE veya REPNZ: Aynı zamanda koşullu tekrardır. Sıfır bayrağı eşit / sıfır olmadığını gösterirken işlemi tekrarlar. ZF eşit / sıfır gösterdiğinde veya CX sıfıra düşürüldüğünde durur.