Cách xem code dưới dạng Assembly
Khi bạn đã quyết định bước trên con đường bảo mật, không sớm thì muộn các bạn cũng phải tiếp xúc với Assembly. Mình biết đây là một ngôn ngữ rất khó hiểu, kể cả đối với những bạn đọc hiểu chuỗi nhị phân. Vậy nên, trong bài viết này, mình sẽ giới thiệu cho các bạn trang web Compiler Explorer, giúp bạn xem code dưới dạng Assembly. Đặc biệt là trang web này có thể xem từng dòng và highlight cho bạn biết luôn nhé.
Compiler Explorer là gì?
Compiler Explorer là một trang web mã nguồn mở và miễn phí cho phép bạn viết, biên dịch và phân tích mã nguồn sang code Assembly, tất cả đều gói gọn trong một tab trình duyệt. Bạn có thể dán bất kỳ đoạn code C hoặc C++ nào (hoặc một trong 30 ngôn ngữ được hỗ trợ khác), chọn một trình biên dịch (compiler), chạy chương trình và xem code Assembly tương ứng với từng dòng code. Bạn cũng có thể chọn rất nhiều trình biên dịch khác nhau cho từng ngôn ngữ bạn muốn.
Tại đây, bạn có thể xem các cảnh báo, lỗi và code Assembly do trình biên dịch tạo ra, cũng như xem kết quả của chương trình.
Còn những ngôn ngữ thông dịch như Python thì sao? Mã nguồn Python có thể được biên dịch thành code byte để chạy trên Máy ảo Python .
Bạn có thể xem một hàm C++ được biên dịch thành code Assembly x86-64 trong ảnh dưới đây.
Còn đây là code Python được biên dịch thành mã byte Python.
Một trong những tính năng mình thích nhất ở trang web này là nó có thể tạo link truy cập đến code hiện tại của bạn. Ví dụ như khi truy cập link này, bạn vẫn sẽ thấy những dòng lệnh mà mình code, mã Assembly, và kết quả của chương trình. Bạn có thể sử dụng tính năng này để chia sẻ đoạn code bạn muốn đến bạn bè của mình.
Tại sao bạn nên sử dụng Compiler Explorer
Bạn có thể xem mã nguồn của bạn được biên dịch thành gì. Mặc dù bất kỳ trình biên dịch nào cũng có thể làm được điều đó, nhưng Compiler Explorer sẽ cho bạn biết chính xác từng dòng code của mình được chuyển sang code Assembly như thế nào.
Một trong những ứng dụng chính của Compiler Explorer là nghiên cứu cách tối ưu hóa hiệu suất ở cấp độ thấp. Khi biết cách máy tính của bạn thực thi từng dòng code, bạn có thể phân tích cách những dòng code đó ảnh hưởng đến tốc độ thực thi.
So sánh các trình biên dịch và kiến trúc
Bạn có thể phân tích những cách tối ưu hóa khác nhau bằng cách xem trình biên dịch ảnh hưởng như thế nào đối với file nhị phân được tạo. Ảnh bên dưới hiển thị một hàm C++ được biên dịch không sử dụng tối ưu hóa (-O0
).
Ảnh dưới cũng sử dụng hàm C++ như trên, nhưng nó được biên dịch bằng sử dụng tối ưu hoá -O3
.
Như bạn có thể thấy, trình biên dịch gcc
sẽ tạo ra một file nhị phân khác. Bạn cũng có thể chọn kiến trúc hệ thống khác. Như hình dưới thì mình chọn kiến trúc ARMv7-a.
Compiler Explorer cực kỳ linh hoạt và tiện lợi vì nó cho phép bạn thực hiện nhiều việc liên quan đến compiler trong một tab trình duyệt duy nhất.
Compiler Explorer đã giúp mình rất nhiều trong việc tự nghiên cứu Assembly và hiểu cách trình biên dịch hoạt động như thế nào. Mình nghĩ trang web này cũng dành cho những bạn nào đang nghiên cứu tối ưu hoá code nữa đấy.