Bagaimana perbandingan integer bekerja secara internal?

18

Misalnya ketika membandingkan dua bilangan bulat sebagai berikut dalam bahasa mirip-C:

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

Bagaimana penilaian apakah 3 lebih besar dari 2 (benar) atau tidak (salah) dibuat secara internal?

Niek
sumber
19
Jawaban saat ini ok untuk kasus ketika perbandingannya adalah tentang ekspresi variabel, tetapi tidak memiliki penafian bahwa banyak kompiler modern akan melihat potongan kode Anda, mendeteksi bahwa ungkapan akan selalu benar (karena literal) dan mengabaikan ifsemuanya , langsung ke pengkodean do something.
SJuan76
3
Kemungkinan duplikat dari Bagaimana Komputer Bekerja?
3
@Snowman saya tidak setuju. Setiap pertanyaan pemrograman "bagaimana cara kerjanya" dapat diringkas ke pertanyaan itu, tetapi itu tidak membuatnya duplikat.
user1643723
1
@ user1643723 Tidak ketika fungsi yang dimaksud adalah opcode tertentu.
chrylis -on strike-
1
@ user1643723 Pertanyaannya adalah bertanya tentang bagaimana komputer melakukan operasi dasar, dan jawaban teratas membahas gerbang logika dan tabel logika. Dua topik yang dibahas secara luas dalam jawaban teratas target korban penipuan, yang juga menjawab pertanyaan Anda.

Jawaban:

61

Sepanjang jalan ke lubang kelinci, eh? OK, saya akan mencobanya.

Langkah 1. Dari C ke bahasa mesin

Kompiler C mengubah perbandingan Anda dengan opcode yang disimpan dalam bahasa mesin . Bahasa mesin adalah serangkaian angka yang ditafsirkan oleh CPU sebagai instruksi. Dalam hal ini akan ada dua opcode: "kurangi dengan carry" dan "jump if carry." Dengan kata lain, 2 dikurangi dari 3 dalam satu instruksi, dan instruksi selanjutnya memeriksa untuk melihat apakah itu meluap. Ini akan didahului oleh dua instruksi untuk memuat angka 2 dan 3 ke lokasi di mana mereka dapat dibandingkan.

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"

Masing-masing di atas memiliki representasi biner; misalnya, kode untuk SUBadalah 2Dhex, atau 00101101dalam biner.

Langkah 2. Opcodes ke ALU

Opcodes aritmatika seperti ADD, SUB, MUL, dan DIVmelakukan matematika bilangan bulat dasar menggunakan ALU atau Arithmetic Logic Unit dibangun ke CPU. Nomor disimpan dalam register oleh beberapa opcode; opcodes lainnya menginstruksikan chip untuk memanggil ALU untuk melakukan matematika pada apa pun yang disimpan dalam register pada saat itu.

Catatan: Pada titik ini kami jauh melampaui apa pun yang akan dikhawatirkan oleh insinyur perangkat lunak jika bekerja dengan 3GL seperti C.

Langkah 3. ALU, setengah penambah, dan penambah penuh

Tahukah Anda bahwa semua operasi matematika yang Anda ketahui dapat direduksi menjadi serangkaian operasi NOR ? Dan itulah cara kerja ALU.

ALU hanya tahu cara bekerja dengan angka biner, dan hanya dapat melakukan operasi logis seperti OR, NOT, AND, dan XOR. Implementasi penambahan dan pengurangan biner dilakukan dengan serangkaian operasi logis yang diatur dengan cara tertentu, dalam subsistem yang dikenal sebagai adder . Subsistem ini terdiri dari jaringan "half-adders" yang beroperasi pada dua bit dan menentukan jumlah bit tunggal dan flag carry bit tunggal. Dengan merantai ini bersama-sama, ALU dapat melakukan operasi pada angka dengan bit 8, 16, 32 dll.

Half-Adder

Bagaimana dengan pengurangan? Pengurangan hanyalah bentuk tambahan:

A - B = A + (-B)

ALU menghitung -Bdengan mengambil komplemen dua itu dari B. Setelah dikonversi menjadi negatif, mengirimkan nilai ke penambah akan menghasilkan operasi pengurangan.

Langkah 4: Langkah terakhir: transistor On-chip

Operasi adders diimplementasikan menggunakan kombinasi komponen listrik yang berinteraksi untuk membuat "gerbang logika," seperti yang ditemukan dalam logika transitor-transistor atau TTL, atau dalam CMOS . Klik di sini untuk beberapa contoh untuk melihat bagaimana ini terhubung.

Pada sebuah chip, tentu saja, "sirkuit" ini diimplementasikan dalam jutaan bit kecil bahan konduktif dan nonkonduktif, tetapi prinsipnya sama seperti jika mereka adalah komponen berukuran penuh di papan tempat memotong roti. Tonton video ini yang menunjukkan semua transistor pada microchip melalui lensa mikroskop elektronik.

Beberapa catatan tambahan:

  1. Kode yang Anda tulis sebenarnya akan dikomputasi oleh kompiler dan tidak dieksekusi pada saat dijalankan, karena hanya terdiri dari konstanta.

  2. Beberapa kompiler tidak mengkompilasi ke kode mesin tetapi memperkenalkan lapisan lain, seperti Java bytecode atau .NET intermediate language. Tetapi pada akhirnya semuanya dieksekusi melalui bahasa mesin.

  3. Beberapa operasi matematika tidak benar-benar dihitung; mereka dilihat dalam tabel besar-besaran pada unit pemrosesan aritmatika, atau berisi kombinasi pencarian dan perhitungan atau interpolasi. Contohnya adalah fungsi untuk menghitung akar kuadrat . CPU PC modern masing-masing memiliki unit pengolahan titik mengambang yang dibangun ke dalam setiap inti CPU.

John Wu
sumber
3
FWIW, merujuk ke TTL mungkin membingungkan karena hampir tidak ada prosesor modern yang menggunakan pensinyalan TTL, sebagian besar menggunakan FET CMOS dan voltase yang lebih rendah daripada BJV 5v.
whatsisname
2
CMOS pasti akan menjadi referensi yang lebih baik daripada TTL, seperti yang disarankan @whatsisname, karena tidak hanya lebih akurat dengan apa yang terjadi pada prosesor modern, tetapi juga secara konsep jauh lebih sederhana.
Jules
3
@JackAidley itulah arti bagian ini: "Dengan kata lain, 2 dikurangi dari 3 dalam satu instruksi, dan instruksi berikutnya memeriksa untuk melihat apakah itu meluap."
KutuluMike
1
Nitpicking: Saya kira CMPakan digunakan, tidak SUB- tetapi sekali lagi itu lebih atau kurang " SUBjika hasilnya diabaikan dan hanya bendera yang ditetapkan"
Hagen von Eitzen
5
Definisi setengah dan penuh-penambah Anda salah. Setengah penambah mengambil dua input 1-bit dan mengembalikan jumlah dan bawa. Seorang penambah penuh membutuhkan input carry-in tambahan tetapi masih hanya satu bit. Ada banyak cara untuk membuat penambah N-bit, yang paling sederhana adalah penambah riak yang hanya merupakan rangkaian penambah penuh N. Dalam praktik untuk Ns yang lebih besar, ini memiliki penundaan yang sangat buruk sehingga desain yang lebih kompleks digunakan dalam desain CPU modern.
Voo