Assembly là dạng ngôn ngữ lập trình bậc cao, nó là dạng ngôn ngữ theo kiểu mẫu gợi nhớ (Mnemonic), hay dạng kí hiệu, của ngôn ngữ máy. Assembly giúp mọi người nhìn rõ hơn mối quan hệ giữa các thành phần chức năng bên trong máy tính và hệ điều hành.
Bạn đang xem: Assembly là gì
Có thể khẳng định, việc tiếp xúc này sẽ giúp các bạn nắm vững kiến trúc máy tính, tổ chức hoạt động bên trong máy tính và hệ điều hành.
Ngôn ngữ lập trình Assembly là gì, có nên học Assembly không?
Click để hiển thị dàn ý chính bài viết
1 Vậy Assemly Language là gì?1.5 ASM khó vậy thì học để làm gì ?!?2 Một số tài liệu liên quan tới ASM
Vậy Assemly Language là gì?
Nếu như các bạn có tìm hiểu về dòng ngôn ngữ này thì có thể thấy cấu trúc dữ liệu và giải thuật của nó toàn là 0 và 1 nên rất khó đọc và khó hiểu. Do đó, các nhà thiết kế thuật toán đã sáng tạo ra vi xử lý để đưa ra tập lệnh hợp ngữ gần với ngôn ngữ tự nhiên hơn.
Tuy nhiên, các dòng lệnh này vẫn phù hợp với phần cứng rất khoa học, nhờ đó việc tiếp cận với lập trình hợp ngữ giúp chúng ta hiểu rõ hơn về kiến trúc và tổ chức hoạt động của phần cứng.
Trong nội dung của bài viết ngày hôm nay, chúng ta chỉ tìm hiểu khái quát về ngôn ngữ lập trình Assembly, để lập trình chạy trên các máy IBM-PC: Sử dụng họ vi xử lý này và hoạt động trong sự phối hợp với hệ điều hành MS_DOS.
Assembly Language viết tắt là ASM Language
Assembly Language (ASM), tiếng Việt là hợp ngữ. Mục đích của mình học ASM chỉ cơ bản là muốn hiểu thêm về người bạn thân thiết nhất của mình, cái máy tính mà suốt ngày mình ngồi trước nó. Mình chỉ thật sự muốn biết là đằng sau những dòng lệnh mình code thường ngày thì bên dưới nó làm cái gì ?!.
Thật tiếc là sau khi đã tìm hiểu được một số khái niệm về kiến trúc CPU, các loại Registers (thanh ghi), Data Segments, Data Moving thì mình buộc phải bỏ cuộc ở Control Flow.
Lý do đầu tiên là … do mình dở, mình thấy nó thật sự quá khó với mình, vốn là dân code ứng dụng với ngôn ngữ bậc cao (high level language) và chưa biết gì về Computer Scientic.
Ngôn ngữ lập trình Assembly là gì, có tác dụng gì, có nên học Assembly không?
Thứ hai là cách tiếp cận bottom-up (từ lý thuyết lên) này cũng không tốt. Mình nghĩ là trong tương lai nếu có dự án nào cần tới ASM thì mình sẽ có thể vừa học và practice tốt hơn (hướng tiếp cận top-down hay còn gọi là end to end).
Assembly Language (hay viết tắt là ASM) là ngôn ngữ bậc thấp, chính xác 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.
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).
Một trong các đặc tính của chương trình viết trực tiếp bằng ASM 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.
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. VD như các thành phần cơ bản trong máy tính, 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. Vì thế mà chúng ta có hẳn một ngành mang tên là “lập trình nhúng”.
Một trong các ưu thế của dòng ngôn ngữ này đó là chương trình viết trên nó có kích thước nhỏ hơn và tốc độ nạp/thực hiện chương trình nhanh hơn so với viết (chương trình cùng chức năng) trên các ngôn ngữ lập trình bậc cao.
Bên cạnh đó, hầu như mọi ngôn ngữ lập trình bậc cao thông dụng nhất hiện nay đều cho phép viết (“nhúng”) mã lệnh hợp ngữ trong nó. Vấn đề này có thể hỗ trợ lập trình viên khai thác tất cả ưu điểm của các ngôn ngữ lập trình.
Assembly rất mạnh trong những hoạt động thọc sâu vào các yếu tố bên trong hệ thống công nghệ web giới thiệu công ty, trong khi đó ngôn ngữ bậc cao mạnh trong các thao tác xử lý dữ liệu và thiết kế giao diện.
Như vậy sẽ là rất thuận lợi nếu sử dụng ngôn ngữ bậc cao để viết chương trình xử lý thông tin hệ thống, khi đó nhiệm vụ truy xuất hệ thống (thanh ghi, bộ nhớ, cổng vào/ra, thiết bị,…) để lấy dữ liệu sẽ được giao cho các đoạn mã lệnh hợp ngữ được nhúng trong chương trình này.
Assembly có 2 tính năng để tương tác cùng hệ thống
· Nhập trực tiếp từng lệnh/đoạn lệnh vào bộ nhớ rồi cho phép thực hiện ngay trên bộ nhớ mà không cần qua bước biên dịch chương trình. Chương trình gỡ rối Debug (đi kèm hệ điều hành MS_DOS: Debug . exe) là một trong những chương trình hỗ trợ chế độ này cho hợp ngữ 16 bít;
· Viết chương trình hợp ngữ, rồi sau đó sử dụng các chương trình biên dịch để dịch nó sang chương trình thực thi (dạng EXE hoặc COM) và cho thực hiện chương trình này.
Ngôn ngữ lập trình Assembly là gì, có tác dụng gì, có nên học Assembly không?
Các lập trình viên có 2 lựa chọn cho trình biên dịch hợp ngữ
· Trình biên dịch hợp ngữ cho những ứng dụng chạy trên nền hệ điều hành 16 bít MS_DOS; Trình biên dịch hợp ngữ 32 bít, MASM32 (Macro Assembler 32 bít).
· Trình biên dịch hợp ngữ cho những ứng dụng chạy trên nền hệ điều hành 32 bít MS_Windows.
Trong thực tế, để chuyển một chương trình hợp ngữ sang dạng chương trình thực thi EXE 16 bít hoặc COM 16 bít thì cần phải có sự hỗ trợ của chương trình tiện ích của hệ điều hành MS_DOS: Link (Link . exe) và EXE2Bin (EXE2Bin . com).
Xem thêm: Qa Là Gì – Công Việc Của Qa/qc Và Phân Biệt
Chương trình hợp ngữ 16 bít sử dụng hệ thống các ngắt mềm (Interrupt) của BIOS và DOS như là thư viện lập trình của nó, trong khi đó chương trình hợp ngữ 32 bít sử dụng tập hàm API làm thư viện lập trình của nó.
Kết luận : đây là những thông tin quan trọng bạn cần biết về dòng ngôn ngữ lập trình bậc cao Assembly. Kiến thức này chỉ khái quát nền tảng của Assembly, để tìm hiểu sâu bạn cần trang bị thêm nhiều tài liệu chuyên ngành khác, những tài liệu này bạn có thể tìm kiếm trên Google hoặc các diễn đàn chuyên về lập trình. Chúc các bạn thành công !!!
Cái khó của việc học ASM ra sao?
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.
Ngôn ngữ lập trình Assembly là gì, có tác dụng gì, có nên học Assembly không?
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 như mình. 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!
”
.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
.section __DATA,__data str: .asciz “Hello world!
”
.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.
Ngôn ngữ lập trình Assembly là gì, có tác dụng gì, có nên học Assembly không?
ASM khó vậy thì học để làm gì ?!?
ASM sẽ chẳng có ý nghĩa gì nếu chúng ta không thuộc tập sau đây:
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
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.
Một số tài liệu liên quan tới ASM
Mình xin chia sẻ lại một số tài liệu mà trong thời gian qua mình có được, để ai đó có đang tìm hiểu ASM có thể tham khảo qua:
Ebook về Assembly
Introduction to 64 Bit Assembly Programming for Linux: Quyển này tinh gọn, rất hay. Third edition có cho cả MacOS. Phiên bản này chỉ có cho Linux.
Professional Assembly Language: Quyển này tác giả nói rất sâu về cơ chế, tất cả các thông số register, cơ chế vận hành phần cứng … Tiếc là tác giả viết cho kiến trúc IA-32 và phần code ASM cũng chỉ cho Linux x86-64 thôi.
Hacking: The Art of Exploitation: Dành cho ai thích hack, 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.
Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation: Quyển này cho những ai yêu thích RE.
** Sách tiếng Việt mình thấy có vài cuốn nhưng mở vài trang đọc thật sự không hiểu gì !!!
Bài viết chuyên sâu về Assembly
Assembly “hello, world” for OS X: Bài này viết ASM với assembler NASM. NASM trên MacOS ko có sẵn, phải cài thêm thông qua brew.
x86 Assembly Guide: bài này mình hay dùng để tra cứu nhanh các chỉ thị và thanh ghi (vì não cá vàng chưa thể nhớ nổi
)
OS X Assembler Reference: Guide về Assembler cho OS X của Apple, mình dùng doc này để convert code bên Linux qua. Cái này thật sự không giúp mình nhiều, chủ yếu coi phần 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.
Mặc dù dừng lại khá sớm với việc học ASM nhưng mình cũng hài lòng với kết quả đạt được. Mình thu được một mớ kiến thức kha khá về CPU, cơ bản về việc các process cấp phát bộ nhớ.
Xem thêm: Supply Chain Là Gì – Vai Trò Của Supply Chain Như Thế Nào
Và quan trọng là bây giờ khi cái màn hình debug trong XCode hiện lên 1 mớ ASM mình có thể hiểu được phần nào chứ không coi nó như thứ ngôn ngữ ngoài hành tinh nữa.
Chuyên mục: Hỏi Đáp