Tamsayı karşılaştırması dahili olarak nasıl çalışır?


18

Örneğin, iki tamsayıyı C benzeri bir dilde aşağıdaki gibi karşılaştırırken:

if (3 > 2) {
    // do something
}

3'ün dahili olarak 2'den büyük (doğru) olup olmadığı (yanlış) olup olmadığı nasıl değerlendirilir?


19
Mevcut cevap, karşılaştırmanın değişken ifade ile ilgili olduğu durumda, ancak birçok modern derleyicinin kod parçanıza bakacağı, ifadenin her zaman doğru olacağını (değişmezler nedeniyle) algılayacağı ve sadece iftamamen görmezden geldiği durumlar için uygun değildir. , doğrudan kodlamaya gidiyor do something.
SJuan76

3
Olası yinelenen Nasıl Bilgisayarlar Work?

3
@Snowman katılmıyorum. Herhangi bir "bu nasıl çalışır" programlama sorgusu bu soruya yoğunlaştırılabilir, ancak bu onları çoğaltmaz.
user1643723

1
@ user1643723 Söz konusu işlev belirli bir opcode olduğunda yapar.
chrylis -on strike-

1
@ user1643723 Soru, bir bilgisayarın nasıl temel bir işlem gerçekleştirdiğini soruyor ve üstteki yanıt mantık kapılarını ve mantık tablolarını tartışıyor. Dupe hedefinin üst cevabında kapsamlı bir şekilde ele alınan iki konu;

Yanıtlar:


61

Tavşan deliğinden aşağı doğru, ha? Tamam, deneyeceğim.

Adım 1. C'den makine diline

C derleyicisi karşılaştırmanızı makine dilinde saklanan opcode dönüştürür . Makine dili, CPU'nun talimatlar olarak yorumladığı bir sayı dizisidir. Bu durumda iki opcode olurdu: "taşıma ile çıkarma" ve "taşıma durumunda atlama". Başka bir deyişle, 2 bir talimatta 3'ten çıkarılır ve bir sonraki talimat taşmış olup olmadığını kontrol eder. Bunlardan önce, 2 ve 3 sayılarını karşılaştırılabilecekleri konumlara yüklemek için iki talimat olacaktır.

MOV AX, 3    ; Store 3 in register AX
MOV BX, 2    ; Store 2 in register BX
SUB AX, BX   ; Subtract BX from AX
JC  Label    ; If the previous operation overflowed, continue processing at memory location "Label"

Yukarıdakilerin her biri bir ikili temsile sahiptir; örneğin, kod SUBolan 2Daltıgen ya da 00101101ikili olarak.

Adım 2. ALU için opcodes

Aritmetik işlem kodları gibi ADD, SUB, MULve DIVbir kullanarak temel tamsayı matematik gerçekleştirmek ALU ya Aritmetik Mantık Birimi CPU yerleşik. Sayılar bazı opcodlar tarafından kayıtlarda saklanır ; diğer opcode yongalara ALU'yu o anda kayıtlarda saklanan şeyler hakkında matematik yapması için çağırmasını söyler.

Not: Bu noktada, C gibi bir 3GL ile çalışırken herhangi bir yazılım mühendisinin endişeleneceği her şeyin ötesindeyiz .

Adım 3. ALU, yarım toplayıcı ve tam toplayıcı

Bunu biliyor muydun tüm matematiksel işlemlerin bir dizi NOR işlemine indirgenebileceğini biliyor muydunuz ? ALU tam da böyle çalışır.

ALU yalnızca ikili sayılarla nasıl çalışılacağını bilir ve yalnızca OR, NOT, AND ve XOR gibi mantıksal işlemleri gerçekleştirebilir. İkili toplama ve çıkarma işlemi, toplayıcı olarak bilinen bir alt sistemde belirli bir şekilde düzenlenmiş bir dizi mantıksal işlemle gerçekleştirilir . Bu alt sistemler, iki bit üzerinde çalışan ve tek bit toplamlarını ve tek bit taşıma bayrağını belirleyen bir "yarı toplayıcılar" ağından oluşur. Bunları birlikte zincirleyerek, ALU 8, 16, 32 vb. Bitli sayılar üzerinde işlem yapabilir.

Yarım Toplayıcı

Çıkarmaya ne dersiniz? Çıkarma sadece bir başka toplama şeklidir:

A - B = A + (-B)

ALU ikisinin tamamlayıcısını-B alarak hesaplar ait B. Negatif değere dönüştürüldüğünde, değeri toplayıcıya göndermek çıkarma işlemiyle sonuçlanır.

Adım 4: Son adım: Çip üstü transistörler

Toplayıcıların işlemleri, transitor-transistör mantığı veya TTL'de veya CMOS'ta bulunanlar gibi "mantık kapıları" oluşturmak için etkileşen elektrikli bileşenlerin bir kombinasyonu kullanılarak gerçekleştirilir . Bunların nasıl bağlandığını görmek için birkaç örnek için burayı tıklayın .

Bir çip üzerinde, elbette, bu "devreler" milyonlarca küçük iletken ve iletken olmayan malzeme bitinde uygulanır, ancak prensip, bir breadboard üzerinde tam boyutlu bileşenlermiş gibi aynıdır. Elektronik bir mikroskop merceğinden mikroçip üzerindeki tüm transistörleri gösteren bu videoyu izleyin .

Bazı ek notlar:

  1. Yazdığınız kod, derleyici tarafından önceden hesaplanacak ve çalışma zamanında yürütülmeyecektir, çünkü yalnızca sabitlerden oluşur.

  2. Bazı derleyiciler makine kodunu derlemez, ancak Java bayt kodu veya .NET ara dili gibi başka bir katman ekler. Ama sonuçta her şey makine dili aracılığıyla yürütülür.

  3. Bazı matematiksel işlemler aslında hesaplanmaz; aritmetik bir yardımcı işlem birimindeki masif tablolarda aranırlar veya arama ve hesaplama veya enterpolasyonun bir kombinasyonunu içerirler. Bir örnek, bir karekökü hesaplama işlevidir . Modern PC CPU'ların her birinde, her CPU çekirdeğinde yerleşik bir kayan nokta işleme birimi vardır.


3
FWIW, TTL'ye atıfta bulunmak, kafa karıştırıcı olabilir çünkü neredeyse hiçbir modern işlemci TTL sinyalini kullanmaz, çoğu CMOS FET ve 5v BJT yerine düşük voltaj kullanır.
whatsisname

2
@Whatsisname'nin önerdiği gibi CMOS kesinlikle TTL'den daha iyi bir referans olacaktır, çünkü sadece modern işlemcilerde olup bitenler için daha doğru olmakla kalmaz, aynı zamanda kavramsal olarak çok daha basittir.
Jules

3
@JackAidley bu bölümün anlamı şudur: "Başka bir deyişle, 2 bir komutta 3'ten çıkarılır ve bir sonraki komut taştıp taşmadığını kontrol eder."
KutuluMike

1
Nitpicking: Sanırım CMPkullanılamaz SUB- ama o zaman bu aşağı yukarı bir " SUBsonuç görmezden gelinir ve sadece bayraklar ayarlanır"
Hagen von Eitzen

5
Yarım ve tam toplayıcı tanımlarınız yanlış. Yarım toplayıcı iki adet 1 bit giriş alır ve toplamı ve taşıma değerini döndürür. Tam bir toplayıcı ek bir taşıma girişi alır, ancak yine de sadece tek bittir. N-bit toplayıcı oluşturmanın birçok yolu vardır, en basiti sadece N tam toplayıcıların bir zinciri olan bir dalgalanma taşıyan toplayıcıdır. Daha büyük N'ler için pratikte bu oldukça kötü bir gecikmeye sahiptir, bu nedenle modern CPU tasarımlarında daha karmaşık tasarımlar kullanılır.
Voo
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.