• Một chương trình assembly được chia ra làm 3 phần:
    1. data section
    2. bss section
    3. 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

  • bss section dùng để khai báo biến.
  • Câu lệnh:section.bss

    Text section

  • text section dùng để ghi code. Section này phải được bắt đầu với khai báo global_start, nó sẽ báo cho kernel biết chương trình bắt đầu thực thi tại đâu.
  • Câu lệnh:
    section.text
     global _start
    _start:
    

Comments

  • 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
    1. Executable instruction
    2. Assembler directives or pseudo-ops
    3. 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