Mengapa kita perlu bahasa rakitan?


27

Kami kebanyakan menulis program dalam bahasa tingkat tinggi. Jadi saat belajar saya menemukan bahasa assembly. Jadi assembler mengkonversi bahasa assembly ke bahasa mesin dan compiler melakukan hal yang sama dengan bahasa tingkat tinggi. Saya menemukan bahasa assembly memiliki instruksi seperti memindahkan r1 r3, memindahkan 5 dll. Dan itu agak sulit untuk dipelajari. Jadi mengapa bahasa assembly dibuat? Atau bahasa yang lebih dulu bahkan sebelum bahasa tingkat tinggi? Mengapa saya belajar tentang assembler di kelas teknik komputer saya?


13
Assembler adalah kode mesin yang bisa dibaca manusia, itu sebabnya.
Andrej Bauer

4
Karena itu penting untuk mengetahui cara kerja ketika kita dekat dengan perangkat keras. Ketika kami menulis rakitan kami memahami bagaimana perangkat keras komputer bekerja dan berfungsi pada tingkat rendah. Cara terbaik untuk itu adalah bahasa rakitan karena bahasa mesin membosankan dan tidak bisa dibaca seperti rakitan. Apakah Anda benar-benar lebih suka menggunakan kotak ajaib dan tidak pernah melihat ke dalam?
Spencer Wieczorek

Jawaban:


32

"Jadi mengapa bahasa assembly dibuat?"

Bahasa assembly dibuat sebagai singkatan yang tepat untuk pengkodean level mesin, sehingga Anda tidak perlu menghitung 0s dan 1s sepanjang hari. Ini bekerja sama dengan kode level mesin: dengan instruksi dan operan.

"Yang mana yang lebih dulu?"

Wikipedia memiliki artikel yang bagus tentang Sejarah Bahasa Pemrograman

"Mengapa saya belajar tentang assembler di kelas teknik komputer saya?"

Meskipun itu benar, Anda mungkin tidak akan menemukan diri Anda menulis aplikasi pelanggan berikutnya dalam perakitan, masih ada banyak manfaat dari pembelajaran assembly.

Saat ini, bahasa assembly digunakan terutama untuk manipulasi perangkat keras langsung, akses ke instruksi prosesor khusus, atau untuk mengatasi masalah kinerja kritis. Penggunaan yang umum adalah driver perangkat, sistem tertanam tingkat rendah, dan sistem waktu nyata.

Bahasa assembly sedekat mungkin dengan prosesor seperti yang Anda dapatkan sebagai programmer sehingga algoritma yang dirancang dengan baik menyala - perakitan sangat bagus untuk optimasi kecepatan. Ini semua tentang kinerja dan efisiensi. Bahasa assembly memberi Anda kendali penuh atas sumber daya sistem. Sama seperti jalur perakitan, Anda menulis kode untuk memasukkan nilai tunggal ke dalam register, menangani alamat memori secara langsung untuk mengambil nilai atau pointer. (sumber: codeproject.com )


29

Mengapa kita perlu bahasa rakitan?

Sebenarnya hanya ada satu bahasa yang kita perlukan , yang disebut "bahasa mesin" atau "kode mesin". Ini terlihat seperti ini:

0010000100100011

Ini adalah satu-satunya bahasa yang dapat digunakan komputer Anda secara langsung. Ini adalah bahasa yang digunakan CPU (dan secara teknis, berbagai jenis CPU berbicara dengan versi yang berbeda). Ini juga menyebalkan untuk dilihat dan mencoba untuk mengerti.

Untungnya, setiap bagian dari biner sesuai dengan makna tertentu. Ini dibagi menjadi beberapa bagian:

0010|0001|0010|0011

operation type  source register  other source  destination register
0010            0001             0010          0011

Nilai-nilai ini sesuai dengan:

operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3

Jadi operasi ini akan menambahkan angka-angka dalam register 1 dan 2 dan memasukkan nilai itu dalam register 3. Jika Anda benar-benar memasukkan nilai-nilai ini ke dalam CPU dan katakan "pergi", itu akan menambahkan dua angka untuk Anda. Operasi "kurangi" bisa jadi 0011 atau apalah, bukannya 0010 di sini. Nilai berapa pun akan membuat CPU melakukan pengurangan.

Jadi sebuah program bisa terlihat seperti ini (jangan mencoba memahaminya, karena saya membuat versi kode mesin khusus ini untuk menjelaskan banyak hal):

instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000

Apakah ini payah membaca? Pastinya. Tapi kami membutuhkannya untuk CPU . Nah, jika setiap kode mesin sesuai dengan tindakan tertentu, mari kita membuat singkatan "Bahasa Inggris" yang sederhana, dan setelah kita memahami apa yang sedang dilakukan program, ubahlah menjadi kode mesin biner nyata dan berikan kepada CPU untuk dijalankan.

Jadi instruksi asli kami dari atas dapat terlihat seperti:

(meaning)      operation type  source register  other source  destination register
(machine code) 0010            0001             0010          0011
("English")    add             r1               r2            r3

Perhatikan bahwa versi bahasa Inggris ini memiliki pemetaan yang tepat untuk kode mesin . Jadi ketika kita menulis baris "Bahasa Inggris" ini, kita benar-benar hanya menulis kode mesin yang lebih ramah dan lebih dimengerti.

Nah, ini bahasa assembly. Itu sebabnya itu ada, dan mengapa itu awalnya dibuat.

Untuk memahami mengapa kita membutuhkannya sekarang, baca jawaban di atas, tetapi kunci yang perlu dipahami adalah ini: Bahasa tingkat tinggi yang tidak memiliki satu representasi adalah kode mesin. Misalnya dalam C, atau Python, atau apa pun:

z = x + y

Ini terdengar seperti tambahan kami dari atas, dengan asumsi xada di register 1, yada di register 2, dan zharus berakhir di register 3. Tapi bagaimana dengan baris ini?

z = x * 2 + (y / 6) * p + q - r

Coba mewakili bahwa baris dalam 16 bit biner dan menceritakan CPU "pergi". Kamu tidak bisa Kode mesin tidak memiliki instruksi operasi tunggal untuk melakukan penambahan, pengurangan, dan apa pun lainnya dengan 4 atau 5 variabel sekaligus. Jadi itu harus dikonversi ke urutan kode mesin terlebih dahulu. Ini adalah apa yang Anda lakukan ketika Anda "mengkompilasi" atau "menafsirkan" bahasa tingkat tinggi.

Ya, kami punya program untuk melakukan itu, jadi mengapa kita perlu perakitan sekarang? Nah katakanlah program Anda berjalan lebih lambat dari yang Anda harapkan, dan Anda ingin tahu mengapa. Melihat "output" bahasa mesin dari baris ini, mungkin terlihat seperti:

1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010

Hanya untuk menyelesaikan satu baris Python. Jadi Anda benar-benar ingin men-debug itu?!?!?! NO . Sebaliknya, Anda meminta kompiler Anda dengan ramah memberi Anda output dalam bentuk yang sebenarnya bisa Anda pahami dengan mudah, yang merupakan versi bahasa assembly yang sesuai persis dengan kode mesin itu. Kemudian Anda dapat mengetahui apakah kompiler Anda melakukan sesuatu yang bodoh dan mencoba memperbaikinya.

(Catatan tambahan pada saran @ Raphael: Anda sebenarnya dapat membuat CPU yang berfungsi dengan hal-hal selain kode biner, seperti kode ternary (basis 3) atau decimal, atau bahkan ASCII. Namun untuk tujuan praktis, kami benar-benar telah menggunakan binary.)


2
Pada prinsipnya, tidak ada yang menghalangi kita untuk membangun CPU yang bekerja dengan bahasa assembly secara langsung. ASCII hanyalah penyandian yang tidak efisien untuk tujuan ini, itu saja.
Raphael

Terima kasih untuk tambahannya. Saya setuju, tetapi melewatkan itu untuk tujuan memahami tujuan majelis. Saya akan menambahkan catatan.
Chris Cooper

15

Jadi mengapa bahasa assembly dibuat? atau apakah itu yang didahulukan bahkan sebelum bahasa tingkat tinggi?

Ya, assembly adalah salah satu bahasa pemrograman pertama yang menggunakan teks sebagai input, tidak seperti kawat solder, menggunakan papan plug, dan / atau membalik saklar. Setiap bahasa rakitan dibuat hanya untuk satu prosesor atau rangkaian prosesor karena instruksi dipetakan langsung ke opcode yang dijalankan oleh prosesor.

Mengapa saya belajar tentang assembler di kelas teknik komputer saya?

Jika Anda perlu memprogram driver perangkat atau menulis kompiler maka memahami cara kerja prosesor sangat berharga, jika tidak diperlukan. Cara terbaik untuk memahami ini adalah dengan menulis beberapa kode dalam rakitan.

Jika Anda melihat bagaimana kompiler menulis kode, biasanya melihat opsi untuk memanggil konvensi yang tanpa mengetahui rakitan mungkin tidak dapat dipahami.

Jika Anda harus menyelesaikan bug dan satu-satunya input yang Anda miliki adalah dump inti , maka Anda pasti perlu tahu assembly untuk memahami output yang merupakan kode assembly dan jika beruntung ditambah dengan pernyataan level yang lebih tinggi dari bahasa level tinggi.


14

Biarkan saya menambahkan satu aspek yang kurang praktis. Ini (mungkin) bukan alasan historis tetapi alasan untuk Anda, hari ini.

Majelis (dibandingkan dengan bahasa tingkat tinggi) telanjang . Itu tidak menyembunyikan apa pun (yang dilakukan dalam perangkat lunak), dan sederhana dalam arti bahwa ia memiliki rangkaian operasi yang relatif kecil dan tetap.

Ini dapat membantu untuk analisis algoritma yang tepat. Semantik dan aliran kendali sangat sederhana sehingga penghitungan semua operasi (atau angka yang diharapkan) dapat dilakukan dengan memberi anotasi pada grafik aliran kendali dengan jumlah transisi (probabilitas). Knuth melakukan ini dalam buku-buku TAoCP-nya dengan sangat baik, menunjukkan beberapa analisis algoritma yang paling ketat.

Anekdot: kolega saya telah belajar membaca Java Bytecode untuk tujuan ini.


4

Ada jawaban di sini:

Semua jawaban ini menunjuk ke:

  • Optimasi Kecepatan / Memori
  • Memahami cara kerja mesin
  • Jadi Pemrogram Noob menjadi Ahli
  • Jika Anda tahu assembly, Anda tahu cara menulis kompiler untuk bahasa Lvl Tinggi Anda
  • dll

1
Apakah Anda membagikan semua pandangan ini? Apa pengalaman anda (Khususnya, item "Jadi Pemrogram Noob menjadi Pakar" tampaknya sudah ketinggalan zaman beberapa dekade bagi saya.)
Raphael

woah woah Anda tidak perlu terlalu sensitif tentang hal ini. Saya hanya menghubungkan jawaban untuk pertanyaan rangkapnya. Dan "So Noob Programmer menjadi Pakar" terpilih tertinggi di sini . Pergi berdebat dengannya, bukan aku =)
compski

1
Saya tidak sensitif, saya mencoba membantu Anda membuat jawaban Anda bagus (saat ini tidak, karena Anda hanya menautkan ke beberapa sumber, tidak ada yang sepenuhnya menjawab pertanyaan). Memasukkan pikiran Anda sendiri dalam perbandingan adalah langkah pertama untuk mencapai tujuan itu. (Catat bahwa dengan mengaitkan opini dengan cara yang tidak termasuk, Anda memberikan nilai pada mereka; dengan kata lain, Anda harus dapat berdebat mengapa Anda menilai pendapat itu cukup untuk (kembali) memposting sebagai jawaban.)
Raphael

Yah pengalaman saya adalah saya benar-benar benci dan berjuang dengan belajar bahasa majelis setelah terbiasa dengan beberapa bahasa pemrograman tingkat tinggi. Dan saya tahu mereka yang merupakan programmer yang baik atau tahu C ++ / C sebelumnya dapat memprogram di ASM dengan cukup baik. Saya tidak berpikir pendapat saya cukup dihargai untuk diposting dalam jawaban saya jadi itu sebabnya ...
compski

Tautan pertama Anda rusak.
Hola Kedelai Edu Feliz Navidad

1

Assembly = kode mesin
Beberapa orang terus membicarakan tentang bagaimana bahasa assembly berbeda dari kode numerik yang dimengerti CPU.
Ini (sementara benar) benar-benar melenceng.
Sejauh terjemahan berjalan bahasa assembly dan numerik (biner, hex apapun) adalah satu dan hal yang sama.

Grok atau drop it
Jika Anda grok rakitan Anda tahu bagaimana komputer yang sebenarnya bekerja.
perakitan grokking melibatkan:

  • Mempelajari instruksi dan apa artinya (duh).
  • Memahami apa yang dilakukan instruksi, apa yang tidak mereka lakukan dan semua efek sampingnya .
  • Mempelajari cara CPU memproses instruksi
    • Cara kerja pipeline.
    • Apa multiscalarartinya
    • Apa inti CPU itu.
    • Cara kerja cache.
    • Memahami bagaimana menghitung siklus
    • mempelajari ajaran Agner Fog
  • Memahami bagaimana kompiler menghasilkan kode dan bagaimana mereka gagal di kali.
  • Mengoptimalkan masalah yang terdefinisi dengan baik dan sangat spesifik.

Jika Anda grok perakitan Anda juga memiliki gambaran yang hampir lengkap tentang bagaimana CPU terhubung ke keyboard Anda bekerja.
Anda perlu menggunakan pengetahuan ini seperti ahli bedah otak menggunakan pisau bedahnya.

Tidak perlu abstraksi bau
Kecuali jika Anda grok perakitan (dan dengan demikian CPU di atas meja operasi) Anda tidak akan pernah bebas dari cengkeraman abstraksi mesin RAM (atau Tuhan melarang mesin Turing horor ).

L33t Hax0r 5k1llz
Assembly juga membantu Anda memahami bagaimana 133thax0r berhasil mengalahkan skema perlindungan. (T: mengapa ASLR tidak berfungsi ? Karena mov rax,fs:[28h]merusaknya ).

The 0,1%
Bukan pengetahuan tentang perakitan yang penting, tetapi pengetahuan tentang mesin yang Anda kerjakan yang penting.
Jika Anda ingin tahu mesin, Anda harus memahaminya dan itu berarti berbicara bahasa mesin.

Jika tidak, maka Anda akan terjebak dengan abstraksi.
Itu ilmu dan itu bagus, tapi itu tidak pernah gambaran lengkap.

Ini seperti belajar berbicara Xhosa,
kecuali jika Anda bertujuan untuk tingkat guru, tetap dengan apa yang Anda ketahui, klik itu akan mempersulit hidup Anda .

Karena itu menyenangkan.


1
Paling sering menggunakan kata grok dalam sebuah artikel yang pernah saya temui
rekciltnuc

-1

Sampai saat ini, saya pertama kali belajar RPG II menggunakan IBM System 32, dan kemudian belajar APL pada 370. Saya semua tentang ukuran dan kecepatan. Mantra saya lebih kecil dan lebih cepat. Assembly adalah bahasa yang paling ringkas dan tercepat di luar sana. Saya akan membuat program pengujian di C dan Assembly. Di mana program C akan membutuhkan 100-an Kb, program Majelis yang setara seringkali kurang dari 5 Kb. Ketika mempelajari output dari kompiler C saya akan menemukan kode yang akan memeriksa dan memeriksa kembali parameter membuat pemeriksaan bersyarat untuk kemungkinan kesalahan yang cukup sering langka dan eksotis dan sangat tidak perlu, yang semuanya membutuhkan waktu, tetapi mengasapi memori terbesar melewati semua segalanya ke dan dari tumpukan.

Dalam lingkungan pemrograman saat ini, menulis kode memberikan tingkat keamanan dan perlindungan ekstra. Mampu membaca info langsung dari perangkat keras yang tidak dapat diakses ke bahasa tingkat tinggi, memungkinkan Anda mengenkripsi dengan Assembly dengan cara yang hanya bisa digunakan oleh program di mesin itu. Misalnya mengenkripsi kunci pengguna menggunakan alamat MAC dari antarmuka jaringan, dan kemudian memarkir kunci itu pada sektor tertentu dari hard drive kemudian menandai sektor tersebut sebagai buruk sehingga file lain tidak dapat menimpanya. Tentu saja Anda kehilangan sektor ini, tetapi apa itu? 2048 atau 4096 byte dari miliaran atau triliunan?


1
Apa artinya "tidak dapat diakses oleh bahasa tingkat tinggi"?
David Richerby
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.