Ö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?
Ö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?
Yanıtlar:
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 SUB
olan 2D
altıgen ya da 00101101
ikili olarak.
Adım 2. ALU için opcodes
Aritmetik işlem kodları gibi ADD
, SUB
, MUL
ve DIV
bir 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.
Çı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:
Yazdığınız kod, derleyici tarafından önceden hesaplanacak ve çalışma zamanında yürütülmeyecektir, çünkü yalnızca sabitlerden oluşur.
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.
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.
CMP
kullanılamaz SUB
- ama o zaman bu aşağı yukarı bir " SUB
sonuç görmezden gelinir ve sadece bayraklar ayarlanır"
if
tamamen görmezden geldiği durumlar için uygun değildir. , doğrudan kodlamaya gidiyordo something
.