Ngoài việc học lắp ráp, tôi tin rằng việc học một ngôn ngữ cấp thấp như C được biên dịch là rất có giá trị. Vì vậy, câu trả lời của tôi là có, nhưng một lần nữa tôi có lẽ thiên vị vì tôi thích lập trình cấp thấp.
Ví dụ, chỉ cần hiểu làm thế nào các câu lệnh đơn giản được biên dịch. Các chức năng sau đây,
int func(int val)
{
int num = val * 5;
return num;
}
... trở thành (ít nhất là một chút thú vị):
movl %edi, -20(%rbp)
movl -20(%rbp), %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
Mã này lấy đối số từ ngăn xếp (val, tham số thành func), dịch chuyển nó sang trái 2 vị trí (nhân với 2 ^ 2 hoặc 4) và sau đó thêm giá trị ban đầu vào kết quả. Kết quả cuối cùng là một phép nhân với 5. Một ví dụ như thế này minh họa một số điều cần chú ý, chẳng hạn như tối ưu hóa trình biên dịch. Thay vì gọi một lệnh để nhân trực tiếp lên 5, nó sẽ dịch chuyển hai vị trí để nhân với 4 và sau đó thêm giá trị ban đầu. Tôi tìm thấy những ví dụ như thế này để cải thiện đáng kể sự hiểu biết của tôi về mọi thứ ở cấp độ thấp hơn.
Tạo đầu ra của trình biên dịch chương trình từ gcc với -S
tùy chọn. Tuy nhiên, lưu ý rằng kết quả sẽ thay đổi theo trình biên dịch và mức tối ưu hóa.
Dù sao, tôi không nghĩ trở thành một lập trình viên ngôn ngữ lắp ráp cũng giống như hiểu về lắp ráp . Một lần nữa, tôi cảm thấy rằng lập trình bằng một ngôn ngữ như C và biết cách đưa nó vào mã máy là một thực hành có giá trị.