Buku teks ini memberikan pengenalan lembut tentang pemrograman bahasa assembly. Apa yang membuat pendahuluan ini "lembut" adalah karena mengasumsikan pembaca sudah terbiasa dengan pengkodean C atau C++. Kami menggunakan pengetahuan yang diasumsikan ini untuk menjembatani mundur menuju ISA (Instruction Set Architecture) tingkat rendah.
Kami menyampaikan poin yang sangat tajam:
Bahasa assembly bukanlah hal yang perlu ditakuti!Seperti disebutkan, jika Anda sudah familiar dengan C (atau bahasa turunan dari C seperti C++), buku ini dimulai dengan apa yang sudah Anda ketahui.
Bab-bab selanjutnya menyelami lebih dalam sudut-sudut dan ceruk ISA ARM V8 dan cocok bagi mereka yang ingin menguasai kumpulan instruksi yang kaya dari prosesor ARM 64 bit.
Ya, tentu saja.
Pemrograman bahasa rakitan sangat bergantung pada arsitektur perangkat keras yang mendasarinya. Lingkungan operasi host memainkan peran yang sangat besar dalam menentukan bagaimana program bahasa assembly dibangun. Sebuah "konvensi pemanggilan" mengacu pada bagaimana fungsi dipanggil dan bagaimana parameter diteruskan.
Awalnya, buku ini hanya mengajarkan konvensi ARM LINUX. Namun, seiring berjalannya waktu, kami mengembangkan serangkaian makro yang mempermudah penulisan kode untuk digunakan di MacOS atau LINUX.
Tautan ini akan mengarah ke salinan terkini serta dokumentasinya. Makro yang membuat pemrograman lebih mudah juga disertakan.
Bab ini memberikan beberapa informasi tambahan tentang pemrograman bahasa rakitan Apple Silicon.
Anda akan melihat bahwa kami menggunakan C-runtime secara langsung daripada melakukan panggilan sistem OS. Jadi, misalnya jika kita ingin memanggil write()
, kita memanggil write
dari bahasa assembly.
Versi write
panggilan sistem ini adalah fungsi pembungkus yang dibangun ke dalam C-runtime (CRT) yang menangani detail tingkat rendah dalam melakukan panggilan sistem. Lihat di sini tentang apa yang sebenarnya terjadi di dalam fungsi pembungkus ini.
Manfaat menggunakan pembungkus CRT adalah terdapat perbedaan antara distribusi dan arsitektur yang ditutupi dengan menggunakan pembungkus CRT. Oleh karena itu, bila Anda menggunakan wrapper daripada metode langsung melakukan panggilan sistem, kode Anda akan lebih portabel.
Meskipun desain ARM patut dipuji, konvensi penamaan ARM untuk Kekayaan Intelektualnya sangat buruk. Dalam buku ini, AARCH64 dan ARM V8 dianggap sinonim untuk Arsitektur Set Instruksi ARM (ISA) 64 bit.
Sangat sulit untuk menemukan dokumentasi di situs ARM karena mereka memiliki begitu banyak versi , begitu banyak nama untuk hal yang sama, dan begitu banyak dokumentasi secara umum. Ini benar-benar menjengkelkan.
Di dalam teks kami akan memberikan tautan yang erat sebagaimana mestinya.
Berikut ini link ke halaman set instruksi utama "a".
Mendapatkan alat untuk pengembangan bahasa assembly cukup mudah - mungkin Anda sudah memilikinya. Menggunakan apt
dari terminal Linux, ucapkan:
sudo apt update
sudo apt install build-essential gdb
Pada tipe Macintosh:
xcode-select --install
ke terminal dan ikuti petunjuk. Perhatikan bahwa gdb
digantikan oleh lldb
dengan perbedaan yang cukup untuk membuat Anda menangis.
Maka Anda memerlukan editor favorit Anda. Kami sendiri menggunakan vi
untuk pengeditan cepat dan Kode Visual Studio untuk pekerjaan berat apa pun.
Kami menggunakan gcc
, "kompiler" C. g++
juga bisa digunakan. Di Mac, clang
juga bisa digunakan.
Apa gunanya... menggunakan "kompiler" untuk "mengkompilasi" bahasa assembly?
Nah, untuk menjawabnya kita harus memahami bahwa kata "kompiler" hanya merujuk pada satu langkah dalam urutan pembangunan. Apa yang kita bicarakan sebagai "kompiler" sebenarnya adalah sebuah payung yang mencakup:
Praprosesor yang bertindak pada #
perintah praprosesor apa pun seperti #include
. Perintah-perintah ini bukan bagian dari C atau C++. Sebaliknya itu adalah perintah untuk praprosesor.
Perhatikan bahwa gcc
akan memanggil praprosesor C jika file bahasa assembly Anda diakhiri dengan .S
- kapital S. Ini mungkin dipanggil atau tidak jika file Anda diakhiri dengan huruf kecil s atau ekstensi file lainnya tergantung pada sistem Anda.
Kompiler sebenarnya , yang tugasnya mengubah bahasa tingkat tinggi seperti C dan C++ menjadi bahasa assembly.
Assembler, yang mengubah bahasa assembly menjadi kode mesin yang belum siap untuk dieksekusi.
Dan terakhir, linker, yang berpotensi menggabungkan banyak file kode mesin perantara (disebut file objek), berpotensi banyak file perpustakaan (tertaut secara statis .dlls di Windows dan file .a di Linux). Linker adalah langkah terakhir dalam rantai ini.
Berikut adalah video yang menjelaskan proses ini.
Kami menggunakan gcc dan g++ secara langsung karena, sebagai payung, keduanya mengotomatiskan langkah-langkah di atas dan secara otomatis terhubung dengan CRT.
Misalkan Anda telah mengimplementasikan main()
dalam file C (main.c) dan ingin menggunakan file bahasa assembly yang telah Anda tulis (asm.S). Hal ini dapat dilakukan dengan beberapa cara.
gcc main.c asm.S
Hanya itu yang Anda perlukan untuk bangunan minimal. Program yang dihasilkan akan ditulis ke a.out
. Semua file perantara yang dihasilkan akan dihapus.
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
Digunakan dengan cara ini, file .o
tertinggal di disk. Menggunakan metode sebelumnya, file .o
dihapus tanpa Anda melihatnya.
Misalkan main()
diimplementasikan dalam bahasa assembly dan main.s
mandiri, maka cukup:
gcc main.S
Seringkali, Anda ingin mengaktifkan debugger gdb
atau lldb
. Lakukan ini:
gcc -g main.S
Tanpa opsi baris perintah -g
, debugger Anda mungkin tidak beroperasi dengan benar.
Sekali lagi, jika Anda ingin gcc
menjalankan kode Anda melalui pra-prosesor C (untuk menyerahkan #include
misalnya), beri nama file kode sumber bahasa assembly Anda dengan huruf kapital S. Jadi, di Linux:
gcc main.s
Tidak akan melalui pra-prosesor C tapi
gcc main.S
akan.
Untuk menunjukkan bahwa "kompiler" adalah sebuah payung, menggunakan gcc untuk "mengkompilasi" sebuah program menyebabkan hal berikut ini dipanggil di Ubuntu yang berjalan di ARM:
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
adalah praprosesor C - ini adalah alat umum yang dapat digunakan oleh bahasa lain juga (C++, misalnya).
cc1
adalah kompiler sebenarnya.
as
halnya assembler.
ld
adalah penghubungnya.
Anda dapat melihat mengapa kami menggunakan perintah payung secara default di buku ini.
Kami mulai dengan menyediakan apa yang kami sebut "menjembatani" dari C dan C++ ke bahasa assembly. Kami menggunakan pengetahuan yang sudah Anda miliki untuk mempelajari pengetahuan baru - betapa kerennya itu!
Bab | Penurunan harga | |
---|---|---|
0 | permulaan | Link |
1 | Halo Dunia | Link |
2 | Jika Pernyataan | Link |
3 | loop | |
3a | Sementara Loop | Link |
3b | Untuk Loop | Link |
3c | Penerapan Lanjutkan | Link |
3d | Melaksanakan Istirahat | Link |
4 | Selingan | |
4a | Register | Link |
4b | Muat dan Simpan | Link |
4c | Lebih Lanjut Tentang ldr | Link |
4d | Ukuran Daftar | Link |
4e | Heksadesimal | Link |
5 | switch | Link |
6 | Fungsi | |
6a | Menelepon dan Kembali | Link |
6b | Parameter Lulus | Link |
6c | Contoh pemanggilan beberapa fungsi runtime C yang umum | Link |
7 | FizzBuzz - Program Lengkap | Link |
8 | Struktur | |
8a | Penyelarasan | Link |
8b | Mendefinisikan | Link |
8c | Menggunakan | Link |
8d | Apa ini" | Link |
9 | const | Link |
Operasi floating point menggunakan instruksinya sendiri dan rangkaian registernya sendiri. Oleh karena itu, operasi floating point dibahas di bagiannya sendiri:
Bab | Penurunan harga | |
---|---|---|
0 | Ikhtisar Bab | Link |
1 | Apa Itu Angka Floating Point? | Link |
2 | Register | Link |
3 | Pemotongan dan Pembulatan | Link |
4 | harfiah | Link |
5 | fmov | Link |
6 | Mengapung Setengah Presisi | Link |
7 | NEON SIMD Belum Ditulis | Link |
Apa jadinya buku tentang bahasa assembly tanpa sedikit pun bashing?
Bab | Penurunan harga | |
---|---|---|
1 | Bidang Bit | |
1a | Tanpa Bidang Bit | Link |
1b | Dengan Bidang Bit | Link |
1c | Tinjauan Instruksi yang Baru Dijelaskan | Link |
2 | Endianisme | Link |
Di bagian ini, kami menyajikan berbagai materi termasuk "ceramah terkenal di dunia" tentang debugging. Kuliah ini telah diundang di beberapa perguruan tinggi dan universitas. Hal ini ditujukan untuk audiens yang bekerja dengan bahasa seperti C, C++ dan bahasa assembly tetapi beberapa pelajaran yang terkandung di dalamnya dapat diterapkan untuk semua bahasa.
Bab | Penurunan harga | |
---|---|---|
1 | Silikon Apel | Link |
2 | Konvergensi Apple/Linux | Link |
3 | Fungsi Variadik | Link |
4 | Di balik terpal: Panggilan Sistem | Link |
5 | Menentukan panjang literal string untuk fungsi C | Link |
6 | Memanggil Bahasa Majelis Dari Python | Link |
7 | Operasi Atom | Link |
8 | Lompat Tabel | Link |
9 | argv | KODE ASM |
10 | kunci putar | Link |
- | Kuliah Debug | PPTX |
Seperti yang ditunjukkan tepat di atas, rangkaian makro dapat ditemukan di sini.
Berikut adalah beberapa spesifikasi proyek untuk menawarkan tantangan bagi penguasaan Anda yang semakin meningkat. Berikut adalah uraian singkat yang disajikan dalam urutan abjad.
Mungkin sebelum Anda mengatasinya, lihat program FIZZBUZZ yang dijelaskan secara lengkap terlebih dahulu.
Kemudian cobalah ini sebagai proyek pertama Anda. Dengan beberapa baris kosong dan komentar, bobotnya mencapai 35 baris.
Proyek DIRENT mendemonstrasikan bagaimana struct
yang kompleks dapat digunakan dalam bahasa assembly.
Proyek PI mendemonstrasikan instruksi floating point. Program ini akan "melempar anak panah ke sasaran", menghitung perkiraan PI dengan melacak berapa banyak anak panah yang "mencapai target" versus jumlah total anak panah yang "dilempar".
Proyek SINE menekankan matematika dan fungsi floating point.
Proyek SNOW menggunakan teknologi era tahun 1970-an untuk menganimasikan sistem partikel sederhana. Proyek ini menunjukkan proses desain yang masuk akal untuk memecah masalah kompleks menjadi bagian-bagian yang lebih sederhana.
WALKIES menyajikan animasi kecil lucu yang menunjukkan perulangan dengan beberapa dereferensi penunjuk.
Karier Perry Kivolowitz di bidang Ilmu Komputer berlangsung kurang dari lima dekade. Ia meluncurkan lebih dari 5 perusahaan, sebagian besar berkaitan dengan perangkat keras, pemrosesan gambar, dan efek visual (untuk film dan televisi). Perry menerima pengakuan Emmy atas karyanya di The Gathering, episode percontohan Babylon 5. Kemudian dia menerima Penghargaan Emmy untuk Teknik bersama rekan-rekannya di SilhouetteFX, LLC. SilhouetteFX digunakan di hampir setiap film penting untuk rotoskopi, pengecatan, pelacakan, rekonstruksi 2D ke 3D, pengomposisian, dan banyak lagi.
Pada tahun 1996 Perry menerima Academy Award untuk Prestasi Ilmiah dan Teknis atas penemuannya tentang Shape Driven Warping dan Morphing. Ini adalah teknik yang bertanggung jawab atas banyak efek terkenal di Forrest Gump, Titanic, dan Stargate.
Dua puluh dua puluh tiga tahun menandai tahun ke-19 Perry mengajar Ilmu Komputer di tingkat perguruan tinggi, sepuluh tahun di UW Madison dan sekarang berusia 8+ tahun di Carthage College.
Bahasa Majelis adalah minat Perry karena pernah bekerja di ISA berikut (dalam urutan kronologis):
Univac 1100
Perusahaan Peralatan Digital PDP-11
Perusahaan Peralatan Digital VAX-11
Motorola 68000
ARM dimulai dengan AARCH64
Karya ini didedikasikan untuk istri saya Sara dan putra saya Ian dan Evan.
Perry telah membuat perpustakaan berisi sekitar 200 proyek pemrograman yang cocok untuk kelas CS 1, CS 2, Struktur Data, Jaringan, Sistem Operasi, dan Organisasi Komputer. Jika penerbit buku teks CS (atau konten terkait CS lainnya) tertarik untuk membeli perpustakaan tersebut, silakan hubungi kami.
Lihat juga Get Off My L@wn, novel Zombie untuk para pembuat kode.
Anda membacanya dengan benar... programmer elit Doug Handsman pensiun ke kampung halaman istrinya, Ruth Ann, di Wisconsin utara. Dan kemudian, kiamat terjadi. Gelandangan.
Dinilai 4,3 dari 5 dengan lebih dari 70 ulasan, ini adalah bacaan yang menyenangkan dan tidak memerlukan biaya apa pun.