Assembly Language là gì ? Khó khăn gì trong quá trình học ASM

Nếu đã tìm hiểu qua về lập trình thì rất có thể bạn đã nghe qua về thuật ngữ Assembly Language (ASM), tuy nhiên, không phải ai cũng thật sự hiểu nó là gì cũng như mục đích học loại ngôn ngữ ấy. Vậy Assembly Language là gì ? Khó khăn gì trong quá trình học ASM

Assembly Language là gì ? Khó khăn gì trong quá trình học ASM

Trong bài viết dưới đây, chúng ta sẽ cùng nhau tìm hiểu về Assembly và những khó khăn, thử thách mắc phải trong quá trình tiếp cận với nó.

Assembly Language là gì ?

Assembly Language (còn được biết đến với cái tên viết tắt là ASM) là ngôn ngữ bậc thấp, hay nói một cách chính xác hơn, nó là ngôn ngữ thuộc thế hệ thứ 2 (2nd generation). ASM sử dụng các từ gợi nhớ (mnemonics) để viết các chỉ thị (instructions) lập trình cho máy tính thay vì bằng những dãy 0 và 1 như những loại ngôn ngữ lập trình trước đây.

Các ASM sẽ cần một chương trình Assemble phù hợp (NASM, AS, DASM) để dịch chúng thành những file binary và một trình linker để link các thành phần lại và chỉ định nơi bắt đầu của chương trình và đây là việc bắt buộc. Ví dụ như: Hàm main trong C mặc định là nơi chương trình khởi chạy. Lệnh dịch source C ra binary trên thực tế nó đã làm 2 bước trên: dịch và link (xác định luôn nơi khởi chạy chương trình là main).

Assembly Language là gì ?

Chương trình viết trực tiếp bằng ASM là có tốc độ thực thi cao và tiêu tốn bộ nhớ ít hơn các chươnỉnhình viết bởi các ngôn ngữ lập trình bậc cao, đó cũng chính là lý do mà ngày nay, nhiều người đã lựa chọn theo học loại ngôn ngữ lập trình này.

Việc học ASM cũng sẽ giúp chúng ta hiểu thêm về kiến trúc phần cứng máy tính, cách chúng hoạt động và tương tác với nhau. Tiêu biểu như việc thông qua ASM, chúng ta sẽ nắm rõ về các thành phần cơ bản trong máy tính và cách chúng truyền thông tin cho nhau.

ASM có thể tương tác rất sâu dưới hệ thống, chúng có thể giao tiếp trực tiếp với các phần cứng và bắt chúng hoạt động theo ý người lập trình, đó cũng chính là lý do mà chúng ta có hẳn một ngành mang tên là “lập trình nhúng”.

Những khó khăn gặp phải trong quá trình học ASM

Nếu khi học những loại ngôn ngữ lập trình khác, chúng ta chỉ đơn giản là cài đặt môi trường lập trình, công cụ biên dịch và sử dụng các editor hoặc IDE nếu có thể học lập trình, sau đó viết một chương trình đơn giản rồi biên dịch và chạy thử trên các ngôn ngữ bậc cao (C, C++, Java) là rất dễ dàng thì với ASM thì mọi chuyện lại không hề đơn giản như vậy. Một trong những vấn đề khiến người học ASM đau đầu chính là việc bạn sẽ dễ bị “nản” vì không thể dịch và chạy code ASM đúng như hướng dẫn.

Lý do là bởi ASM lập trình các chỉ thị cho phần cứng, tuy nhiên chúng lại lệ thuộc vào kiến trúc CPU (ARM, x86-32, x86-64), hệ điều hành (Linux, Windows, Mac) và các tập chỉ thị mà nhà sản xuất phần cứng đưa ra. Đa số các hướng dẫn, sách vở được viết cho kiến trúc iA-32, ngoài ra còn có một số hướng dẫn mới gần đây hơn thì viết cho kiến trúc x86-64 trên Linux, sử dụng Assemble của GNU. Chính vì thế, sẽ rất khó khăn để bắt đầu học cũng như thành thạo loại ngôn ngữ lập trình này.

Những khó khăn gặp phải trong quá trình học ASM

Khác với ngôn ngữ C, về lý thuyết chúng ta có thể dịch lại mà không cần đổi source code ban đầu. Tuy nhiên thực tế thì điều này khó xảy ra vì chúng ta chỉ có thể làm được điều trên nếu không gọi tới các API của hệ điều hành. Đó cũng chính là lý do mà bạn sẽ cảm thấy yêu Java hơn, bởi Java thật sự là cuộc cách mạng viết một lần, chạy mọi nơi và cũng chẳng cần phải dịch lại. Nói cách khác, mọi thứ đã có máy ảo Java lo.

Thêm một khó khăn nữa cho những người học ASM trên máy Mac đó chính là Apple chỉ định riêng bộ linker (Match-O) cho ASM, đồng nghĩa với việc chúng sử dụng một số chỉ thị riêng, padding memory riêng (có 4 lớp padding). Hơn nữa, việc viết ASM cho máy Mac thật sự có rất ít bài viết hướng dẫn, doc của Apple thì không dễ hiểu một chút nào. Học ASM trên Mac là một thử thách thật sự khó nhằn đối với bất kỳ một ai.

Tại sao cần học ASM?

Nhiều  người thường đặt ra câu hỏi rằng: “ASM khó như vậy thì học để làm gì?”. Câu trả lời đơn giản nằm ở những lợi ích tuyệt vời mà nó mang lại:

  • Có thể dùng debug chương trình mà không cần source code.

  • Có thể dùng để tối ưu hóa chương trình: một số dân code ASM chuyên nghiệp dùng C để code và dịch ra ASM rồi edit lại cho phù hợp với kiến trúc và các chỉ thị riêng và tối ưu của nhà sản xuất chip. Lý do là các compiler chỉ dịch ra ASM chung nhất cho các dòng chip.

Những đối tượng nên học ASM

  • Những người cần lập trình phần cứng, mạch điện tử, các chip vi xử lý.

  • Những người lập trình compiler, hệ điều hành. (Một trong những nhà lập trình trẻ mà rất nhiều người ngưỡng mộ Chris Lattner, tác giả của LLVM và Swift – sinh năm 1978 cũng tìm hiểu loại ngôn ngữ lập trình này).

  • Hacker chuyên nghiệp.

  • Reverse Engineer: Reverse Engineer được biết đến là những kỹ sư chuyên phân tích, mổ xẻ các chương trình để hiểu rõ chi tiết bên trong nó thế nào, là công việc thường ứng dụng trong an ninh: phát hiện mã độc, đánh giá thuật toán mã hoá … và các lĩnh vực khác có liên quan.

Những đối tượng nên học ASM

Những tài liệu nên tham khảo trong quá trình học ASM

  • Introduction to 64 Bit Assembly Programming for Linux: Một quyển sách giới thiệu rất hay và lôgic, tuy nhiên, phiên bản này chỉ có cho Linux.

  • Professional Assembly Language: Tác giả đi sâu nói về cơ chế, tất cả các thông số register, cơ chế vận hành phần cứng,… cho kiến trúc IA-32. Phần code ASM cũng chỉ áp dụng được cho Linux x86-64.

  • Hacking: The Art of Exploitation: Cuốn này nói rất sâu về kỹ thuật hacking, đặc biệt là sử dụng ASM để can thiệp hệ thống, chính vì thế, nó phù hợp cho những ai thích tìm hiểu về kỹ thuật này.

  • Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation.

  • OS X Assembler Reference: Guide về Assemble cho OS X của Apple, giúp ích cho bạn rất nhiều trong việc theo dõi Data Segment và memory padding để sử dụng thanh ghi EAX cho chính xác. Nếu không chương trình sẽ chạy ra lỗi bus error.

Trên đây là những thông tin cơ bản về Assembly Language cũng như những khó khăn cho những ai mới bắt đầu học loại ngôn ngữ lập trình này. Tuy nhiên, với những lợi ích tuyệt vời mà nó mang lại thì có thể khẳng định, đây là một loại ngôn ngữ lập trình đáng để chúng ta nghiên cứu và học hỏi. Hy vọng thông qua bài viết trên, bạn có thể đưa ra cho mình quyết định sáng suốt về việc có nên theo đuổi Assembly Language hay không.