Loading...

1. Các section của chương trình:

Một chương trình Assembly có thể chia thành 3 section (phân đoạn): Data section, Bss session và Text section.

Phân đoạn data:

Được sử dụng để khai báo các dữ liệu khởi tạo và các hằng của chương trình. Dữ liệu ở đây sẽ không được thay đổi khi chạy chương trình.

Chúng ta có thể khai báo giá trị hằng, tên file, kích thước buffer,… tại đây.

Cú pháp:        section .data

Section này thường được gọi là data segment.

Phân đoạn bss:

Được sử dụng để khai báo các biến sử dụng trong chương trình

Cú pháp:        section .bss

Phân đoạn text:

Được sử dụng để giữ mã lệnh (code) của chương trình. Phân đoạn này phải bắt đầu với khai báo global _start, để báo với hệ điều hành (Kernel) vị trí bắt đầu của chương trình là tại đây. 

Cú pháp:

 

section .text

   global _start

_start:

Section này thường được gọi là code segment.

2. Cú pháp câu lệnh Assembly:

Chương trình ngôn ngữ Assembly bao gồm 3 loại lệnh:

Executable instructions hoặc instructions: Đây là dạng lệnh gợi nhớ của ngôn ngữ máy. Processor sẽ dịch các lệnh này sang lệnh ngôn ngữ máy để thực thi.

Assembler directives hoặc pseudo-ops: Đây là các ướng dẫn biên dịch chương trình, nó chỉ có tác dụng với trình biên dịch nên không được dịch sang ngôn ngữ máy.

Macros: Chính là một tập lệnh được đặt tên. Ngay trong quá trình biên dịch chương trình, mỗi lệnh macro sẽ được thay bằng tập lệnh bên trong của nó.

Cú pháp câu lệnh Assembly:

[label]   mnemonic   [operands]   [;comment]

Trong đó:

- [label]: Có thể xem là tên đại diện của lệnh. Nó thường được sử dụng trong các đoạn lệnh có lệnh nhảy (jump), lệnh lặp (loop), lệnh gọi chương trình con (call),…

- Mnemonic: Tên của lệnh ở dạng gợi nhớ (như: mov, add, sub, int…). Đây là một trong các lệnh thuộc tập lệnh gợi nhớ của một processor nào đó. 

- [operands]: Đây là các đối tượng chịu sự tác động của lệnh: Biến, hằng, thanh ghi, địa chỉ ô nhớ,… Một lệnh ngôn ngữ Assembly có thể không có, có 1 hoặc 2 operand (toán hạng)

- [;comment]: Phần chú thích lệnh. Được đặt sau dấu chấm phẩy (;).

Ví dụ 1:

            AddReg:     Add    Eax, Ebx            ; Cộng nội dung Ebx vào Eax

                                                                        ; AddReg là label của lệnh này

Ví dụ 2:

inc       count              ; Tăng biế nhớ COUNT lên 1 đơn vị

mov    total, 48          ; Chuyển số 48 vào biến nhớ total

add     ah, bh            

and     mask1, 128  

add     marks, 10      

mov    al, 10             

3. Chương trình Assembly đầu tiên:

Chương trình sau đây in xâu Welcome to tuhocanninhmang.com ra màn hình:

section           .tex

global         _start  

_start:                                          ; điểm bắt đầu của chương trình

mov            edx, len          ; đặt độ dài của msg vào edx

mov            ecx, msg     

mov            ebx, 1                  

mov            eax, 4              ; gọi hàm 04 của ngắt 80h

int               0x80                ; để in xâu ra màn hình

; -------------------------

    mov            eax,1               ; gọi hà 01 của ngắt 80h

    int               0x80               ; để kết thúc chương trình

section           .data

msg     db        'Welcome to tuhocanninhmang.com', 0xa         

len       equ      $ - msg                       ; biến len chứa độ dài của xâu msg

Chương trình này sử dụng hàm 04 của ngắt 80h để in xâu và hàm 01 của ngắt 80h để kết thúc chương trình (bắt buộc đối với mọi chương trình). Điểm bắt đầu của chương trình là lệnh sau label _start.

4. Biên dịch và liên kết chương trình trong NASM

Chuẩn bị:

Tạo một thư mục trên đĩa (trên Linux hoặc trên Windows), và rồi copy vào đó tập tin chính của chương trình biên dịch NASM và các tập tin liên quan (D:\ASM).

Thực hiện:

B1: Sử dụng bất kỳ trình soạn thảo nào để viết chương trình, chỉ cần lưu tập tin với phần mở rộng là asm vào thư mục D:\ASM. Ví dụ: hello.asm.

B2: Dịch chương trình hello.asm ra hello.exe:

- Từ cửa sổ CMD, chuyển đến thư mục D:\ASM

- Tại dấu nhắc gõ:

NASM -f elf hello.asm

- Nếu không bị lỗi thì một tập tin đối tượng (kết quả dịch) được hình thành: hello.o

B3: Liên kết các tập tin đối tượng và tạo tập tin thực thi:

ld -m elf_i386 -s -o hello hello.o

B4: Chạy thử. Nếu không như mong muốn thì quay lại trình soạn thảo để chỉnh sửa chương trình sau đó tiến hành lại từ Bước 2.

Tự học

Ý kiến của bạn

Mã bảo vệ
Làm mới

Hãy đăng quảng cáo trên TuHocAnNinhMang.com

Bài xem nhiều nhất

Tự học lập trình C - Bài 1: Một số khái niệm cơ bản

Khái niệm tên rất quan trọng trong quá trình lập trình, ...

MySQL – Bài 8: Khóa chính (primary key) và khóa ngoại (foreign key) của table

Với ràng buộc này thì, việc người sử dụng vô tình hay cố ...

Tự học lập trình C - Bài 10: Mảng một chiều

Mảng 1 chiều là tập hợp các phần tử có cùng kiểu dữ ...

Tự học lập trình JAVA – Bài 1: Bước đầu với Java

Một chương trình java có thể được định nghĩa như là một ...

Tự học lập trình C - Bài 2: Cấu trúc chương trình C

Một chương trình bao gồm một hoặc nhiều hàm, mỗi hàm ...

Tự học lập trình Assembly - Bài 1: Bước đầu với lập trình Assembly trên vi xử lý Intel 8086/8088

Như đã biết, lệnh ngôn ngữ máy là một dãy các con số 0, ...

Hướng dẫn in ấn trong Word 2007/2010 – Step by Step

[Tự học] - Tiêu đề đầu trang (Header)/tiêu đề cuối ...

Hãy đăng quảng cáo trên TuHocAnNinhMang.com

Về đầu trang Hỏi - Đáp