ESI ve EDI kayıtlarının amacı?


119

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:


78

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.


7
Geçmişten optimizasyon ipucu: rep stosw , rep stosb'den çok daha hızlıdır , bu nedenle, iki ve iki baytı kopyalamak, yapmaya çalıştığınız şeye uyuyorsa , bunu elle optimize edilmiş 16 bit x86 montaj kodunuzda kullanın ...
Alexander

88

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, ESsegment kaydı aşağıdaki gibi DIve DSile 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, Ckaynak 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+12içerir argv, ebxolduğu jve edivardır srcidx. Üçüncü komutun edi4 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.


Nerede gördüğümü hatırlayamasam da, bu çoğunu doğruluyor ve bu (slayt 17) diğerleri:

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.


37

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!

12

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.


6

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.


Çoğu insanın "geçici" / "uçucu olmayan" veya "aranan-kaydedilmiş" ve "arayan tarafından kaydedilmiş" olarak adlandırdığı şeyleri tanımlamak için "kutsal" kelimesini hiç duymadım. Ben "çağrı korumalı" / "çağrı-bozulmuş" u seviyorum, çünkü bu onların gerçekte herhangi bir yere kaydedildikleri anlamına gelmiyor. Her neyse, ESI / RSI ve EDI / RDI, x86-64 System V ABI'de çağrı korumalı değildir.
Peter Cordes

Ayrıca, EBP ve ESP'yi genel 32 bit arama kurallarında çağrı korumalı olarak listelemeyi unuttunuz.
Peter Cordes

1
Her neyse, bu oldukça iyi bir nokta. Gerçek kodda, herhangi bir talimat için özel olmalarından ziyade arama-kuralı nedenlerine dayalı bir şey için EDI / ESI'yi seçme olasılığınız daha yüksektir.
Peter Cordes

Aramaları korumayı seviyorum. Cevabı aynı şekilde güncelledim. İnceleme için teşekkürler.
Jay Rajput
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.