2012-04-30 29 views
5

Yön işaretinin x86 içinde nasıl çalıştığını anlayamıyorum. derslerimde metni artışlarla veya eksilme kaynak veya hedef kayıt ama bu onun adıyla mantıklı değil söylüyorlar. Birisi ne yaptığını açıklayabilir mi?x86 içinde Yön Bayrağı

cevap

7

Bu bayrak, dizgi işlemlerinde kullanılır ve dizelerin düşük bir adreste başlayıp başlamadığını ve daha yüksek adreslere mi devam ettiğini yoksa tersini belirtir. dize talimatları için

, ECXDS:ESI kaynak adresi vardır ve ES:EDI hedef (dolayısıyla sESI ve d EDI içinde) sahip olmasıdır, yineleme sayısına sahiptir. Her bir yinelemede sonra

, ECX ya artan veya EFLAGS.DF göre (bayt işlemleri, kelime işlemleri vs için 2 1) eleman boyutu ile azaltılmakta bir ve ESI ve EDI azaltılır.

EFLAGS.DF Eğer aksi takdirde indirildiği konum, 0, ESI ve EDI artırılır olduğunu.

+0

Bu nedenle dizeyi buna göre artırır veya azaltır. Bir dize daha düşük bir adresle başlıyorsa, ona eklenir veya diğer durumda tersi yapılır, değil mi? –

+0

dizinin içindeki ** işaretçiyi ** arttırır veya azaltır. –

+0

Nathan Fellman, @Jerry Coffin, varsayılan davranışın bir bellek bloğunun başından kopyalanması olduğunu düşünüyorum (DF temizlendi). Hangi durumlarda sonunda bir bellek bloğu kopyalamak ister (DF set)? – golem

4

Yön işaretine bağlı bir yönerge örneğindeki gibi rep movsb alalım.

rep movsb'u yaptığınızda, esi adresinde bir kaynak adresi, edi adresinde bir hedef adresi ve ecx olarak sayılır. İşlemci temelde bir döngü yürütür. Normal durumda (yönlendirme bayrağı temiz olduğunda), döngünün her yinelemesi esi ve edi'u artırır, böylece bunları kopyaladığınız kaynak ve hedef bloklarının başına işaret edecek şekilde başlatırsınız. REP MOVSB yürütülürken, işlemci kopyalanan bloğun sonuna ulaşana kadar kaynak ve hedef adreslerini artırır.

Yön bayrağı ayarlandığında, işlemci yerine yazmaçlarını azaltır. Bu, kopyalamakta olduğunuz bellek bloğunun son işaretini gösteren onlarla başlamanız gerektiği anlamına gelir. Baştan başlayıp, sonuna kadar kopyalamak yerine, baştan başlar ve baştan sona gelene kadar geriye doğru kopyalar.