Selain belajar perakitan, saya percaya bahwa mempelajari bagaimana bahasa tingkat rendah seperti C dikompilasi sangat berharga. Jadi jawaban saya adalah ya, tapi sekali lagi saya mungkin bias karena saya menikmati pemrograman tingkat rendah.
Misalnya, hanya memahami bagaimana pernyataan sederhana dikompilasi. Fungsi berikut,
int func(int val)
{
int num = val * 5;
return num;
}
... menjadi (setidaknya bit yang menarik):
movl %edi, -20(%rbp)
movl -20(%rbp), %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
Kode ini mengambil argumen dari stack (val, parameter to func), menggesernya ke kiri 2 tempat (dikalikan dengan 2 ^ 2 atau 4) dan kemudian menambahkan nilai asli ke hasilnya. Hasil akhirnya adalah perkalian dengan 5. Contoh seperti ini menggambarkan sejumlah hal yang harus diperhatikan, seperti optimisasi kompiler. Alih-alih memanggil instruksi untuk secara langsung mengalikan dengan 5, itu menggeser dua tempat untuk mengalikan dengan 4 dan kemudian menambahkan nilai asli. Saya menemukan contoh seperti ini untuk sangat meningkatkan pemahaman saya tentang hal-hal di tingkat yang lebih rendah.
Hasilkan output assembler dari gcc dengan -S
opsi. Namun, perlu diketahui bahwa hasilnya akan bervariasi berdasarkan kompiler dan tingkat optimisasi.
Bagaimanapun, saya tidak berpikir menjadi programmer bahasa assembly sama dengan memahami assembly . Sekali lagi, saya merasa pemrograman dalam bahasa seperti C dan mengetahui bagaimana hal itu dimasukkan ke dalam kode mesin adalah praktik yang berharga.