Bagaimana tepatnya kita beralih dari Binary / Hex ke Assembly Instruction set?

13

Jadi saya sudah mencoba mempelajari beberapa pemrograman Embedded / Assembly untuk sedikit di sini akhir-akhir ini, dan juga mencoba mempelajari level terendah (gerbang dan semacamnya).

Satu hal yang membingungkan saya .... adalah bagaimana kita "mendapatkan" set instruksi. Saya agak mengerti bagaimana gerbang / TTL dan berfungsi seperti itu, tapi saya tidak melihat bagaimana kita mendapatkan itu untuk bergerak, menambahkan, CLR dll ...?

Ini mungkin pertanyaan bodoh .... tapi maksud saya, saya berpikir kembali ke prosesor mikro pertama / pengendali dan berpikir .... bagaimana tepatnya mereka merancang set instruksi dan membuatnya bekerja?

sunting: Saya kira untuk Clarity, berpura-pura berbicara tentang mikroprosesor pertama, bagaimana mereka beralih dari Binary menjadi benar-benar membuat Set Instruksi?


sumber
2
Setiap instruksi memiliki nilai, kompiler mengubah kode Anda menjadi instruksi ini, berdasarkan pada bagaimana kode Anda disusun.
Ramhound
1
Saya tidak yakin apakah saya memahami pertanyaan Anda dengan sempurna, tetapi saya pikir Anda dapat menemukan jawaban Anda di sini , di sini atau di sini .
e-MEE
1
pasangan yang berhubungan erat dengan programmers.stackexchange.com/questions/81624/... dan superuser.com/questions/307116/…
jhocking
3
bagaimana mereka beralih dari Binary menjadi benar-benar membuat Set Instruksi? Sebenarnya, "mereka" tidak - itu sebaliknya, setidaknya secara umum. Perancang CPU menentukan operasi yang akan dilakukan CPU, kemudian mereka membuat set instruksi dari itu, dan kemudian mereka memetakan instruksi (mnemonics) ke opcodes (kode mesin biner). @Scott Whitlock memberikan jawaban yang baik di bawah ini, saya hanya ingin membahas bagian terakhir dari pertanyaan Anda karena asumsi Anda, setidaknya dalam pengalaman saya, adalah mundur.
Radian
1
Buku yang sangat bagus ini: www1.idc.ac.il/tec adalah yang menjelaskan semuanya kepada saya, sebagian besar bab tersedia secara online gratis. Anda mendesain chip Anda sendiri (dalam bahasa deskripsikan perangkat keras yang sederhana) dari gerbang nand, lalu assembler kemudian compiler, lalu menulis os dalam bahasa yang Anda buat! Hal-hal luar biasa, dan sebagai seseorang tanpa gelar sarjana, sudah waktunya saya habiskan dengan baik!
Bplus

Jawaban:

18

Jantung dari CPU adalah ALU . Ini bertanggung jawab untuk mengambil instruksi (seperti MOV) yang hanya beberapa seri digit biner yang telah ditentukan, dan juga mengambil 0, 1, atau 2 operan, dan melakukan operasi yang berlaku pada mereka. Instruksi paling sederhana bisa berupa NOP (tanpa operasi) yang pada dasarnya tidak melakukan apa-apa. Operasi khas lainnya adalah ADD (menambahkan dua nilai).

ALU membaca dan menulis data dari dan ke "register". Ini adalah lokasi memori kecil internal ke CPU. Bagian dari instruksi (2 hingga 3 bit untuk setiap input tergantung pada berapa banyak register yang Anda miliki) menunjukkan register mana yang harus dibaca. Ada unit di CPU eksternal untuk ALU yang menangani memuat data yang diperlukan (dan instruksi) dari memori ke register, dan menulis hasil dari register kembali ke memori. Lokasi untuk menulis hasilnya juga akan dikodekan ke dalam 2 atau 3 bit lainnya.

Pilihan "kode op", yang merupakan nomor biner yang mewakili operasi, tidak sewenang-wenang. Opcode yang dipilih dengan baik mengurangi kompleksitas ALU. Setiap bit atau kelompok bit cenderung untuk mengaktifkan dan menonaktifkan gerbang logika tertentu di ALU. Sebagai contoh, instruksi ADD harus mengaktifkan tahap output untuk memilih hasil dari logika penambahan internal. Demikian juga, instruksi MUL akan memilih hasil dari logika multiply. Tergantung pada desain, sangat mungkin bahwa sirkuit adder dan multiply keduanya benar-benar melakukan operasi mereka pada operan input, dan hanya pemilihan output (yang dituliskan ke bit output ALU) yang berubah.

Scott Whitlock
sumber
1
Saya kira apa yang saya tanyakan, adalah bagaimana mereka memilih? Dan bagaimana mereka sebenarnya menugaskannya?
1
@Sauron: Baca ulang paragraf ke-3 lagi dan cobalah untuk memahami aritmetika biner dan sirkuit digital. Saya dapat mewakili set instruksi dengan 256 instruksi dengan garis 8bit di sirkuit digital. Itu berarti saya memerlukan 8 port io pada perangkat perangkat keras saya untuk mentransfer setiap status yang mungkin (2 status per baris ^ 8 baris = 256 status yang mungkin). Unit pemrosesan kemudian dapat memutuskan apa yang harus dilakukan dengan sinyal input digital. Sirkuit digital berarti Anda memiliki dua status perangkat keras: Hai dan Lo, tegangan atau tidak ada tegangan. Dari situlah biner itu berasal. Representasi biner adalah yang paling dekat dengan logam.
Falcon
3
@Sauron - lihat Digital Multiplexer untuk melihat bagaimana rangkaian digital dapat memilih dari salah satu dari beberapa nilai. Jika Anda memiliki bus 8-bit, Anda hanya perlu 8 dari multiplexer digital biner ini secara paralel.
Scott Whitlock
1
@ Falcon Ok ....... Saya pikir itu lebih masuk akal. Saya selalu lupa bahwa pada akhirnya semuanya menjadi sinyal biner .... dan bahkan instruksi seperti "mov" masih direpresentasikan sebagai biner.
1
@Sauron - Lakukan riset pada CPU, ini akan membantu Anda memahami, apa kode op dan bagaimana cara kerjanya. Mengapa kode op tertentu dipilih tidak penting, bahkan menanyakan pertanyaan "mengapa", tidak masuk akal. Memahami bagaimana mereka dipilih dapat membantu Anda lebih memahami tentang CPU dan strukturnya.
Ramhound
9

Saya akan menjawab pertanyaan Anda secara harfiah dan membahas sebagian besar mikroprosesor, bukan komputer pada umumnya.

Semua komputer memiliki semacam kode mesin. Instruksi terdiri dari opcode dan satu atau lebih operan. Sebagai contoh, instruksi ADD untuk Intel 4004 (mikroprosesor pertama) dikodekan sebagai 1000RRRR di mana 1000 adalah opcode untuk ADD dan RRRR mewakili nomor register 0-15 (0000-1111 dalam biner).

Semua instruksi lain yang merujuk salah satu dari 16 register 4-bit (seperti INC, ISZ, LD, SUB, XCHG) juga menggunakan 4-bit rendah untuk menyandikan nomor register, dan berbagai pengkodean dari 4-bit teratas untuk menentukan opcode. Misalnya, ADD, SUB, LD dan XCHG menggunakan opcodes 1000, 1001, 1010, dan 1011 (semuanya dalam biner) yang digabungkan dengan bidang register. Jadi Anda bisa melihat bagaimana suatu pola digunakan untuk menyederhanakan logika.

Program komputer pertama ditulis dengan tangan, mengkodekan tangan angka 1 dan 0 untuk membuat program dalam bahasa mesin. Ini kemudian diprogram ke dalam ROM (Read-Only Memory). Sekarang program umumnya ditulis ke dalam memori Flash yang dapat dihapus secara listrik, dalam kasus mikrokontroler, atau kehabisan RAM, jika mikroprosesor. (Yang terakhir masih membutuhkan semacam memori read-only untuk booting.)

Bahasa mesin menjadi sangat cepat membosankan, sehingga program assembler dikembangkan yang mengambil bahasa assembler mnemonic dan menerjemahkannya, biasanya satu baris kode perakitan per instruksi, ke dalam kode mesin. Jadi alih-alih 10000001, orang akan menulis ADD R1.

Tetapi assembler pertama harus ditulis dalam kode mesin. Kemudian bisa ditulis ulang dalam kode assembler sendiri, dan versi bahasa mesin yang digunakan untuk merakitnya pertama kali. Setelah itu, program dapat berkumpul sendiri (ini disebut bootstrap).

Karena mikroprosesor pertama dikembangkan lama setelah mainframe dan minicomputer ada, dan 4004 sebenarnya tidak cocok untuk menjalankan assembler, Intel mungkin menulis cross-assembler yang berjalan pada salah satu komputer besarnya, dan menerjemahkan kode assembly untuk 4004 menjadi gambar biner yang dapat diprogram ke dalam ROM.

tcrosley
sumber
4

Komputer pada level yang sangat rendah dapat diwakili oleh jalur data dan kontrol . Googling ini bersama-sama dapat memberi Anda banyak membaca karena itu mendasar dalam arsitektur / desain digital.

Saya akan melakukan yang terbaik untuk meringkas:

Seperti yang disebutkan di sini, di jantung kami memiliki ALU - apa yang perlu diketahui tentang ALU (dan bagian lain dari CPU) adalah bahwa ia dapat dikonfigurasi ulang untuk operasi yang berbeda. Lebih khusus, kami memiliki kemampuan untuk mengkonfigurasi ulang jalur data , yaitu bagaimana parameter diambil, operasi apa yang harus dilakukan, dan di mana mereka disimpan setelahnya. Bayangkan bisa memanipulasi ketiga hal ini - ini adalah kendali kami .

Jadi bagaimana kita mencapai ini? Seperti yang sudah disebutkan lagi, kita dapat memanfaatkan logika digital level rendah dan membuat multiplexer untuk jalur yang berbeda. Multiplexer dikendalikan menggunakan satu set bit untuk input - dari mana bit-bit ini diambil? Dikodekan dari instruksi sendiri. Takeaway: Instruksi seperti mov, add, dll hanyalah sekumpulan bit yang memberi tahu CPU cara mengkonfigurasi datapath untuk operasi tertentu. Apa yang Anda baca (mov, add) adalah formulir yang dapat dibaca manusia (bahasa assembly) dan program kami mendefinisikan prosedur data dan operasi.

Saya minta maaf jika ini merupakan penyederhanaan yang berlebihan dari proses yang lebih kompleks bagi mereka yang lebih berpengetahuan luas di bidang ini. FYI, pertukaran teknik tumpukan akan menjadi tempat yang bagus untuk mengajukan pertanyaan ini karena berkaitan dengan logika tingkat yang sangat rendah.

Jon
sumber
3

jika saya mengerti pertanyaan Anda, saya tidak mengerti bagaimana bin / hex atau assembly terkait.

Saya berasumsi daging pertanyaan Anda adalah bagaimana saya dapatkan dari gerbang dasar, DAN, ATAU, TIDAK untuk instruksi seperti memindahkan, memuat, menyimpan, menambahkan, dll.

Saya memiliki set instruksi pengajaran kecil saya sendiri yang saya buat dari awal yang memiliki beberapa detail mengatakan bagaimana cara menambahkan dan mengurangi pekerjaan dari gerbang dasar dan hal-hal seperti itu http://github.com/dwelch67/lsasim .

Cari buku Code (sesuatu sesuatu sesuatu) dari Petzold. Mungkin mulai jalan ke SD tetapi menuntun Anda perlahan dari tidak ada hubungannya dengan komputer dan elektronik ke dalam biner, hex, dan ke gerbang dasar, dll.

Apakah Anda bertanya tentang bagaimana Anda akan membangun satu dari awal hari ini, atau bagaimana mereka melakukannya kembali pada hari itu? Hari ini Anda akan mulai dengan definisi dari set instruksi. Anda hanya duduk dan menuliskannya, Anda berpikir tentang jenis instruksi Anda harus memiliki banyak dan menyimpan dan memindahkan dan alu barang, dan kemudian berapa banyak register, seberapa besar register, ini sebagian mempengaruhi ukuran instruksi, Anda berpikir tentang ukuran instruksi ...

Biarkan saya berhenti dan bertanya bagaimana Anda menulis sebuah program? Mulai dengan layar kosong pada editor teks? Anda memiliki beberapa gagasan tentang tugas yang Anda coba selesaikan variabel yang mungkin Anda butuhkan, fungsi, bahasa pemrograman, dll. Dan setiap orang berbeda tetapi pada tingkat tertentu Anda melakukan sedikit hal ini (misalnya, mendefinisikan dan menulis fungsi), sedikit dari itu (membuat file header dengan mendefinisikan kembali dan enum dan struct dan hal-hal yang dapat digunakan kembali), dan sedikit hal lainnya (hanya kode, isi fungsi dengan variabel dan kode). Dan Anda berputar di sekitar tugas yang berbeda, pada akhirnya Anda merasa memiliki keseimbangan ukuran kode, kecepatan, keterbacaan, kualitas, fungsionalitas, dll. Tidak berbeda dengan desain perangkat keras. perancang perangkat keras menggunakan bahasa pemrograman (vhdl, Verilog) juga dan melalui proses yang sama,

Sama seperti membuat program perangkat lunak, Anda menyeimbangkan keinginan, kinerja, ukuran, fitur, dll. Anda mungkin memiliki beberapa aturan desain yang dipaksakan pada Anda, baik yang Anda inginkan atau yang bos Anda buat, dll. Seperti halnya desain perangkat lunak setelah desain awal ke implementasi Anda mungkin menemukan bahwa Anda memiliki beberapa kesalahan besar dan harus kembali ke desain awal dan mengubah set instruksi, perubahan besar atau kecil. Mungkin sejauh ini memiliki kompiler dan prosesor yang disimulasikan untuk menemukan Anda benar-benar membutuhkan beberapa instruksi spesifik yang secara dramatis meningkatkan kualitas kode yang dikompilasi, kinerja, dll.

Jadi Anda telah menemukan beberapa set instruksi dari awal, Anda telah menggunakan beberapa pengalaman dengan desain perangkat keras untuk mengelompokkan instruksi yang serupa dengan pola bit yang serupa sehingga mereka dapat lebih mudah diterjemahkan, tidak hanya untuk pemrograman bahasa perangkat keras tetapi menghemat daya dan gerbang dan semua itu barang bagus. Saat ini Anda akan membuat semacam simulator, pemahaman saya adalah ARM adalah simulator perangkat lunak pertama kemudian desain perangkat keras datang kemudian, tidak tahu apakah itu benar tetapi tetap dengan cerita itu. Ini tergantung pada tim beberapa tim mungkin hanya orang-orang perangkat keras dan ingin hanya masuk ke pemrograman di hdl, beberapa seperti saya mungkin ingin melakukan sedikit dari keduanya. Sekarang ini tersedia simulator bahasa perangkat keras yang baik sehingga Anda tidak perlu membangun perangkat keras apa pun yang Anda kompilasi dan simulasi dan lakukan banyak proses debugging dengan program / paket simulasi perangkat keras. tim perangkat lunak dapat mengembangkan assembler dan kompiler untuk set instruksi dan menggunakan ram yang disimulasikan dan program umpan rom ke prosesor yang disimulasikan dan memasukkannya melalui langkah-langkahnya. kami telah mensimulasikan boot linux lengkap pada prosesor yang saya kerjakan belum lama ini, membutuhkan waktu berjam-jam tetapi berhasil (menemukan bug cache dalam logika seperti itu).

Jadi sekarang untuk apa yang saya pikir Anda tanyakan. Bagaimana Anda mendapatkan dari gerbang dasar ke prosesor dengan set instruksi. Nah gerbang dasar DAN, ATAU, TIDAK benar-benar analog, mereka tidak memiliki konsep waktu, Anda tidak dapat langsung mengubah tegangan pada input dan saat Anda mengubah tegangan itu output mulai berubah. gerbang terbuat dari transistor dan transistor adalah amplifier, ambil inputnya dengan beberapa angka dan biarkan arus banyak mengalir di sisi lain. ketika kita menggunakannya sebagai gerbang logika kita benar-benar membuat mereka jenuh, tegangan input sangat tinggi atau rendah sehingga transistor hanya bisa menggerakkan tegangan maks atau tanpa tegangan (arus). pada dasarnya transitor diubah menjadi sebuah saklar. Singkat cerita, tidak ada konsep waktu. Untuk memiliki set instruksi, kita harus memiliki instruksi agar kita harus urutan melalui program, kita harus memiliki konsep sekarang kita berada di instruksi ini, dan di slot waktu berikutnya kita akan bekerja pada instruksi itu. Sama seperti permainan mengubah amplifier menjadi saklar Anda memainkan game serupa dengan menggunakan gerbang logika dasar dengan jam. jam berasal dari kristal ajaib dalam kaleng (tidak layak masuk ke sini) yang membuat voltase menyala dan mati pada tingkat yang tetap. gunakan tegangan itu dalam persamaan logika dan Anda bisa mulai mengurutkan hal-hal. jam berasal dari kristal ajaib dalam kaleng (tidak layak masuk ke sini) yang membuat voltase menyala dan mati pada tingkat yang tetap. gunakan tegangan itu dalam persamaan logika dan Anda bisa mulai mengurutkan hal-hal. jam berasal dari kristal ajaib dalam kaleng (tidak layak masuk ke sini) yang membuat voltase menyala dan mati pada tingkat yang tetap. gunakan tegangan itu dalam persamaan logika dan Anda bisa mulai mengurutkan hal-hal.

sangat singkat pikirkan tabel kebenaran ini:

0 0 0
0 1 1
1 0 1
1 1 0

dalam biner:

0 + 0 = 1
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (2 decimal)

berfokus pada lsbit saja, penambah satu bit, tabel kebenaran di atas menggambarkan penambah satu bit. Ini juga menggambarkan gerbang XOR. Satu input benar atau yang lain tetapi tidak keduanya.

Untuk mendapatkan lebih dari satu bit Anda harus melihat carry bits carry in dan carry dan Anda membutuhkan tiga bit penambah dua operan dan carry in dengan dua output, jalankan dan hasilnya bit. Setelah Anda memiliki tiga input dua output adder, Anda dapat melakukan cascade selebar yang Anda inginkan. Tapi ini masih analog, gerbang berubah seketika.

Bagaimana Anda mengubah penambah analog ini menjadi instruksi ADD, adalah Anda memiliki beberapa logika yang melihat instruksi yang duduk sebagai input ke gerbang yang telah Anda susun. beberapa bit dalam instruksi mengatakan, ini adalah instruksi add, beberapa bit mengatakan bahwa satu operan adalah register ini dan itu, mungkin mendaftar 7, bit lain mungkin mengatakan operan lain adalah register 4. dan tergantung pada arsitektur Anda mungkin ada register lain yang didefinisikan dalam instruksi yang mengatakan letakkan hasilnya di register 2. Sekarang lebih banyak logika melihat ini karena saya perlu register 7 konten yang akan dialihkan ke satu input alu adder dan register input 4 yang dialihkan ke adder, dan Anda rute output dari penambah untuk mendaftar 2. Karena jam adalah bagian dari logika ini, ada periode waktu dari awal periode jam ke awal periode jam berikutnya di mana semua sinyal analog menetap dan menyelesaikan persamaan logika yang mereka lakukan. Tidak seperti ketika Anda membalik sakelar lampu, Anda mengubah status lampu dari kata mati ke hidup. dibutuhkan periode waktu agar cahaya itu memanas dan pada dasarnya mencapai kondisi stabil. Tidak jauh berbeda di sini.

Ada beberapa logika yang mengatakan hal-hal seperti jika periode jam ini adalah fase eksekusi instruksi AND, maka periode jam berikutnya saya akan menyimpan hasilnya di register keluaran. pada saat yang sama saya akan mengambil instruksi selanjutnya dll. Jadi untuk prosesor modern dimana eksekusi alu sering hanya satu periode waktu karena logika analog dapat menyelesaikan persamaan logika yang cepat. Prosesor lama yang Anda harus hitung hingga beberapa angka biarkan adder tetap terhubung, tunggu x jumlah clock cycle untuk diselesaikan oleh logika adder, lalu sampel hasil dari output, masukkan alu input yang berbeda, tunggu x jumlah clock cycle untuk untuk menyelesaikan, ulangi selamanya atau sampai listrik padam.

Apa yang saya maksud dengan persamaan logika? Hanya saja, jika mau, Anda bisa memikirkannya dalam hal AND, ATAU, BUKAN gerbang. Untuk setiap bit input ke sirkuit alu adder ada persamaan, kemungkinan persamaan yang sangat panjang yang mencakup jam, yang mencakup sandal jepit (bit memori individu / tunggal) yang berisi instruksi saat ini (ditambah persamaan yang memberi makan masing-masing bit memori) dan terus dan terus. Ambil satu fungsi perangkat lunak yang Anda tulis, dalam bahasa yang Anda tulis itu, dengan asumsi ini adalah fungsi yang mengambil input, melakukan tugas dan kemudian menyelesaikan dan mengembalikan hasilnya. Pikirkan semua kombinasi input yang mungkin dan apa jalur eksekusi yang berbeda melalui fungsi itu. Anda mungkin telah menulisnya dalam beberapa bahasa tingkat tinggi tetapi Anda mungkin bahkan dalam bahasa itu menulis ulang untuk menjadi lebih primitif dan lebih primitif menggunakan banyak struktur bersarang jika-maka-lain. dan turunkan ke bahasa assembly mungkin. Tidak seperti persamaan yang saya bicarakan, pemrogram perangkat keras tidak memprogram dalam persamaan panjang lebar ini seperti yang mungkin Anda program dalam pohon panjang-lebar kalau-kalau-kalau tidak dalam bahasa assembly ketika bahasa pemrograman pilihan menghemat begitu banyak. Sama seperti kompiler yang Anda gunakan mengubah kode sumber kecil Anda menjadi rakitan panjang dengan banyak if-then-elses, ada kompiler yang mengambil kode bahasa pemrograman perangkat keras dan mengubahnya menjadi persamaan logika.

Sekarang kembali ke cpu pertama (yang hari ini kita akan mempertimbangkan mikrokontroler tapi kemudian cpu). Anda melakukan semua hal di atas di atas kertas, dan Anda tidak menggunakan bahasa pemrograman perangkat keras Anda benar-benar menulis persamaan logika, tetapi Anda bahkan lebih hati-hati memilih pola bit untuk instruksi untuk membuat jumlah gerbang dan kabel untuk menghubungkan gerbang itu sesederhana praktis. Di atas kertas, dengan tangan Anda harus membuat daftar panjang gerbang logika yang terhubung dan kemudian Anda harus menggambar komponen yang sebenarnya pada versi topeng silikon yang diledakkan. bahkan saat ini chip sudah selesai menggunakan apa yang mirip dengan proses fotografi atau silkscreen dalam istilah awam sehingga Anda akan mengambil cetakan biru ini jika Anda mau dan mengecilkannya kemudian menerapkannya pada lapisan silikon.

di sini lagi pada hari dimana setiap orang memiliki pegangan yang lebih baik pada perakitan dan tidak hanya mungkin Anda akhirnya melakukan beberapa pemrograman perakitan Anda mungkin tidak memiliki editor teks atau assembler Anda mungkin harus menulis program pertama Anda dengan tangan di atas kertas, kemudian menggunakan manual referensi, dengan tangan dikonversi ke kode mesin, satu dan nol. Pada beberapa komputer Anda mungkin harus memuat ram dengan membalik sakelar, membalik bit alamat, membalik bit data hingga cocok dengan angka pada kertas Anda, membalikkan bit jam ke atas lalu ke bawah dan Anda telah memuat satu lokasi memori dengan satu byte dari satu instruksi program Anda, ulangi beberapa ratus kali lebih banyak dan harap Anda tidak membuat kesalahan.

Dengan cara yang sama dengan yang pertama katakanlah kompiler C mungkin ditulis dalam beberapa bahasa lain kemudian menjadi hosting sendiri dengan ditulis ulang dalam C dan dikompilasi oleh kompiler C pertama sekali lagi dengan sendirinya. Kemudian kompiler C digunakan untuk menemukan bahasa pemrograman lain yang kemudian menjadi hosting sendiri. Kami menemukan sistem operasi dan editor teks yang dibangun di atas diri mereka sendiri, dan itu semua sihir hitam yang tersisa untuk beberapa orang di balik tirai di sudut untuk melakukan ...

ya, sangat panjang lebar, itu adalah pertanyaan besar yang membutuhkan studi bertahun-tahun dan pengalaman untuk benar-benar dipahami. lihat lsasim saya, saya tidak mengklaim sebagai ahli dalam apa pun, tetapi itu adalah set instruksi, ada kedua simulator yang mengeksekusi instruksi yang ditulis dalam C, dan implementasi prosesor yang diimplementasikan dalam bahasa pemrograman perangkat keras yang dapat disimulasikan menggunakan alat yang berbeda. Ditambah assembler kasar dan beberapa alat lainnya dan semacamnya. Mungkin, dengan memeriksa beberapa di antaranya, khususnya kode bahasa pemrograman perangkat keras, mungkin akan menutup celah pada apa yang saya asumsikan Anda tanyakan. Jika saya belum menutup celah itu atau membuat garis singgung panjang lebar tolong beri tahu saya saya akan dengan senang hati menghapus jawaban ini (dengan asumsi saya bisa nongkrong di pertukaran programmer banyak).

old_timer
sumber
Ini benar-benar tidak menjawab pertanyaan penulis, setidaknya tidak menambah apa pun pada diskusi, bahwa jawaban yang diterima tidak mencakup. Matematika biner Anda tidak 100% benar 1 + 1 adalah 0 dengan luapan 1. Bergantung pada ukuran registri, apakah itu 2 atau 0.
Ramhound
@dwelch DAMN! Saya penggemar berat hati Anda jika tidak kurang. +1
AceofSpades
2

CPU beroperasi pada 0 dan 1. Semua instruksi memiliki urutan bit yang mendefinisikannya. Ini adalah kode mesin. Sulit bagi manusia untuk membaca dan menulis. Sebagai langkah pertama kami mengelompokkan 0 dan 1 menjadi 4 bit urutan dan menggunakan 0 sampai F untuk mewakili mereka. Ini mengurangi angka yang harus kita hafal, tetapi masih tidak mudah untuk mengingat kode hex untuk instruksi.

Jadi kami mulai menggunakan majelis yang memiliki "kata-kata" seperti MOV dan ADD. Assembler akan mengganti instruksi dengan set yang benar dari 0 'dan 1 yang mengubah perakitan "daftar" menjadi kode mesin.

Akhirnya kami mengembangkan bahasa tingkat "lebih tinggi" di mana "instruksi" dapat mewakili seluruh urutan kode mesin.

Jim C
sumber
FYI, oktal digunakan sebagai singkatan biner sebelum heksadesimal.
ocodo
Slomojo benar, Oktal, basis 8 menggunakan 3 bit, digunakan bersama dengan hex, basis 16 digunakan 4 bit. Octal memiliki keuntungan karena semua orang tahu angka 0 hingga 7 diwakili. Orang-orang yang tidak menggunakan Hex sering bingung oleh "digit" A hingga F.
Jim C
0

Saya baru-baru ini menemukan Q / A ini dan sekitar setahun yang lalu atau lebih ketika saya mulai bepergian menyusuri jalan ini; Saya akan menemukan ini sebagai sumber daya dan halaman referensi yang sangat bagus sehubungan dengan pertanyaan saya sendiri.


Bagian 1: -Pendahuluan-

Sedikit tentang diri saya:

Pada pertengahan hingga akhir 80-an ketika saya masih di Sekolah Dasar, saya akan membongkar stereo sampah, VCR, dan perangkat elektron lainnya yang berasal dari 50-an hingga 80-an dan akan melihat papan sirkuit dan selalu ingin tahu bagaimana mereka melakukannya bekerja ... Bagaimana mereka benar-benar memperoleh sinyal siaran, menghasilkan audio, video, melakukan ini dan itu dll ... Saya bisa mengenali bagian-bagian individual di sana-sini seperti resister, kapasitor, dioda dan transistor, tetapi tidak tahu apa yang mereka lakukan atau bagaimana mereka berfungsi di usia yang begitu muda.

Selama bertahun-tahun saya selalu luar biasa dalam Matematika, Fisika dan Kimia. Saya mengerti matematika sampai tingkat tinggi dan bahkan dapat membaca beberapa sirkuit sederhana atau dasar dari sekolah menengah dan sekolah menengah saya yang datang kemudian, tetapi saya tidak pernah berhasil belajar tentang gerbang logika dan bagaimana mereka dibangun ... belajar Aljabar Boolean di Sekolah Menengah dari kelas Logika, Probabilitas, dan Statistik Honours saya. Semua kelas matematika dan sains saya adalah kelas kehormatan. Saya tidak mengambil Kalkulus sampai semester kedua di community college. Saya diuji dari Aljabar Perguruan Tinggi dan mengambil Trigonometri sebagai kursus penyegaran. Tingkat matematika tertinggi saya di kelas adalah Kalkulus II dari satu variabel.

Saya sudah bermain video game sejak saya berusia sekitar 3 atau 4 tahun. Sebagai seorang anak saya memiliki Atari, NES, Sega Genesis dan PS1. Ketika saya semakin tua dan memasuki usia remaja akhir saya dan awal 20-an saya telah memperoleh PS2 dan SNES dengan judul pilihan yang dipilih. Ini juga tidak memperhitungkan game PC yang sejauh Doom!

Saya selalu menjadi gamer Console dan PC dan ini tidak termasuk permainan pinball dan arcade.

Saya diberi PC pertama saya ketika saya berusia sekitar 12 tahun untuk Natal di awal tahun 90-an. Hari-hari DOS 6.0 dan Win 3.11 atau OS / 2. Sejak itu saya selalu akrab dengan keluarga sistem operasi "Windows" dan semua sistem yang saya miliki adalah Arsitektur Intel. Saya memiliki pengalaman terbatas dengan Apple atau Mac dari sekolah atau perguruan tinggi, tetapi saya tidak pernah memiliki hak istimewa untuk bekerja pada sistem Linux. Saya punya Cygwin dan saya sudah mencoba belajar bash, tetapi saya sudah terbiasa dengan sintaks Dos atau Command Prompt.

Pada awal 90-an saya akan mendapatkan satu atau dua salinan PC-World dan akan mengetikkan potongan kode ke QBasic yang saya tidak tahu dengan baik dan akan mencoba membuat program-program itu bekerja. Satu-satunya yang berhasil adalah program untuk mengubah penekanan tombol pada deretan tombol beranda menjadi bunyi nada dering yang berbeda. Maksud saya bukan nada dering pada telepon seluler yang saya maksudkan adalah frekuensi terus menerus selama Anda menekan tombol.

Selalu menjadi hasrat saya untuk tidak hanya ingin tahu bagaimana perangkat elektronik bekerja dalam lingkungan di tingkat digital dan logis, untuk belajar bagaimana memprogram komputer, tetapi saya selalu memiliki keinginan untuk ingin membuat video sendiri. permainan. Bahkan di awal 90-an saya ingin membuat game Frogger dan Tetris ...


Ini menjadi motivasi dan keinginan utama saya untuk mengatasi salah satu jenis pemrograman atau pengembangan perangkat lunak terberat dalam bidang Ilmu Komputer dan itu adalah Desain Mesin Game 3D. Ada bidang lain dalam Ilmu Komputer yang sama tangguhnya, namun setiap mesin permainan canggih biasanya atau biasanya akan mencakup hampir semua dari mereka sebagai komponen individu atau sub mesin membutuhkan teknik dan atau sifat mereka.

Saya memiliki latar belakang dalam pemrograman dari masa SMA saya, tetapi ini terbatas pada Visual Basic yang mengerikan. Saya mulai mengambil dan belajar C / C ++ sekitar tahun 2002 - 2003 tidak sampai beberapa tahun setelah saya lulus dari SMA pada tahun 1999. Bahkan sampai hari ini saya tidak memiliki pengalaman kuliah di bidang Ilmu Komputer atau Teknik Komputer, tetapi melalui dedikasi dan tekad, saya telah belajar hampir setiap konsep yang ada ketika datang ke komputer, perangkat keras, pemrograman, algoritma, dll dan saya masih terus belajar sebanyak yang saya bisa ...

Selama masa-masa awal belajar C / C ++, saya memang memiliki akses ke internet tetapi internet saat itu masih dalam tahap awal, situs-situs seperti Amazon, Youtube, Facebook dll. Bahkan belum ada, itu masih zaman 56k modem dial up yang pasang saluran telepon Anda jika Anda tidak memiliki saluran khusus kedua. Butuh beberapa menit hanya untuk membuat gambar ke layar, apalagi pemutaran video terus menerus.

Jadi ketika datang untuk meneliti dan belajar bagaimana memprogram dalam C ++, sumber daya terbatas dan sebagian besar dalam format teks. Ketika mencoba untuk menangani proyek-proyek dari hari-hari awal tutorial internet, banyak dari proyek-proyek itu tidak sepenuhnya lengkap, penulisnya adalah profesional atau mahasiswa dan mereka membuat banyak asumsi bahwa pembaca sudah akrab dengan banyak konsep yang dibutuhkan seperti kompilasi , menghubungkan dan debugging dan integrasi perpustakaan.

Untuk seseorang yang tidak tahu apa-apa tentang topik-topik itu, mereka bingung karena mereka tidak tahu apa yang salah, atau bagaimana cara memperbaikinya, dan bagaimana membuatnya bekerja dengan baik. Butuh waktu berjam-jam bagi saya untuk mencoba-coba dengan sumber daya yang sangat terbatas. Meminta bantuan seperti sekarang kami dapat dengan situs web ini atau mencari penjelasan terperinci yang dapat Anda temukan di cppreference tidak tersedia! Jika Anda secara pribadi tidak mengenal siapa pun, tidak banyak yang dapat Anda minta bantuan!

Seiring berjalannya waktu saya memang meningkatkan beberapa pengetahuan saya di sana-sini, dan akhirnya internet meningkat menjadi DSL, dan sekarang internet Kecepatan Tinggi, situs web menjadi lebih interaktif, video mulai muncul, kualitas video menjadi lebih baik seiring berjalannya waktu, situs-situs seperti ketika Youtube mulai muncul dan segalanya menjadi sedikit lebih mudah di sisi penelitian. Semakin banyak tutorial tersedia, beberapa bagus dan bermanfaat di mana yang lain mengajarkan praktik buruk ...

Saya juga menghabiskan banyak waktu untuk menemukan dan memperoleh alat yang diperlukan untuk pengembangan. Saya harus belajar sintaks bahasa, proses kompilasi dan kompilasi, menghubungkan, membangun, dan debugging. Kemudian saya harus belajar tentang berbagai perpustakaan dan API yang tersedia di luar sana dan cara mengkonfigurasi proyek atau solusi saya untuk menautkan semua dependensi itu.

Selama bertahun-tahun saya telah menyaksikan bahasa C ++ tumbuh, berkembang dan beradaptasi dari waktu ke waktu. Pada awalnya ia tetap hampir sama selama bertahun-tahun, tetapi dalam 10 tahun terakhir ia telah berubah secara dramatis dalam rentang singkat ini sejak awal.

Saya menyebutkan semua ini karena C ++ adalah salah satu bahasa terberat untuk dikuasai sepenuhnya karena keserbagunaannya, kekuatannya, set fitur yang kaya dan kemampuan untuk memungkinkan Anda menembak diri sendiri di kaki! Dan bahkan dengan semua peringatannya, itu adalah salah satu bahasa yang paling kuat dan disukai yang digunakan dalam industri terkemuka sebagai standar untuk jenis pengembangan ini karena ketika dilakukan dengan benar itu cepat, singkat, dapat diandalkan dan menggunakan cetak kaki terkecil.

Sejak itu saya telah belajar mandiri dalam C / C ++ selama bertahun-tahun dengan tujuan dan fokus pada pembelajaran Pemrograman Grafik 3D dan Desain Mesin Game. Saya telah menghabiskan 100 hingga 1.000 jam untuk mencari, meneliti, dan banyak lagi dalam membaca, mempelajari, dan menerapkan pengetahuan itu ke dalam perancangan produk dan aplikasi yang bermanfaat. Saya selalu memiliki keinginan dan keinginan untuk ingin belajar lebih banyak untuk meningkatkan keahlian dan keterampilan saya.


Ini adalah tahap pertama, kemudian saya mulai membaca dan bekerja dengan DirectX 9.c, yang telah saya lakukan di C / C ++ dan bahkan C #. Kemudian saya pindah ke DirectX 10 dan Legacy OpenGL 1.0. Dari DirectX 11 dan OpenGL 3.x - 4.x mereka datang dan sekarang saya bahkan telah mencoba tangan saya di Vulkan.

Saya telah membangun mesin permainan yang sukses bekerja melalui berbagai tutorial online baik dalam format teks dan video. Saya sudah menyatakan bahwa saya memiliki latar belakang yang kuat dalam matematika tetapi terbatas pada Kalkulus I & II. Saya harus belajar sendiri Vektor Kalkulus yang saya ketahui dari kelas Fisika berbasis Kalkulus saya di perguruan tinggi, tetapi untuk Aljabar Linier dengan Transformasi Afin dan Geometri Analitik, saya harus mempelajarinya sendiri ketika persamaan, fungsi, metode, algoritma, dan konsep dibutuhkan. Kemudian saya harus belajar bagaimana menerjemahkannya menjadi kode yang efisien, mudah dibaca, dapat diandalkan, dapat digunakan kembali yang generik dan bebas bug semaksimal mungkin dengan melakukan debugging ratusan hingga ribuan jam.

Ini merupakan perjalanan yang luar biasa untuk mempelajari topik dan algoritma yang mencakup manajemen memori, penghitungan referensi, pemasangan, rekursi, dan banyak lagi yang digunakan dalam banyak, jika tidak semua komponen mesin gim di mana mereka sangat luas. Saya bisa mendaftar semuanya di sini, tetapi itu akan menjadi informasi yang cukup untuk mengisi 3 atau 4 ruang jawaban yang layak ditulis. Namun, saya akan memasukkan daftar topik umum bukan hanya sub topik mereka.

Berikut adalah topik atau daftar subjek dalam apa yang terdiri dari mesin permainan yang berfungsi penuh yang mencakup semua teknik rending yang berbeda, mengatur saluran pipa rendering dan shader, teknik naungan dan pencahayaan melalui shader, pemrosesan sebelum dan sesudah, frame buffer, back buffer , pemuatan gambar, pemuatan dan penguraian model dan audio, menciptakan bentuk-bentuk primitif dengan sifat-sifat bahan warna, tekstur dan koordinat normal dengan pemetaan tekstur manual, transformasi objek, tipe kamera, hierarki grafik adegan, kelas manajer untuk tekstur, audio, font, & shader dan manajemen memori, sistem pencatatan dengan penanganan pengecualian, teknik pemrograman multi-threaded dan paralel, jaringan, mesin fisika, deteksi tabrakan, penghasil partikel, animasi, game AI, pembangkitan medan, kotak langit dan kubah langit, perenderan air,dedaunan dan banyak lagi ..., GUI dengan font bertekstur untuk rendering teks, overlay HUD, inventaris, pembuatan peta dan makro, sistem negara dan mesin negara, dan akhirnya menulis parser untuk membuat bahasa skrip Anda sendiri untuk mengotomatisasi sebagian besar objek ini agar memiliki kemampuan untuk mengubah nilai data di dalam mesin tanpa harus mengkompilasi ulang hanya dengan memuat file data untuk mengisi objek dan struktur data dalam wadah masing-masing pada saat startup aplikasi.dan akhirnya menulis parser untuk membuat bahasa skrip Anda sendiri untuk mengotomatiskan banyak objek ini untuk memiliki kemampuan untuk mengubah nilai data dalam mesin tanpa harus mengkompilasi ulang hanya dengan memuat dalam file data untuk mengisi objek data dan struktur dalam wadah masing-masing saat startup aplikasi.dan akhirnya menulis parser untuk membuat bahasa skrip Anda sendiri untuk mengotomatiskan banyak objek ini untuk memiliki kemampuan untuk mengubah nilai data dalam mesin tanpa harus mengkompilasi ulang hanya dengan memuat dalam file data untuk mengisi objek data dan struktur dalam wadah masing-masing saat startup aplikasi.


Selama bertahun-tahun saya telah tertarik untuk ingin belajar bahasa assembly, dari mereka saya ingin belajar tentang kompiler, assembler dan sistem operasi sederhana, maksud saya cara kerja internal mereka, bagaimana mereka dibangun dan dirancang.

Waktu terus berjalan dan kemudian saya sedikit melangkah dan mulai mempelajari emulasi perangkat keras. Saya fokus secara khusus pada NES tetapi ingin belajar emulasi hardware dari CPU secara umum. Ini membuat saya belajar tentang set instruksi di mana saya sudah tahu konsep dan apa itu karena saya sudah akrab dengan keluarga x86 Intel sampai taraf tertentu, tapi sekarang saya harus belajar Set Instruksi 6502.

Namun dengan menyelami ini, saya akhirnya melakukan lebih banyak penelitian dan mulai belajar tentang Arsitektur Set Instruksi dari perspektif Teknik. Ini membuat saya belajar tentang bagaimana CPU dibangun dari gerbang logika dan bagaimana gerbang logika dibangun dari transistor bersama dengan berbagai komponen listrik lainnya. Jadi saya akhirnya belajar tentang ini dari dua perspektif dari atas ke bawah. Kedua metode itu sangat efektif dan saya pikir belajar dari keduanya membantu membangun jembatan atau celah di mana perangkat lunak memakan perangkat keras.

Dari sini, saya harus menyegarkan kembali pada Aljabar Boolean saya dan saya akhirnya belajar tentang K-Maps, Tabel Implikasi, Mesin Negara baik Mealy dan Moore dan berbagai hal lain yang menghubungkan Logika Biner dan Aritmatika dengan Gerbang Logika Fisik dan Sirkuit Terpadu. Dan ini membawa saya ke masa lalu kesal di mana saya mulai bekerja dengan Logisim, dan mulai belajar HDL, VHDL, Verilog dll ...

Saya telah mempelajari semua ini di waktu luang saya ketika saya bisa sepanjang 15 - 18 tahun terakhir.


Berikut adalah beberapa situs dan tautan yang telah memandu saya selama bertahun-tahun. Banyak di antaranya baru-baru ini karena banyak situs yang awalnya saya pelajari dari tidak ada lagi, saya kehilangan tautan dan tidak ingat, atau mesin pencari mendorong mereka di bagian paling belakang dari daftar pencarian mereka ...

  • Bahasa - C ++

  • Tutorial Grafik 3D dan Situs Web Sumberdaya

  • Seri dan saluran Youtube mencakup topik-topik di atas serta perangkat keras, komputer, dan teknik listrik. Ada terlalu banyak untuk dicantumkan sehingga saya akan mencantumkan beberapa di antaranya di sini yang menurut saya paling berguna dan banyak akal. Saya tidak akan memberikan tautan tetapi Anda dapat mencari youtube untuk saluran ini.

    • 3Blue1Brown - Matematika Tingkat Lanjut
    • Bisqwit - Pemrograman C / C ++ Lanjut (Proyek Aplikasi) - Emulator Perangkat Keras NES
    • Jason Turner - Teknik pemrograman C ++ Modern Tingkat Lanjut
    • javidx9 - Pemrograman C / C ++ Lanjut (Proyek Aplikasi) - Emulator Perangkat Keras NES / Beberapa Majelis
    • MIT OpenCourse - Program Kuliah di Matematika dan Ilmu Komputer
    • Kursus Online Bilkent - Program Kuliah di Ilmu Komputer dan Teknik Komputer (MIPS Desain CPU)
    • Cherno - Advanced C / C ++ Topik dan Aplikasi Pemrograman - Pengembangan Mesin Game
    • Ben Eater - Rekayasa Perangkat Keras - Aplikasi Praktis melalui Breadboards
    • Neso Academy - Rekayasa Perangkat Keras - Teori dan Konsep
    • Socratica - pemrograman Python
    • Sederhananya - Rekayasa Perangkat Keras - Teori dan Konsep
    • Bitwise - Advanced C / C ++ Merancang Assembler melalui Emulasi Perangkat Keras
    • Bo Qian - C ++ Topik dalam struktur data dan algoritma.
    • LineByLine - Pemrograman Vulkan
    • Joshua Shucker - Pemrograman Vulkan
    • www.MarekKnows.com - C ++, Matematika 3D, dan Pengembangan Mesin Game

Dan ini tidak memperhitungkan beberapa buku yang saya miliki tentang topik-topik ini.

-Catatan- Tolong jangan memilih ini karena ini hanya pesan ke pembaca pengalaman pribadi saya dan tidak ada upaya untuk menjawab atau referensi pertanyaan asli. Dalam beberapa hari berikutnya ketika saya punya waktu; Saya akan menambahkan jawaban tindak lanjut untuk memberikan pemikiran tentang pertanyaan OP sambil memberikan tautan yang bermanfaat sebagai referensi dan serangkaian sumber daya dan saya akan memperbarui jawaban ini juga untuk menyertakan beberapa tautan di sini dan untuk memodifikasi catatan ini. Sudah terlambat dan saat ini saya tidak punya waktu untuk mengoreksi dan mengedit apa yang sudah saya tulis. Saya akan melakukan ini ketika saya bisa ".

Francis Cugler
sumber
Saya baru saja memperbarui jawaban atau posting ini. Saya akan menambahkan Bagian 2 yang benar-benar akan menjawab pertanyaan, namun saya tidak memiliki poin reputasi yang cukup untuk melakukannya. Butuh beberapa waktu untuk membangun poin reputasi yang diperlukan sebelum saya dapat menambahkan jawaban kedua saya. Posting ini bukan jawaban yang sebenarnya tetapi saya akan menggunakannya sebagai referensi dan mencari tabel alasan jawaban saya yang sebenarnya. Penting untuk memiliki beberapa sumber daya yang tercantum di atas untuk membantu menjembatani kesenjangan antara perangkat lunak dan perangkat keras.
Francis Cugler
-2

Pada intinya, CPU biasanya hanya mesin negara. Jadi, Anda harus memahami bagaimana gerbang logika dan sandal jepit atau register bergabung untuk membuat mesin negara.

Mesin keadaan mengambil input dan kondisi saat ini, menjalankannya melalui logika boolean (dan berpotensi aritmatika), dan kemudian memberikan output dan keadaan berikutnya. Salah satu input dapat berupa register instruksi. Salah satu output dapat berupa mengaktifkan dan memilih sumber untuk memuat ulang register instruksi, mungkin juga menambah atau memuat register lain yang bertindak sebagai penghitung program. Dengan itu, ditambah beberapa memori yang dapat dialamatkan, Anda dapat mengurutkan melalui instruksi.

Setelah Anda memiliki cara untuk mengurutkan instruksi, Anda dapat menggunakan logika untuk mendekode bit instruksi ini, ditambah keadaan saat ini, ke sekelompok bit kontrol lainnya. Beberapa bit kontrol ini dapat bertindak sebagai input untuk mengontrol sekelompok logika yang dapat melakukan aritmatika dan logika kata-lebar, menyebutnya sebagai ALU. Bit lain dapat memuat barang atau memilih input untuk ALU. Bit lain dapat mengatakan di mana menyimpan hasil ALU. Atau memuat register pengalamatan. Atau tulis ke memori atau output lainnya. Dll

Bagian dari merancang set instruksi hanya mencari tahu kombinasi bit mana, ketika diterjemahkan, mengendalikan semua register dan urutan mesin negara. Ini telah dilakukan dan (kembali) dioptimalkan ribuan cara yang berbeda.

Setidaknya ada 3 level buku teks universitas tentang hal yang tidak sepele ini.

hotpaw2
sumber
2
Ini tidak menjelaskan bagaimana operasi MOV dilindungi ke dalam nilai biner. Ini tidak menyebutkan instruksi operasi MOV adalah sebuah nilai, ini adalah kata kunci yang kami gunakan, jadi kami tidak perlu menghafal nilai biner 16 hingga 32 bit.
Ramhound