Lập trình Assembly-Bài 1(tt)
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.
BÀI VIẾT LIÊN QUAN:
Bài báo đăng Tạp chí ngành cơ khí Việt Nam
The paper presents the researched results on design and manufacture of ...
Sửa lỗi USB hoặc thẻ nhớ SD không thể format ở Windows 10
Nếu bạn đang gặp phải vấn đề với việc format USB hay thẻ nhớ SD thì bài viết ...