Mengapa Anda memprogram dalam perakitan? [Tutup]

86

Saya punya pertanyaan untuk semua peretas tingkat rendah hardcore di luar sana. Saya menemukan kalimat ini di sebuah blog. Menurut saya sumbernya tidak penting (Haack jika Anda benar-benar peduli) karena sepertinya itu pernyataan umum.

Misalnya, banyak Game 3-D modern memiliki mesin inti berperforma tinggi yang ditulis dalam C ++ dan Assembly.

Sejauh perakitan berjalan - adalah kode yang ditulis dalam assembly karena Anda tidak ingin kompiler mengeluarkan instruksi tambahan atau menggunakan byte yang berlebihan, atau apakah Anda menggunakan algoritma yang lebih baik yang tidak dapat Anda ekspresikan dalam C (atau tidak dapat kompilator mengumpulkannya)?

Saya benar-benar mengerti bahwa penting untuk memahami hal-hal tingkat rendah. Saya hanya ingin memahami mengapa program di assembly setelah Anda memahaminya.

Tom Ritter
sumber
1
Pertanyaan serupa sudah ada, saya pikir ...
mmx
8
Eeeeehh .. secara teknis ini pertanyaan yang berbeda. Pertanyaan-pertanyaan itu adalah sama-sama kenapa belajar assembly, ini kenapa program didalamnya, yang .. menurut saya berbeda ....?
cgp
4
Mengapa Anda memprogram dalam perakitan? - Mari kita lihat beberapa jawaban TIDAK MUNGKIN untuk pertanyaan itu: 1) Untuk membuat kode saya dapat dipelihara, 2) fleksibel, 3) untuk menghasilkan portabilitas, 4) testabilitas, 5) keterbacaan, ...;)
ivan_ivanovich_ivanoff
9
keamanan pekerjaan ........
San Jacinto
3
karena itu menyenangkan .. :)
RainingComputers

Jawaban:

170

Saya pikir Anda salah membaca pernyataan ini:

Misalnya, banyak Game 3-D modern memiliki mesin inti berperforma tinggi yang ditulis dalam C ++ dan Assembly.

Game (dan sebagian besar program saat ini) tidak "ditulis dalam rakitan" dengan cara yang sama seperti "ditulis dalam C ++". Blog itu tidak mengatakan bahwa sebagian besar permainan dirancang dalam perakitan, atau bahwa tim pemrogram duduk dan berkembang dalam perakitan sebagai bahasa utama mereka.

Apa ini benar-benar berarti adalah bahwa pengembang pertama menulis permainan dan membuatnya bekerja di C ++. Kemudian mereka membuat profil, mencari tahu apa kemacetannya, dan jika bermanfaat, mereka mengoptimalkannya dalam perakitan. Atau, jika mereka sudah berpengalaman, mereka tahu bagian mana yang akan menjadi hambatan, dan mereka memiliki bagian yang dioptimalkan dari game lain yang mereka buat.

The titik pemrograman dalam perakitan adalah sama seperti yang selalu telah: kecepatan . Akan konyol untuk menulis banyak kode di assembler, tetapi ada beberapa pengoptimalan yang tidak disadari kompiler, dan untuk jendela kode yang cukup kecil, manusia akan melakukannya lebih baik.

Misalnya, untuk floating point, kompiler cenderung cukup konservatif dan mungkin tidak mengetahui beberapa fitur yang lebih canggih dari arsitektur Anda. Jika Anda bersedia menerima beberapa kesalahan, Anda biasanya dapat melakukan lebih baik daripada kompiler, dan ada baiknya menulis sedikit kode itu dalam rakitan jika Anda menemukan banyak waktu dihabiskan untuk itu.

Berikut beberapa contoh yang lebih relevan:

Contoh dari Game

  • Artikel dari Intel tentang mengoptimalkan mesin game menggunakan intrinsik SSE. Kode terakhir menggunakan intrinsics (bukan inline assembler), jadi jumlah perakitan murni sangat kecil. Tetapi mereka melihat keluaran assembler oleh compiler untuk mencari tahu apa yang harus dioptimalkan.

  • Akar kuadrat terbalik cepat dari gempa . Sekali lagi, rutinitas tidak memiliki assembler di dalamnya, tetapi Anda perlu mengetahui sesuatu tentang arsitektur untuk melakukan pengoptimalan semacam ini. Penulis tahu operasi apa yang cepat (perkalian, geser) dan mana yang lambat (bagi, akar). Jadi mereka datang dengan implementasi akar kuadrat yang sangat rumit yang menghindari operasi lambat sepenuhnya.

Komputasi Berkinerja Tinggi

  • Di luar domain game, orang-orang dalam komputasi ilmiah sering kali mengoptimalkan hal-hal yang tidak penting agar dapat berjalan cepat di perangkat keras terbaru. Anggap ini sebagai permainan di mana Anda tidak bisa menipu pada fisika.

    Contoh terbaru yang bagus dari ini adalah Kromodinamika Kuantum Kisi (Lattice QCD) . Makalah ini menjelaskan bagaimana masalah cukup banyak bermuara pada satu kernel komputasi yang sangat kecil, yang dioptimalkan berat untuk PowerPC 440 ini pada IBM Blue Gene / L . Setiap 440 memiliki dua FPU, dan mereka mendukung beberapa operasi terner khusus yang sulit dieksploitasi oleh kompiler. Tanpa pengoptimalan ini, QCD Lattice akan berjalan jauh lebih lambat, yang mahal bila masalah Anda memerlukan jutaan jam CPU pada mesin yang mahal.

    Jika Anda bertanya-tanya mengapa ini penting, lihat artikel di Science yang keluar dari pekerjaan ini. Menggunakan Lattice QCD, orang-orang ini menghitung massa proton dari prinsip pertama, dan tahun lalu menunjukkan bahwa 90% massa berasal dari energi pengikat gaya kuat, dan sisanya dari quark. Itu E = mc 2 beraksi. Berikut ringkasannya .

Untuk semua hal di atas, aplikasi tidak dirancang atau ditulis 100% dalam perakitan - bahkan tidak mendekati. Tetapi ketika orang benar-benar membutuhkan kecepatan, mereka fokus pada penulisan bagian penting dari kode mereka untuk digunakan pada perangkat keras tertentu.

Todd Gamblin
sumber
12
respon yang luar biasa. Berharap kita bisa memasukkan ini ke wiki!
bdd
6
@ Kertas ... Anda bisa. Pertanyaan dan jawaban di StackOverflow adalah atribusi creative commons berlisensi.
Aaron Maenpaa
Untuk informasi lebih lanjut tentang memahami asm untuk membantu Anda menulis C / C ++ dengan lebih baik, lihat Mengapa kode C ++ ini lebih cepat daripada rakitan tulisan tangan saya untuk menguji dugaan Collatz? . Jawaban saya di sana menunjukkan bahwa membaca compiler asm output dan mengutak-atik sumber dapat membantu ketika compiler tidak memperhatikan pengoptimalan yang berguna. Jadi Anda secara mental (atau sebenarnya) menulis dalam asm, lalu pegang kompiler untuk melakukan apa yang Anda inginkan, tetapi sekarang Anda memiliki portabel C.
Peter Cordes
42

Saya sudah bertahun-tahun tidak membuat kode dalam bahasa assembly, tetapi saya dapat memberikan beberapa alasan yang sering saya lihat:

  • Tidak semua kompiler dapat menggunakan optimasi CPU tertentu dan set instruksi (misalnya, set instruksi baru yang kadang-kadang ditambahkan Intel). Menunggu penulis kompiler untuk mengejar ketinggalan berarti kehilangan keunggulan kompetitif.

  • Lebih mudah untuk mencocokkan kode aktual dengan arsitektur dan pengoptimalan CPU yang diketahui. Misalnya, hal-hal yang Anda ketahui tentang mekanisme pengambilan, caching, dll. Ini seharusnya transparan bagi pengembang, tetapi kenyataannya tidak, itulah sebabnya penulis kompilator dapat mengoptimalkan.

  • Akses tingkat perangkat keras tertentu hanya mungkin / praktis melalui bahasa assembly (misalnya, saat menulis driver perangkat).

  • Penalaran formal terkadang sebenarnya lebih mudah untuk bahasa assembly daripada bahasa tingkat tinggi karena Anda sudah tahu apa tata letak kode yang terakhir atau hampir final.

  • Pemrograman kartu grafis 3D tertentu (sekitar akhir 1990-an) tanpa adanya API seringkali lebih praktis dan efisien dalam bahasa assembly, dan terkadang tidak mungkin dalam bahasa lain. Tapi sekali lagi, ini benar-benar melibatkan game level ahli berdasarkan arsitektur akselerator seperti memindahkan data secara manual masuk dan keluar dalam urutan tertentu.

Saya ragu banyak orang menggunakan bahasa assembly ketika bahasa tingkat yang lebih tinggi akan digunakan, terutama ketika bahasa itu adalah C. Mengoptimalkan kode tujuan umum dalam jumlah besar secara manual tidak praktis.

Uri
sumber
19

Ada satu aspek pemrograman assembler yang belum disebutkan oleh orang lain - perasaan puas yang Anda dapatkan karena mengetahui bahwa setiap byte dalam aplikasi adalah hasil dari usaha Anda sendiri, bukan kompiler. Saya tidak ingin sedetik pun kembali menulis seluruh aplikasi di assembler seperti yang biasa saya lakukan di awal tahun 80-an, tetapi saya terkadang merindukan perasaan itu ...


sumber
3
Heh, itu hasil kerja assembler! Anda biasanya menulis banyak makro di asm.
mmx
5
Bukan hanya kepuasan, tapi apresiasi terhadap presisi. Proses singkat dengan segala sesuatu tentangnya dinyatakan menyenangkan untuk dilihat.
deau
18

Biasanya, perakitan awam lebih lambat dari C (karena pengoptimalan C) tetapi banyak game (saya ingat dengan jelas Doom ) harus memiliki bagian tertentu dari game di Assembly sehingga akan berjalan lancar pada mesin normal.

Inilah contoh yang saya maksud.

Ólafur Waage
sumber
2
+1 Sangat benar. Manusia sangat buruk dalam menulis kode lama.
Akun mati
Perlu diingat bahwa perkakas tersebut tidak selalu tersedia saat assembler ditulis.
Marco van de Voort
16

Saya memulai pemrograman profesional dalam bahasa assembly di pekerjaan pertama saya (80-an). Untuk sistem tertanam, kebutuhan memori - RAM dan EPROM - rendah. Anda bisa menulis kode ketat yang mudah di resource.

Pada akhir 80-an saya telah beralih ke C. Kode ini lebih mudah untuk ditulis, di-debug, dan dipelihara. Potongan kode yang sangat kecil ditulis dalam assembler - bagi saya saat itulah saya menulis pengalihan konteks dalam RTOS roll-your-own. (Sesuatu yang seharusnya tidak Anda lakukan lagi kecuali itu adalah "proyek sains".)

Anda akan melihat cuplikan assembler di beberapa kode kernel Linux. Baru-baru ini saya menjelajahinya di spinlocks dan kode sinkronisasi lainnya. Potongan kode ini perlu mendapatkan akses ke operasi uji-dan-set atom, memanipulasi cache, dll.

Saya pikir Anda akan kesulitan untuk mengoptimalkan kompiler C modern untuk kebanyakan pemrograman umum.

Saya setuju dengan @altCognito bahwa waktu Anda mungkin lebih baik dihabiskan untuk berpikir lebih keras tentang masalah dan melakukan sesuatu dengan lebih baik. Untuk beberapa alasan programmer sering fokus pada efisiensi mikro dan mengabaikan efisiensi makro. Bahasa assembly untuk meningkatkan kinerja adalah efisiensi mikro. Melangkah mundur untuk melihat sistem yang lebih luas dapat mengekspos masalah makro dalam sistem. Memecahkan masalah makro seringkali dapat menghasilkan peningkatan kinerja yang lebih baik. Setelah masalah makro terpecahkan, ambillah ke tingkat mikro.

Saya kira masalah mikro berada dalam kendali seorang programmer dan dalam domain yang lebih kecil. Mengubah perilaku di tingkat makro membutuhkan komunikasi dengan lebih banyak orang - hal yang dihindari oleh beberapa programmer. Seluruh koboi itu vs masalah tim.

DanM
sumber
10

"Iya". Tapi, pahamilah bahwa sebagian besar manfaat menulis kode di assembler tidak sebanding dengan usahanya. Imbalan yang diterima untuk menuliskannya dalam pertemuan cenderung lebih kecil daripada sekadar berfokus pada berpikir lebih keras tentang masalah dan menghabiskan waktu Anda memikirkan cara yang lebih baik untuk melakukan tugas.

John Carmack dan Michael Abrash yang sebagian besar bertanggung jawab untuk menulis Quake dan semua kode kinerja tinggi yang masuk ke mesin game ID membahas hal ini secara mendetail dalam buku ini .

Saya juga setuju dengan Ólafur Waage bahwa saat ini, penyusun cukup pintar dan sering menggunakan banyak teknik yang memanfaatkan peningkatan arsitektur tersembunyi.

cgp
sumber
9

Hari-hari ini, setidaknya untuk kode sekuensial, kompiler yang layak hampir selalu mengalahkan bahkan programmer bahasa assembly yang sangat berpengalaman. Tetapi untuk kode vektor itu cerita lain. Kompiler yang diterapkan secara luas tidak melakukan pekerjaan yang baik dengan mengeksploitasi kapabilitas vektor-paralel dari unit SSE x86, misalnya. Saya seorang penulis kompiler, dan mengeksploitasi SSE adalah yang teratas dalam daftar alasan saya untuk pergi sendiri daripada mempercayai kompiler.

Norman Ramsey
sumber
Dalam hal ini, saya akan menggunakan kompiler intrinsic.
mmx
Masih tidak sama. Ini seperti kompiler tanpa pengoptimal register
Marco van de Voort
Itu tergantung pada jenis bumbu yang dimiliki programmer asm Anda. Jika Anda telah membaca dan membuka agner.org/optimize untuk mempelajari tentang mikroarsitektur yang Anda atur, sering kali mudah untuk mengalahkan kompiler hanya untuk urutan pendek . Setidaknya separuh waktu saya melihat pengoptimalan kecil yang terlewat saat melihat output compiler untuk fungsi kecil. Di mana kompiler hebat mengoptimalkan basis kode besar dengan propagasi sebaris dan konstan.
Peter Cordes
8

Kode SSE bekerja lebih baik dalam perakitan daripada kompiler intrinsik, setidaknya di MSVC. (yaitu tidak membuat salinan data tambahan)

Macke
sumber
Poin yang bagus, Anda memerlukan kompiler yang melakukan pekerjaan yang layak dengan intrinsik. Kompiler Intel dan Gnu lumayan bagus, saya belum tahu apakah yang terbaru dari PGI dan PathScale masih kompetitif, dulu belum.
Jed
6

Saya memiliki tiga atau empat rutinitas assembler (dalam sumber sekitar 20 MB) di sumber saya di tempat kerja. Semuanya SSE (2) , dan terkait dengan operasi pada gambar (cukup besar - pikirkan 2400x2048 dan lebih besar).

Untuk hobi, saya mengerjakan kompiler, dan di sana Anda memiliki lebih banyak assembler. Perpustakaan runtime seringkali penuh dengan mereka, kebanyakan dari mereka berkaitan dengan hal-hal yang menentang rezim prosedural normal (seperti pembantu untuk pengecualian, dll.)

Saya tidak memiliki assembler untuk mikrokontroler saya. Kebanyakan mikrokontroler modern memiliki begitu banyak perangkat keras periferal (penghitung terkontrol interupsi, bahkan seluruh encoder kuadratur dan blok penyusun serial) yang menggunakan assembler untuk mengoptimalkan loop sering tidak diperlukan lagi. Dengan harga flash saat ini, hal yang sama berlaku untuk memori kode. Juga sering ada rentang perangkat yang kompatibel dengan pin, jadi meningkatkan skala jika Anda secara sistematis kehabisan daya cpu atau ruang flash seringkali tidak menjadi masalah.

Kecuali jika Anda benar-benar mengirimkan 100000 perangkat dan programmer assembler memungkinkan untuk benar-benar membuat penghematan besar hanya dengan memasang chip flash dalam kategori yang lebih kecil. Tapi saya tidak termasuk dalam kategori itu.

Banyak orang mengira embedded adalah alasan untuk assembler, tetapi pengontrol mereka memiliki lebih banyak daya CPU daripada mesin tempat Unix dikembangkan. (Microchip datang dengan mikrokontroler 40 dan 60 MIPS dengan harga di bawah USD 10).

Namun banyak orang yang terjebak dengan warisan, karena mengubah arsitektur microchip tidaklah mudah. Juga kode HLL sangat bergantung pada arsitektur (karena menggunakan periferal perangkat keras, register untuk mengontrol I / O, dll). Jadi terkadang ada alasan bagus untuk tetap mempertahankan proyek di assembler (saya beruntung bisa urusan setup pada arsitektur baru dari awal). Namun seringkali orang membohongi diri sendiri bahwa mereka sangat membutuhkan assembler.

Saya masih menyukai jawaban yang diberikan profesor ketika kami bertanya apakah kami dapat menggunakan GOTO (tetapi Anda juga dapat membacanya sebagai ASSEMBLER): "jika menurut Anda ada baiknya menulis esai 3 halaman tentang mengapa Anda memerlukan fitur tersebut, Anda dapat menggunakannya . Silakan kirim esai dengan hasil Anda. "

Saya telah menggunakannya sebagai prinsip panduan untuk fitur tingkat rendah. Jangan terlalu sempit untuk menggunakannya, tapi pastikan Anda memotivasi dengan benar. Bahkan melontarkan satu atau dua penghalang buatan (seperti esai) untuk menghindari penalaran yang berbelit-belit sebagai pembenaran.

Marco van de Voort
sumber
1
Saya suka tes esai; Saya mungkin perlu menggunakan ini lebih sering;)
ad absurdum
5

Beberapa instruksi / flags / control tidak ada di level C.

Misalnya, memeriksa overflow di x86 adalah tanda overflow sederhana. Opsi ini tidak tersedia di C.

Tidak diketahui
sumber
Anda dapat menghitung flag overflow di C dengan operasi bit.
swegi
@swegi: Saya yakin itu lebih lambat secara signifikan.
Brian
seberapa sering itu berguna? dan jika demikian, itu tidak mungkin menjadi satu-satunya alasan untuk jatuh ke assembler.
5

Cacat cenderung berjalan per baris (pernyataan, titik kode, dll.); Meskipun benar bahwa untuk sebagian besar masalah, assembly akan menggunakan lebih banyak baris daripada bahasa tingkat yang lebih tinggi, terkadang ada kasus di mana itu adalah yang terbaik (paling ringkas, baris paling sedikit) memetakan ke masalah yang dihadapi. Sebagian besar kasus ini melibatkan tersangka biasa, seperti driver dan bit-banging di sistem tertanam.

Justin Love
sumber
3

Alasan lain bisa jadi ketika kompiler yang tersedia tidak cukup baik untuk sebuah arsitektur dan jumlah kode yang dibutuhkan dalam program tidak terlalu panjang atau kompleks seperti programmer tersesat di dalamnya. Cobalah memprogram mikrokontroler untuk embedded system, biasanya perakitan akan jauh lebih mudah.

alkar
sumber
3

Di samping hal-hal yang disebutkan lainnya, semua bahasa tingkat tinggi memiliki batasan tertentu. Itulah mengapa beberapa orang memilih untuk memprogram dalam ASM, untuk memiliki kendali penuh atas kode mereka.

Yang lain menikmati executable yang sangat kecil, dalam kisaran 20-60KB, misalnya periksa HiEditor , yang diimplementasikan oleh penulis kontrol HiEdit, kontrol edit yang sangat kuat untuk Windows dengan penyorotan sintaks dan tab hanya dalam ~ 50kb). Dalam koleksi saya, saya memiliki lebih dari 20 kontrol emas dari Excell like ssheets hingga html render.

majkinetor
sumber
3

Saya pikir banyak pengembang game akan terkejut dengan sedikit informasi ini.

Kebanyakan game yang saya tahu menggunakan perakitan sesedikit mungkin. Dalam beberapa kasus tidak ada sama sekali, dan paling buruk, satu atau dua loop atau fungsi.

Kutipan itu terlalu digeneralisasikan, dan sama sekali tidak benar seperti satu dekade lalu.

Tapi hei, fakta belaka seharusnya tidak menghalangi perang peretas sejati yang mendukung perakitan. ;)

jalf
sumber
3

Jika Anda memprogram mikrokontroler 8 bit low end dengan RAM 128 byte dan memori program 4K, Anda tidak memiliki banyak pilihan untuk menggunakan assembly. Terkadang meskipun saat menggunakan mikrokontroler yang lebih kuat Anda memerlukan tindakan tertentu untuk dilakukan pada waktu yang tepat. Bahasa assembly sangat berguna karena Anda dapat menghitung instruksi dan mengukur siklus jam yang digunakan oleh kode Anda.

IanW
sumber
2

Jika Anda ada untuk semua upaya remediasi Y2K, Anda bisa menghasilkan banyak uang jika Anda tahu Assembly. Masih ada banyak kode warisan yang tertulis di dalamnya, dan kode tersebut terkadang membutuhkan pemeliharaan.

DOK
sumber
2

Selain proyek yang sangat kecil pada CPU yang sangat kecil, saya tidak akan pernah memprogram seluruh proyek dalam perakitan. Namun, adalah umum untuk menemukan bahwa kemacetan kinerja dapat diatasi dengan pengkodean tangan strategis dari beberapa loop dalam.

Dalam beberapa kasus, yang benar-benar diperlukan adalah mengganti beberapa konstruksi bahasa dengan instruksi yang tidak dapat diharapkan oleh pengoptimal untuk mengetahui cara menggunakannya. Contoh tipikal adalah dalam aplikasi DSP di mana operasi vektor dan operasi multi-akumulasi sulit ditemukan oleh pengoptimal, tetapi mudah untuk menangani kode.

Misalnya model-model tertentu SH4 berisi matriks 4x4 dan 4 instruksi vektor. Saya melihat peningkatan kinerja yang sangat besar dalam algoritme koreksi warna dengan mengganti operasi C yang setara pada matriks 3x3 dengan instruksi yang sesuai, dengan biaya kecil untuk memperbesar matriks koreksi menjadi 4x4 agar sesuai dengan asumsi perangkat keras. Itu dicapai dengan menulis tidak lebih dari selusin baris perakitan, dan membawa penyesuaian yang cocok dengan tipe data terkait dan penyimpanan ke beberapa tempat di sekitar kode C.

RBerteig
sumber
2

Sepertinya tidak disebutkan, jadi saya pikir saya akan menambahkannya: dalam pengembangan game modern, saya pikir setidaknya beberapa rakitan yang sedang ditulis sama sekali bukan untuk CPU. Ini untuk GPU, dalam bentuk program shader .

Ini mungkin diperlukan untuk berbagai alasan, terkadang hanya karena bahasa bayangan tingkat tinggi apa pun yang digunakan tidak memungkinkan operasi yang tepat untuk diekspresikan dalam jumlah persis instruksi yang diinginkan, agar sesuai dengan beberapa batasan ukuran, kecepatan, atau kombinasi apa pun . Seperti biasa dengan pemrograman bahasa assembly, saya rasa.

beristirahat
sumber
2

Hampir setiap mesin atau pustaka gim menengah hingga besar yang pernah saya lihat hingga saat ini memiliki beberapa versi rakitan yang dioptimalkan secara manual yang tersedia untuk operasi matriks seperti penggabungan matriks 4x4. Tampaknya kompiler pasti melewatkan beberapa pengoptimalan pintar (menggunakan kembali register, membuka gulungan loop dengan cara yang sangat efisien, memanfaatkan instruksi khusus mesin, dll) saat bekerja dengan matriks besar. Fungsi manipulasi matriks ini hampir selalu menjadi "hotspot" di profil juga.

Saya juga melihat perakitan kode tangan banyak digunakan untuk pengiriman khusus - hal-hal seperti FastDelegate, tetapi khusus untuk kompiler dan mesin.

Akhirnya, jika Anda memiliki Rutinitas Layanan Interupsi, asm dapat membuat semua perbedaan di dunia - ada operasi tertentu yang tidak Anda inginkan terjadi di bawah interupsi, dan Anda ingin penangan interupsi Anda "masuk dan keluar dengan cepat". .. Anda tahu hampir persis apa yang akan terjadi di ISR ​​Anda jika di ASMA, dan ini mendorong Anda untuk menjaga hal-hal berdarah singkat (yang merupakan praktik yang baik).

leander
sumber
2

Game sangat haus kinerja dan meskipun sementara itu pengoptimalannya cukup bagus, seorang "pemrogram master" masih dapat memeras lebih banyak kinerja dengan mengkodekan bagian yang tepat dalam perakitan.

Jangan pernah mulai mengoptimalkan program Anda tanpa membuat profil terlebih dahulu. Setelah membuat profil harus dapat mengidentifikasi kemacetan dan jika menemukan algoritma yang lebih baik dan sejenisnya jangan memotongnya lagi, Anda dapat mencoba memberikan kode beberapa hal dalam perakitan.

robert.berger
sumber
2

Saya hanya berbicara secara pribadi dengan satu pengembang tentang penggunaan perakitannya. Dia sedang mengerjakan firmware yang menangani kontrol untuk pemutar mp3 portabel. Melakukan pekerjaan dalam perakitan memiliki 2 tujuan:

  1. Kecepatan: penundaan harus diminimalkan.
  2. Biaya: dengan kode yang minimal, perangkat keras yang dibutuhkan untuk menjalankannya bisa jadi sedikit kurang kuat. Ketika memproduksi jutaan unit secara massal, ini bisa bertambah.
Paul Williams
sumber
2

Satu-satunya pengkodean assembler yang terus saya lakukan adalah untuk perangkat keras tertanam dengan sumber daya yang sedikit. Seperti yang disebutkan oleh leander, perakitan masih sesuai dengan ISR di mana kodenya harus cepat dan dipahami dengan baik.

Alasan kedua bagi saya adalah untuk menjaga agar pengetahuan saya tentang perakitan berfungsi. Mampu memeriksa dan memahami langkah-langkah yang diambil CPU untuk melakukan penawaran saya terasa menyenangkan.

ParoXoN
sumber
2

Terakhir kali saya menulis di assembler adalah ketika saya tidak dapat meyakinkan compiler untuk menghasilkan kode bebas posisi bebas libc.

Lain kali mungkin karena alasan yang sama.

Tentu saja, saya dulu punya alasan lain .

Joshua
sumber
2

Banyak orang suka merendahkan bahasa assembly karena mereka tidak pernah belajar membuat kode dengannya dan hanya secara samar-samar menemukannya dan itu membuat mereka terperanjat atau agak terintimidasi. Pemrogram berbakat sejati akan memahami bahwa tidak masuk akal untuk menampar C atau Assembly karena mereka gratis. sebenarnya keuntungan yang satu adalah kerugian yang lainnya. Aturan sintaksis yang terorganisir dari C meningkatkan kejelasan tetapi pada saat yang sama melepaskan semua rakitan daya dari kebebasan dari aturan struktural apa pun! Instruksi kode C dibuat untuk membuat kode non-pemblokiran yang dapat dikatakan memaksa kejelasan maksud pemrograman tetapi ini adalah kehilangan daya. Dalam C kompilator tidak akan mengizinkan lompatan ke dalam if / elseif / else / end. Atau Anda tidak diizinkan untuk menulis dua loop for / end pada variabel berbeda yang saling tumpang tindih, Anda tidak dapat menulis kode yang mengubah diri sendiri (atau tidak dapat dengan cara yang mudah dan mulus), dll. programmer konvensional dibuat ketakutan oleh hal-hal di atas, dan tidak akan tahu bagaimana menggunakan kekuatan pendekatan ini karena mereka telah dibesarkan untuk mengikuti aturan konvensional . Inilah kebenarannya: Saat ini kita memiliki mesin dengan kekuatan komputasi untuk melakukan lebih banyak dari aplikasi yang kita gunakan, tetapi otak manusia terlalu tidak mampu untuk mengkodekannya dalam lingkungan pengkodean bebas aturan (= perakitan) dan membutuhkan aturan yang sangat ketat mengurangi spektrum dan menyederhanakan pengkodean. Saya sendiri menulis kode yang tidak dapat ditulis dalam kode C tanpa menjadi sangat tidak efisien karena batasan yang disebutkan di atas. Dan saya belum berbicara tentang kecepatan yang menurut kebanyakan orang adalah alasan utama untuk menulis di majelis, baik itu jika pikiran Anda terbatas pada berpikir di C maka Anda adalah budak Anda compiler selamanya. Saya selalu berpikir master pemain catur akan menjadi pemrogram perakitan yang ideal sementara programmer C hanya memainkan "Dames".

Eric W.
sumber
1
self-modifying code tidak berguna untuk kinerja pada kebanyakan CPU modern, di luar skenario JIT-once / run-many. Tetapi mengisi konstanta dengan segera adalah kemungkinan yang menyenangkan. C gotomemungkinkan lompatan tidak terstruktur dalam suatu fungsi. Termasuk ke dalam blok di dalam if()atau loop dalam fungsi yang sama. mis . godbolt.org/z/IINHTg . Lihat juga Duff's Device, menggunakan switch / case menjadi do{}while()loop untuk mengekspresikan lompatan ke loop yang tidak digulung. Tetapi pada titik tertentu, akan menjadi lebih jelas untuk menulis seolah-olah Anda semakin turun ke tingkat kekacauan itu.
Peter Cordes
1
(Tentu saja, Perangkat Duff hanya berguna pada mesin dengan pengalamatan pasca-kenaikan, jika tidak, titik masuk di dalam loop yang tidak digulung akan mengalahkan sebagian besar tujuan pengoptimalan.)
Peter Cordes
1

Bukan lagi kecepatan, tapi Kontrol . Kecepatan terkadang datang dari kendali, tetapi itu adalah satu - satunya alasan untuk membuat kode dalam perakitan. Setiap alasan lain bermuara pada kontrol (mis. SSE dan optimisasi sisi lain, driver perangkat dan kode yang bergantung pada perangkat, dll.).

Kelden Cowan
sumber
1

Jika saya mampu mengungguli GCC dan Visual C ++ 2008 (dikenal juga sebagai Visual C ++ 9.0) maka orang akan tertarik untuk mewawancarai saya tentang bagaimana hal itu mungkin.

Inilah sebabnya mengapa untuk saat ini saya hanya membaca hal-hal di assembly dan hanya menulis __asm ​​int 3 bila diperlukan.

Saya harap ini membantu ...

Mandrake
sumber
1

Saya tidak menulis di assembly selama beberapa tahun, tetapi dua alasan saya dulu adalah:

  • Tantangannya! Saya melewati periode beberapa bulan bertahun-tahun yang lalu ketika saya menulis semuanya di perakitan x86 (zaman DOS dan Windows 3.1). Ini pada dasarnya mengajari saya sebagian besar operasi tingkat rendah, perangkat keras I / O , dll.
  • Untuk beberapa hal ukurannya tetap kecil (lagi-lagi DOS dan Windows 3.1 saat menulis TSR )

Saya terus melihat perakitan kode lagi, dan itu tidak lebih dari tantangan dan kesenangan dari hal itu. Saya tidak punya alasan lain untuk melakukannya :-)

Chris J.
sumber
1

Saya pernah mengambil alih proyek DSP yang sebagian besar ditulis oleh programmer sebelumnya dalam kode assembly, kecuali untuk logika deteksi nada yang ditulis dalam C, menggunakan floating-point (pada DSP titik tetap!). Logika deteksi nada berjalan sekitar 1/20 waktu nyata.

Saya akhirnya menulis ulang hampir semuanya dari awal. Hampir semuanya ada di C kecuali untuk beberapa penangan interupsi kecil dan beberapa lusin baris kode yang terkait dengan penanganan interupsi dan deteksi frekuensi tingkat rendah, yang berjalan lebih dari 100x secepat kode lama.

Hal penting yang perlu diingat, menurut saya, adalah bahwa dalam banyak kasus, akan ada peluang yang jauh lebih besar untuk peningkatan kecepatan dengan rutinitas kecil daripada rutinitas besar, terutama jika assembler yang ditulis tangan dapat memasukkan semuanya dalam register tetapi kompiler tidak mau. cukup mengatur. Jika sebuah loop cukup besar sehingga tidak dapat menyimpan semuanya dalam register, peluang untuk perbaikan jauh lebih kecil.

supercat
sumber
0

VM Dalvik yang menafsirkan bytecode untuk aplikasi Java di ponsel Android menggunakan assembler untuk dispatcher. Film ini (sekitar 31 menit, tetapi layak menonton seluruh film!) Menjelaskan caranya

"masih ada kasus di mana manusia bisa melakukan lebih baik daripada kompiler".

Akan
sumber
0

Saya tidak, tapi saya telah membuat titik untuk setidaknya mencoba, dan berusaha keras di beberapa titik di masa depan (semoga segera). Tidaklah buruk untuk mengetahui lebih banyak tentang hal-hal tingkat rendah dan bagaimana hal-hal bekerja di balik layar ketika saya memprogram dalam bahasa tingkat tinggi. Sayangnya waktu sulit didapat dengan pekerjaan penuh waktu sebagai pengembang / konsultan dan orang tua. Tapi saya akan menyerah pada waktunya, itu sudah pasti.

Henric
sumber