Assembly là một ngôn ngữ lập trình cấp thấp, thường được sử dụng để lập trình các hệ thống nhúng, viết phần mềm quản lý phần cứng và thực hiện các tác vụ gần gũi với kiến thức về kiến trúc máy tính. Trong bài viết này, chúng ta sẽ học cách viết và hiểu một số khái niệm cơ bản trong ngôn ngữ Assembly.
Cú pháp cơ bản
Ngôn ngữ Assembly sử dụng các hướng dẫn (instructions) để điều khiển máy tính. Mỗi hướng dẫn có một mã op-code đại diện cho một hoạt động cụ thể, và có thể có các toán hạng (operands) để xác định dữ liệu đầu vào hoặc đầu ra.
Ví dụ về hướng dẫn cơ bản:
MOV AX, 5 ; Gán giá trị 5 vào thanh ghi AX
ADD BX, AX ; Cộng giá trị trong AX vào BX
SUB CX, 10 ; Trừ 10 từ thanh ghi CX
Thanh ghi (Registers)
Trong ngôn ngữ Assembly, có một số thanh ghi quan trọng được sử dụng để lưu trữ dữ liệu và tính toán. Các thanh ghi phổ biến bao gồm AX, BX, CX, và DX. Mỗi thanh ghi có kích thước cố định và được sử dụng để lưu trữ số nguyên, ký tự hoặc địa chỉ bộ nhớ.
Lệnh nhảy (Jump Instructions)
Lệnh nhảy cho phép kiểm soát dòng thực thi của chương trình. Ví dụ:
CMP AX, BX ; So sánh AX và BX
JEQ label ; Nhảy đến nhãn "label" nếu bằng nhau
JNE another_label ; Nhảy đến nhãn "another_label" nếu không bằng nhau
Ngăn xếp (Stack)
Ngăn xếp là một cấu trúc dữ liệu quan trọng trong ngôn ngữ Assembly, được sử dụng để lưu trữ địa chỉ trả về từ hàm, giữ các giá trị trung gian và thực hiện gọi hàm. Dùng PUSH
để đẩy giá trị lên ngăn xếp và POP
để lấy giá trị từ ngăn xếp.
Các câu lệnh thường gặp trong Assembly
MOV (Move)
Cú pháp: MOV destination, source
Câu lệnh MOV
được sử dụng để di chuyển dữ liệu từ source
(nguồn) đến destination
(đích). Đây là một trong những câu lệnh quan trọng nhất trong ngôn ngữ Assembly, vì nó cho phép bạn làm việc với dữ liệu.
Ví dụ:
MOV AX, 5 ; Gán giá trị 5 vào thanh ghi AX
MOV BX, AX ; Sao chép giá trị của AX vào BX
ADD (Addition)
Cú pháp: ADD destination, source
Câu lệnh ADD
thực hiện phép cộng giữa giá trị tại source
và giá trị hiện tại tại destination
, và sau đó kết quả được lưu vào destination
.
Ví dụ:
ADD AX, BX ; Cộng giá trị của BX vào AX
ADD CX, 10 ; Cộng 10 vào giá trị của CX
SUB (Subtraction)
Cú pháp: SUB destination, source
Câu lệnh SUB
thực hiện phép trừ giữa giá trị tại source
và giá trị hiện tại tại destination
, và sau đó kết quả được lưu vào destination
.
Ví dụ:
SUB AX, BX ; Trừ giá trị của BX khỏi AX
SUB DX, 5 ; Trừ 5 khỏi giá trị của DX
JMP (Jump)
Cú pháp: JMP destination
Câu lệnh JMP
được sử dụng để nhảy tới một địa chỉ được xác định bởi destination
. Điều này cho phép kiểm soát luồng thực thi của chương trình.
Ví dụ:
CMP AX, BX ; So sánh AX và BX
JZ label ; Nhảy đến nhãn "label" nếu bằng nhau
CALL (Call)
Cú pháp: CALL procedure
Câu lệnh CALL
được sử dụng để gọi một hàm hoặc thủ tục tại địa chỉ procedure
. Nó thường được sử dụng để gọi các phần mã chức năng riêng biệt trong chương trình.
Ví dụ:
CALL my_function ; Gọi hàm my_function
RET (Return)
Cú pháp: RET
Câu lệnh RET
được sử dụng để trả về từ một hàm sau khi thực thi hoàn thành. Thường đi kèm với CALL
để quay lại nơi gọi hàm.
Ví dụ:
RET ; Trả về sau khi thực hiện xong hàm
Ví dụ đơn giản
Dưới đây là một ví dụ đơn giản về tính tổng của hai số sử dụng ngôn ngữ Assembly:
section .data
num1 db 5 ; Định nghĩa biến num1 với giá trị là 5
num2 db 3 ; Định nghĩa biến num2 với giá trị là 3
result db 0 ; Định nghĩa biến result với giá trị ban đầu là 0
section .text
global _start ; Điểm bắt đầu thực thi chương trình
_start:
; Di chuyển giá trị của num1 vào thanh ghi AL
mov al, [num1]
; Di chuyển giá trị của num2 vào thanh ghi BL
mov bl, [num2]
; Thực hiện phép cộng
add al, bl
; Di chuyển kết quả vào biến result
mov [result], al
; Kết thúc chương trình
mov eax, 1 ; Số syscall cho exit
int 0x80
Kết luận
Ngôn ngữ Assembly là một ngôn ngữ lập trình cấp thấp mạnh mẽ, dùng để kiểm soát máy tính ở mức gần gũi với phần cứng. Bài viết này chỉ giới thiệu những khái niệm cơ bản, nhưng để trở thành một lập trình viên Assembly giỏi, bạn cần học thêm về kiến thức về kiến trúc máy tính và tìm hiểu sâu hơn về cách làm việc với các hệ thống cụ thể.
Nếu bạn quan tâm, hãy khám phá thêm về các hướng dẫn và ví dụ khác để nắm vững ngôn ngữ Assembly.