Bu cevabın içeriğinin çoğu asıl olarak bu cevabdan geliyordu (daha önce yazılan soru diğerinin kopyası olarak işaretlenmişti). Bu yüzden 8 bitlik değerler kullanarak tartışıyorum (bu soru 32 bitlik değerler sorsa bile), fakat sorun yok çünkü 8 bitlik değerlerin kavramsal olarak anlaşılması daha kolay ve aynı kavramlar 32 bitlik aritmetik gibi daha büyük değerlere de uygulanıyor.
8 bitlik iki sayı eklediğinizde, alabileceğiniz en büyük sayı (0xFF + 0xFF = 1FE). Aslında, 8 bitlik iki sayıyı çarptıysanız, alabileceğiniz en büyük sayı (0xFF * 0xFF = 0xFE01) 16 bit, iki kez 8 bit olur.
Şimdi, bir x-bit işlemcinin sadece x-bitleri takip edebileceğini varsayıyor olabilirsiniz. (Örneğin, 8 bitlik bir işlemci yalnızca 8 bitin kaydını tutabilir.) Bu doğru değil. 8 bit işlemci, 8 bit parçalarda veri alır. (Bu "topaklar" tipik olarak resmi bir terime sahiptir: bir "kelime". 8 bitlik bir işlemcide, 8 bitlik kelimeler kullanılır. 64 bitlik bir işlemcide 64 bitlik kelimeler kullanılabilir.)
Bu nedenle, bilgisayara 3 bayt verdiğinizde:
Bayt # 1: Çok
Yönlü Bayt # 2: Yüksek Sıralı Bayt (örneğin, 0xA5)
Bayt # 3: Düşük Sıralı Bayt (örneğin, 0xCB)
Bilgisayar, şu sonucu verebilir: 8 bitten fazla. CPU şöyle sonuçlar verebilir:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Şimdi, şunu yorumlayayım:
0x sadece aşağıdaki sayılar onaltılık anlamına gelir.
"40" ı anlık olarak daha ayrıntılı olarak tartışacağım.
82, 8 bitlik bir seri olan "A" kaydının bir parçasıdır.
xx ve xx, "B" kaydı ve "C" kaydı olarak adlandırılan diğer iki yazmacın parçasıdır. Bu bitleri sıfır veya bitlerle doldurmamamın nedeni, bir "ADD" komutunun (CPU'ya gönderilen) komutların değişmemesiyle sonuçlanabilmesidir (oysa bu örnekte kullandığım diğer bitlerin çoğu, bazı bayrak uçları hariç, değişmiş olsun).
D7 "D" sicil adı verilen daha fazla bit sığacaktır.
Bir kayıt sadece bir hafıza parçasıdır. Kayıtlar CPU'ların içine yerleştirilmiştir, böylece CPU bir RAM çubuğundaki hafıza ile etkileşime girmeden kayıtlara erişebilir.
Yani 0xA5 kez 0xCB'nin matematiksel sonucu 0x82D7'dir.
Şimdi, neden bitler A ve B kayıtları veya A ve D kayıtları yerine A ve D kayıtlarına bölündü? Bir kez daha, bu benim kullandığım örnek bir senaryo, kavram olarak gerçek bir Assembly diline oldukça benziyordu (Intel 8080 ve 8088 ve daha birçok CPU tarafından kullanılan Intel x86 16-bit). Genellikle sayma işlemleri için bir endeks olarak kullanılan "C" kaydı (döngüler için tipik) kullanılan bazı "C" kaydı ve bellek konumlarını belirlemeye yardımcı olan ofsetlerin kaydını tutmak için kullanılan "B" kaydı gibi bazı genel kurallar olabilir. Bu nedenle, "A" ve "D", ortak aritmetik fonksiyonların bazıları için daha yaygın olabilir.
Her CPU talimatı, Meclis'te program yapan kişiler tarafından kullanılan bazı belgelere sahip olmalıdır. Bu dokümantasyon, her bir talimat tarafından hangi kayıtların kullanılacağını belirtmelidir. (Bu nedenle hangi kayıtların kullanılacağına dair seçim genellikle Assembly dili programcıları tarafından değil, CPU tasarımcıları tarafından belirlenir. Buna rağmen, bir miktar esneklik olabilir.)
Şimdi, yukarıdaki örnekte "40" a geri dönelim: bu genellikle "bayrak kaydı" olarak adlandırılan bir dizi bit. Bayraklar kaydındaki her bitin bir adı vardır. Örneğin, sonuç, sonuçların bir baytını depolayabilecek alandan daha büyükse, CPU'nun ayarlayabileceği bir "taşma" biti vardır. ("Taşma" biti genellikle "OF" kısaltılmış ismi ile belirtilebilir. Bu sıfır değil, o büyük bir sermayedir.) Yazılım bu bayrağın değerini kontrol edebilir ve "sorunu" görebilir. Bu bit ile çalışmak genellikle görünmez bir şekilde üst düzey diller tarafından gerçekleştirilir, bu nedenle yeni başlayan programcılar genellikle CPU bayraklarıyla nasıl etkileşime gireceklerini öğrenmezler. Ancak, Meclis programcıları bu bayrakların bazılarına diğer değişkenlere çok benzeyen bir şekilde erişebilirler.
Örneğin, birden fazla ADD talimatınız olabilir. Bir ADD komutu, A kaydında ve D kaydında 16 bit sonuç saklayabilirken, diğer bir komut, yalnızca 8 düşük bit'i A kaydında saklayabilir, D kayıt defterini yok sayabilir ve taşma bitini belirtebilir. Ardından, (A kaydının sonuçlarını ana RAM'e kaydettikten sonra), sadece 8 yüksek bitini bir kayıt defterinde (muhtemelen A kayıt defteri) depolayan başka bir ADD talimatı kullanabilirsiniz (muhtemelen A kayıt defteri). Hangi çarpma talimatını kullandığınıza bağlıdır.
(İstediğiniz sonuca uyacak kadar fazla çıkarmanız durumunda, genellikle bir "akış" bayrağı da vardır.)
Sadece işlerin ne kadar karmaşık hale geldiğini göstermek için:
Intel 4004 4 bit işlemciydi
Intel 8008 8 bit işlemciydi. A, B, C ve D adında 8 bitlik kayıtları vardı
. Intel 8086, 16 bitlik bir işlemciydi. AX, BX, CX ve DX adında 16 bitlik kayıtlara sahipti.
Intel 80386 32 bit bir işlemciydi. EAX, EBX, ECX ve EDX adında 32-bit kayıtlara sahipti.
Intel x64 CPU'larında RAX, RBX, RCX ve RDX adında 64 bit kayıtlar bulunur. X64 yongaları 16 bitlik kodu çalıştırabilir (bazı işletim modlarında) ve 16 bitlik talimatları yorumlayabilir. Bunu yaparken, AX kaydını oluşturan bitler, RAX kaydını oluşturan bitlerin yarısı olan EAX kaydını oluşturan bitlerin yarısıdır. Böylece, AX'in değerini ne zaman değiştirirseniz, EAX ve RAX'ı da değiştirirsiniz, çünkü AX tarafından kullanılan bitler RAX tarafından kullanılan bitlerin bir parçasıdır. (EAX'i 65,536'nın çarpımı olan bir değerle değiştirirseniz, düşük 16 bit değişmez, böylece AX değişmez. EAX'i 65,536'nın çarpımı olmayan bir değerle değiştirirseniz, bu AX'i de etkiler. .)
Bahsettiğimden daha çok bayrak ve kayıt var. Basit bir kavramsal örnek sağlamak için sıkça kullanılanları seçtim.
Şimdi, eğer 8 bitlik bir CPU kullanıyorsanız, belleğe yazarken, 4 bit veya 16 bitlik bir adres değil, 8 bitlik bir adrese atıfta bulunma konusunda bazı kısıtlamalar bulabilirsiniz. Ayrıntılar CPU'ya bağlı olarak değişecektir, ancak bu tür kısıtlamalar varsa, CPU 8 bitlik kelimelerle ilgileniyor olabilir, bu yüzden CPU'nun en sık "8 bitlik CPU" olarak adlandırılmasının nedeni budur.