- Một chương trình assembly được chia ra làm 3 phần:
- data section
- bss section
- text section
Data section
- data section dùng để khởi tạo khai báo dữ liệu hoặc hằng số. Dữ liệu này không thay đổi tại thời điểm runtime.
- Câu lệnh:
section.data
Bss section
- Phần chú giải được bắt đầu với dấu chấm phẩy(;). Vd:
add eax, ebx ;Cộng nội dung ebx vào eax
Câu lệnh Assembly
- assembly chứa 3 kiểu câu lệnh
- Executable instruction
- Assembler directives or pseudo-ops
- Macros
- Executable instructions hoặc đơn giản là instructions nói cho process làm cái gì. Mỗi instruction chứa một mã vận hành(opcode = operation code). Mỗi executable instruction tạo ra một chỉ dẫn ngôn ngữ máy.
- Assembler directives hoặc pseudo-ops là các hướ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ó tác dụng với 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ó.( Kiểu định nghĩa )
Cú pháp câu lệnh
[ label ] mnemonic [operands] [;comment]
- Trong đó label (nhãn), operands (toán hạng), comment (chú giải) là tuỳ chọn. 1 instruction cơ bản có 2 phần. Một là tên của instruction (hoặc là mneonic). Hai là toán hạng hay tham số của lệnh. Ví dụ:
INC COUNT ;Tăng các biến nhớ COUNT
MOV TOTAL, 48 ;Chuyển giá trị 48 vào biến nhớ TOTAL
ADD AH, BH ;Tăng lượng thanh ghi BH vào thanh ghi AH.
AND MASK1, 128 ;Dùng toán tử AND cho biến MASK1 và 128
Hello World!!!
section .text
global_start ;Phải được khai báo cho trình liên kết(linker) (ld)
_start: ;Nói cho linker biết điểm bắt đầu
mov edx,len ;Độ dài message
mov ecx,msg ;Viết message
mov ebx,1 ;file mô tả (stdout)
mov eax,4 ;Lời gọi hệ thống number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;Chuỗi in
len equ $ - msg ;Độ dài chuỗi
Compiling và Linking 1 chương trình trong NASM.
- Gõ đoạn code trên sử dụng text editor và lưu là hello.asm
- Phải chắc chắn là đang ở cùng đường dẫn với nơi lưu.
- Để biên dịch,gõ nasm -f elf hello.asm
- Nếu có bất kỳ lỗi nào, nó sẽ thông báo, ngược lại 1 file object được tạo
- Để liên kết file object và tạo file thực thi, gõ ld -m elf_i386 -s -o hello hello.o
- Thực thi chương trình bằng cách gõ ./hello