Assembly có phù hợp với Lập trình viên không?

15-08-2022 22:33

Assembly là một ngôn ngữ nghe khá lạ tai. Chắc hẳn vẫn còn các bạn thắc mắc xem mình có nên học ngôn ngữ này không đúng không nhỉ? Vậy hôm nay hãy cùng Viện Công nghệ thông tin ITPlus tìm hiểu về ngôn ngữ này để đưa ra lựa chọn phù hợp nhất với bản thân mình bạn nhé!

Assemly Language là gì ?

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

Các ASM sẽ cần một chương trình Assembler 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.

VD: 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).

ASM sở hữu đặc tính của chương trình viết trực tiếp là chúng có tốc độ thực thi cao và tiêu tốn bộ nhớ ít hơn các chưởng viết bởi các ngôn ngữ lập trình bậc cao. Ngôn ngữ này giúp chúng ta hiểu thêm về kiến trúc phần cứng máy tính cũng như cách chúng hoạt động và tương tác với 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. Vì thế mà chúng ta có hẳn một ngành mang tên là “lập trình nhúng”. 

Cái khó của việc học ASM

Thông thường khi học một ngôn ngữ lập trình 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. 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. Nhưng với ASM thì 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à 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. 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 Assembler của GNU.

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. Nói tới đây lại thấy yêu Java hơn, 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. 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 đó là Apple chỉ định riêng bộ linker (Match-O) cho ASM, chúng sử dụng một số chỉ thị riêng, padding memory riêng (có 4 lớp padding). 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ì như kinh thánh … Việc nhớ các thanh ghi, các chỉ thị thôi đã đuối lắm rồi, thêm Apple hành nữa thật là khó càng thêm khó !!!

VD: Một chương trình in ra “Hello World” viết bằng ASM trên Mac OS như sau:

.section __DATA,__data

str:

  .asciz "Hello world!\n"

 

.section __TEXT,__text

.globl _main

_main:

  movl $0x2000004, %eax          

  movl $1, %edi                   

  movq str@GOTPCREL(%rip), %rsi  

  movq $100, %rdx                

  syscall

 

  movl $0, %ebx

  movl $0x2000001, %eax        

  syscall

Sử dụng GNU Assembler, linker và chạy thử:

as hello.asm -o hello.old hello.o -o hello -e _main./hello

Như các bạn đã thấy việc in một đoạn text ra màn hình với ASM khá phức tạp, đó là chưa kể ta phải viết đúng chỉ thị của OS và CPU hiện tại. Tất cả chỉ là các chỉ thị cho các thanh ghi chứ không có kiểu 1 lệnh in ra tất cả như C.

Có nên học Assembly không?

Nếu không thuộc một trong những thành phần sau thì ASM sẽ không mang lại cho bạn quá nhiều ý nghĩa

  • 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. (Trong đó có anh Chris Lattner, tác giả của LLVM và Swift mà mình rất ngưỡng mộ vì anh rất trẻ – SN 1978)
  • Hacker chuyên nghiệp.
  • Reverse Engineer: nếu dịch là kỹ sư đảo thì không hay và cũng ko đủ ý. RE 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, RE 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.

Một số lợi ích khác của ASM là:

  • Có thể dùng debug chương trình mà không cần source code.
  • Có thể dùng để tối ưu hoá 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.

 Với những kiến thức thu được từ việc học ASM, Viện CNTT ITPLus nghĩ rằng nếu bạn thực sự yêu thích và tò mò về ngôn ngữ này thì đừng chần chừ mà hãy tìm hiểu về nó luôn nhé. Chúng mình mong rằng những kiến thức chia sẻ bên trên có thể giúp cho bạn có một định hướng tốt hơn nha!

------------------------------------------------------------------------------------------------------

Hiện tại, Viện CNTT ITPlus có tổ chức các khóa học thiết kế chuyên nghiệp, bạn có thể tham khảo tại:

Ban Truyền thông ITPlus

Bài viết cùng chủ đề