2010-12-27 21 views
5

bir GNU projesinde bazı kaynak kodu ile okurken, ben satır içi birleşimin bu biraz rastladım: BuradaYardım anlayış DIV yönergesi

__asm__ (
    "divq %4" 
    : "=a" (q), "=d" (r) 
    : "0" (n0), "1" (n1), "rm" (d) 
); 

değişkenler q, r, n0, n1 ve d, 64 bitlik tamsayılardır. Bunun ne olduğunu anlayabilmek için yeterince meclis biliyorum, ama emin değilim bazı ayrıntılar var.

anlıyorum Ne: Biz d tarafından RAX kayıt içeriğini bölünmesi q yılında katsayısı yerleştirerek ve r yılında kalanını yerleştiriyoruz

. Ben niye üç giriş var burada

  1. Anlamadığım şey

    ? Sadece bir temettü ve bir bölücü girmemiz gerekiyor, bu yüzden kullanımı 3 giriş için kullanılabilir mi?

  2. Hangi girdilerin temettü olduğunu anlatamam. Daha genel olarak, RAX siciline yüklenen herhangi bir şey göremiyorum, neye göre bölerek neye bölüneceğini biliyorsunuz?
+1

+1 iyi biçimlendirilmiş soru. "Anladığım" ve "anlamadığım" bölümleri beğendim. –

cevap

4

:

: "0" (n0), "1" (n1), "rm" (d) 

kayıtları "0" ve "1" nedeniyle çıkış şartnamenin rax zorlanır ve rdx gibidir:

: "=a" (q), "=d" (r) 

Ve div talimat aile istiyor RDX:RAX numaralı telefon numarası. Ayırıcı, "rm" kısıtlaması tarafından belirtilen genel amaçlı bir yazmaçta (aksi halde kullanılmamış - yani RAX veya RDX değil) veya bellekte olabilir. RDX, RAX kayıtlarını ve bölme işleneni 3 girdiyi oluşturur.

Bu, bölümün gerçekleştirilmesiyle sonuçlanacak: n1:n0/d burada n1:n0, rdx:rax'a yüklenen bir miktardır.

+0

Bunun, 128 bit tam sayıyı 64 bit tam sayı ile bölmek için kullanılabileceğini doğru mu anlıyoruz? Bunun 32 bit kayıt sürümü için mümkün olduğunu biliyordum, ama bunun 64 bit sürümü için de geçerli olacağını hiç düşünmemiştim. –

+1

@Jens: Bu doğru.Ancak (küçük operand bölme operasyonları gibi), bölümün rax' hedef kaydı için çok büyük olması halinde, bir bölünme istisnası alacağınızı unutmayın. –

+1

Bu durumun test edilmesinin hızlı yolu, sadece 'rdx' 'nin bölenden daha az olduğundan emin olmaktır, bu durumda bölüm güvenlidir. –

0

doğru div aile sabit kayıtlar a ve d, rax ve divq için rdx çalışır gözlemlemek gibi. a registerı, 0 yazmacına, yani a'a ait olan n0 girişini alır. n1, muhtemelen yalnızca bu kayıt defterinin başka amaçlarla kullanılmadığından emin olmak için d numaralı takma addır. giriş işlenenler spesifikasyonda