Assembler'da EDI & ESI kayıtlarının asıl amacı ve kullanımı nedir?
Bir şey için dizi işlemleri için kullanıldığını biliyorum.
Birisi de bir örnek verebilir mi?
Assembler'da EDI & ESI kayıtlarının asıl amacı ve kullanımı nedir?
Bir şey için dizi işlemleri için kullanıldığını biliyorum.
Birisi de bir örnek verebilir mi?
Yanıtlar:
Yalnızca DI / SI (veya 1985'te ASM öğrenmediyseniz, genişletilmiş muadilleri) ile yapabileceğiniz birkaç işlem vardır . Bunlar arasında
REP STOSB
REP MOVSB
REP SCASB
Sırasıyla, tekrarlanan (= kütle) depolama, yükleme ve tarama işlemleri. Yaptığınız şey, SI ve / veya DI'yi bir veya her iki işleneni gösterecek şekilde ayarlamaktır, belki de CX'e bir sayı koyup sonra da rip'e izin verin. Bunlar, bir seferde bir grup bayt üzerinde çalışan işlemlerdir ve CPU'yu otomatik olarak çalıştırırlar. Döngüleri açıkça kodlamadığınız için, işlerini elle kodlanmış bir döngüden daha verimli (genellikle) yaparlar.
Merak ediyorsanız: İşlemi nasıl kurduğunuza bağlı olarak, tekrarlanan depolama, 0 değerini büyük bir bitişik bellek bloğuna sıkıştırmak gibi basit bir şey olabilir; Sanırım, MOVSB verileri bir tampondan (yani, herhangi bir bayt grubundan) diğerine kopyalamak için kullanılır; ve SCASB, bazı arama kriterleriyle eşleşen bir bayt aramak için kullanılır (Sadece eşitlik mi yoksa ne aradığından emin değilim - bakabilirsiniz :))
Bu reglerin çoğu bunun için.
SI
= Kaynak Dizini
DI
= Hedef Dizini
Diğerlerinin de belirttiği gibi, dizi talimatlarıyla özel kullanımları vardır. Gerçek mod programlaması için, ES
segment kaydı aşağıdaki gibi DI
ve DS
ile birlikte kullanılmalıdır SI
.
movsb es:di, ds:si
SI ve DI, genel amaçlı indeks kayıtları olarak da kullanılabilir. Örneğin, C
kaynak kodu
srcp [srcidx++] = argv [j];
derlemek
8B550C mov edx,[ebp+0C]
8B0C9A mov ecx,[edx+4*ebx]
894CBDAC mov [ebp+4*edi-54],ecx
47 inc edi
nerede ebp+12
içerir argv
, ebx
olduğu j
ve edi
vardır srcidx
. Üçüncü komutun edi
4 ile çoğaltılmış kullandığına ve 0x54 ebp
(konumu srcp
) ile ofseti eklediğine dikkat edin ; Adresin etrafındaki parantezler, doğru yönlendirmeyi gösterir.
AX
= toplayıcı
DX
= çift kelimeli toplayıcı
CX
= sayaç
BX
= temel kayıt
Genel amaçlı kayıtlar gibi görünürler, ancak (beklenmedik bir şekilde?) Bunlardan birini kullanan - ama hangisini? - üstü kapalı olarak bir dizi talimat vardır.
MOVSB ve MOVSW gibi işlem kodları ESI tarafından gösterilen bellekten EDI tarafından işaret edilen belleğe verimli bir şekilde veri kopyalar. Böylece,
mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
Diğer cevaplarda bahsedilen dizgi işlemlerine (MOVS / INS / STOS / CMPS / SCASB / W / D / Q vb.) Ek olarak, burada dolaylı olarak kullanılan daha "modern" x86 derleme komutlarının da olduğunu eklemek istedim. en az EDI / RDI:
SSE2 MASKMOVDQU
(ve yaklaşan AVX VMASKMOVDQU
) talimatı, baytları bir XMM yazmacından EDI / RDI tarafından işaret edilen belleğe seçmeli olarak yazar.
Kitlesel işlemler için kullanılan kayıtlara ek olarak, 32 bitlik arama kuralında bir işlev çağrısı (çağrı korumalı) aracılığıyla korunma özellikleri açısından faydalıdırlar. ESI, EDI, EBX, EBP, ESP çağrı korumalı iken EAX, ECX ve EDX çağrı korumalı değildir. Çağrıda korunan kayıtlar, C kütüphanesi işlevi tarafından dikkate alınır ve değerleri, C kütüphanesi işlev çağrıları aracılığıyla kalır.
Jeff Duntemann'ın assembly dili kitabında komut satırı argümanlarını yazdırmak için örnek bir assembly kodu vardır. Kod, C kütüphanesi işlevi printf tarafından değiştirilmeyeceklerinden sayaçları saklamak için esi ve edi kullanır. Eax, ecx, edx gibi diğer yazmaçlar için, bunların C kütüphanesi işlevleri tarafından kullanılmama garantisi yoktur.
https://www.amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025
12.8 C Komut Satırı Bağımsız Değişkenlerini Nasıl Görür bölümüne bakın.
64-bit arama kurallarının 32-bit arama kurallarından farklı olduğuna dikkat edin ve bu kayıtların arama korumalı olup olmadığından emin değilim.