Bagaimana prosesor 'tahu' apa arti perintah yang berbeda?
Saya sedang memikirkan perintah tingkat perakitan seperti MOV, PUSH, CALL, dll ...
Bagaimana prosesor 'tahu' apa arti perintah yang berbeda?
Saya sedang memikirkan perintah tingkat perakitan seperti MOV, PUSH, CALL, dll ...
Jawaban:
Ketika komputer menafsirkan instruksi tingkat perakitan , instruksi ini diubah menjadi setara binernya agar CPU dapat membaca. Ketika CPU mengeksekusi instruksi, itu menginterpretasikan bagian opcode dari instruksi ke dalam "mikroprogram" individual, berisi mikrokode mereka yang setara. Asal tahu saja, instruksi perakitan lengkap terdiri dari opcode dan semua data yang berlaku yang menyertainya, jika diperlukan (mis. Nama register, alamat memori).
Instruksi mikrokode adalah level yang sangat rendah (lebih dari perakitan), dan mengontrol sinyal digital aktual yang mengontrol aliran logika dalam mikroprosesor. Misalnya, satu instruksi mikrokode dapat memperbarui bendera register kode kondisi dengan nilai baru, atau menghubungkan register CPU dengan salah satu unit ALU . Tugas yang lebih kompleks mungkin dilakukan, tetapi ini menunjukkan kepada Anda gambaran umum tentang apa yang digunakan untuk mikrokode.
Alur umum dari kompilasi ke eksekusi adalah sebagai berikut. Instruksi perakitan dirakit (diubah menjadi biner 0s dan 1s, atau mulai sekarang, sinyal logika). Sinyal-sinyal logika ini pada gilirannya ditafsirkan oleh CPU, dan berubah menjadi sinyal-sinyal logika tingkat lebih rendah yang mengarahkan aliran CPU untuk menjalankan instruksi tertentu. Ini dapat mengambil satu atau beberapa siklus jam, tergantung pada arsitektur dan desain prosesor (kebanyakan manual referensi prosesor memberi tahu Anda berapa banyak siklus clock yang diperlukan untuk menjalankan instruksi tertentu, seperti yang ini misalnya ).
Semua ini dilakukan dengan mikrokode yang diprogram dengan susah payah (secara fisik tertanam di dalam prosesor dalam beberapa jenis ROM , diatur selama pembuatan), yang mengarahkan aliran melalui gerbang logika tingkat rendah yang sebenarnya . Ini memberikan antarmuka antara instruksi perakitan abstrak dan logika listrik fisik dalam prosesor.
Jadi, secara ringkas, instruksi prosesor dirakit dan dimuat oleh prosesor. Prosesor kemudian akan menggunakan instruksi ini untuk mencari mikroprogram (dalam bentuk mikrokode) yang sesuai dengan instruksi tertentu, yang merupakan "sebenarnya" yang menjalankan instruksi. Setelah mikrokode untuk instruksi tertentu telah dieksekusi (yang dapat mengambil satu atau beberapa siklus clock), prosesor mengeksekusi mikrokode untuk mengambil instruksi berikutnya, dan siklus berulang.
Prosesor tidak benar-benar 'tahu' apa perintahnya. Perintah hanyalah pola biner yang menyebabkan prosesor melakukan apa yang kami artikan perintah artinya.
Misalnya, operasi ADD-R1-into-R2 akan menyebabkan nilai register 1 dan 2 mencapai ALU (unit aritmatika dan logika), menyebabkan ALU menggunakan output dari penambah alih-alih berbagai hal lainnya, dan menyebabkan output ALU untuk menggantikan nilai dalam register 2. Ada sirkuit logika sederhana untuk mencapai semua hal ini ( multiplexer , adder , counter , ...), meskipun prosesor nyata menggunakan optimasi yang sangat rumit.
Sepertinya Anda bertanya bagaimana mobil bisa melambat ketika Anda menginjak rem. Mobil tidak tahu, pedal rem kebetulan secara tidak langsung mengontrol bagaimana bantalan keras ditekan ke roda.
Ambil, misalnya, instruksi yang memberi tahu prosesor x86 / IA-32 untuk memindahkan nilai 8-bit langsung ke dalam register. Kode biner untuk instruksi ini adalah 10110 diikuti oleh pengenal 3-bit yang digunakan register. Pengidentifikasi untuk register AL adalah 000, jadi kode mesin berikut memuat register AL dengan data 01100001.
10110000 01100001
Kode komputer biner ini dapat dibuat lebih dapat dibaca oleh manusia dengan mengekspresikannya dalam heksadesimal sebagai berikut
B0 61
Di sini, B0 berarti 'Pindahkan salinan dari nilai berikut ke dalam AL', dan 61 adalah representasi heksadesimal dari nilai 01100001, yang merupakan 97 dalam desimal. Bahasa assembly Intel menyediakan MOV mnemonik (singkatan dari move) untuk instruksi seperti ini, sehingga kode mesin di atas dapat ditulis sebagai berikut dalam bahasa assembly, lengkap dengan komentar penjelasan jika diperlukan, setelah titik koma. Ini jauh lebih mudah dibaca dan diingat.
http://en.wikipedia.org/wiki/Assembler_language
Dengan kata lain, ketika Anda 'mengumpulkan' program perakitan Anda, instruksi Anda seperti
MOV AL, 61h
dikonversi menjadi angka, yang diasosiasikan CPU dengan makna khusus dan kemudian bertindak sesuai.
Bacaan yang disarankan:
Lihat juga catatan kursus dari CS152: Arsitektur dan Rekayasa Komputer di UC Berkeley, kursus di mana siswa menerapkan CPU.
Jika Anda mencari "cpu buatan sendiri" di Google, Anda akan menemukan banyak barang.
Pada level paling rendah yang paling ekstrem, yang bisa dilakukan CPU hanyalah menambahkan. Dari penjumlahan, ia dapat mengurangi, melipatgandakan, dan membagi (mengingat ini hanya penambahan dengan cara yang berbeda). CPU menggunakan ini untuk memindahkan data di dalam memori dengan menerapkan penambahan ke alamat memori.
Perlu diingat bahwa ini berada pada level serendah mungkin. CPU sebenarnya "memahami" perintah tertentu, dalam bentuk mikrokode. Lihat jawaban Breakthrough, itu ditulis dengan sangat baik.
Saya telah memberikan jawaban terkait di programmers.stackexchange.com, lihat Bagaimana cara kerja komputer? di mana saya berjalan dengan singkat atas segala sesuatu dari bawah ke atas tentang bagaimana komputer pergi menafsirkan instruksi untuk memindahkan elektron.