Duy Nguyen Hoang A fully enthusiastic boy

Hợp ngữ Assembly – Ngôn ngữ bậc thấp

4 min read

assembly

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.

Avatar photo
Duy Nguyen Hoang A fully enthusiastic boy

Leave a Reply

Your email address will not be published. Required fields are marked *