Assembly - Cú pháp cơ bản

Một chương trình hợp ngữ có thể được chia thành ba phần:

  • Các data phần,

  • Các bss phần và

  • Các text phần.

Các dữ liệu Mục

Các dataphần được sử dụng để khai báo dữ liệu khởi tạo hoặc hằng số. Dữ liệu này không thay đổi trong thời gian chạy. Bạn có thể khai báo các giá trị hằng số, tên tệp hoặc kích thước bộ đệm, v.v., trong phần này.

Cú pháp khai báo phần dữ liệu là:

section.data

Các bss Mục

Các bssphần được sử dụng để khai báo các biến. Cú pháp khai báo phần bss là:

section.bss

Các văn bản phần

Các textđược sử dụng để giữ mã thực tế. Phần này phải bắt đầu bằng phần khai báoglobal _start, cho kernel biết nơi bắt đầu thực thi chương trình.

Cú pháp khai báo phần văn bản là -

section.text
   global _start
_start:

Bình luận

Nhận xét hợp ngữ bắt đầu bằng dấu chấm phẩy (;). Nó có thể chứa bất kỳ ký tự in được bao gồm cả khoảng trống. Nó có thể tự xuất hiện trên một dòng, như -

; This program displays a message on screen

hoặc, trên cùng một dòng cùng với một chỉ dẫn, như -

add eax, ebx     ; adds ebx to eax

Câu lệnh hợp ngữ

Các chương trình hợp ngữ bao gồm ba loại câu lệnh:

  • Hướng dẫn thực thi hoặc hướng dẫn,
  • Chỉ thị Assembler hoặc giả hoạt động và
  • Macros.

Các executable instructions hoặc đơn giản instructionscho bộ xử lý biết phải làm gì. Mỗi hướng dẫn bao gồm mộtoperation code(opcode). Mỗi lệnh thực thi tạo ra một lệnh ngôn ngữ máy.

Các assembler directives hoặc là pseudo-opsnói với người lắp ráp về các khía cạnh khác nhau của quá trình lắp ráp. Đây là những lệnh không thể thực thi và không tạo ra các lệnh ngôn ngữ máy.

Macros về cơ bản là một cơ chế thay thế văn bản.

Cú pháp của câu lệnh hợp ngữ

Các câu lệnh hợp ngữ được nhập một câu lệnh trên mỗi dòng. Mỗi câu lệnh tuân theo định dạng sau:

[label]   mnemonic   [operands]   [;comment]

Các trường trong dấu ngoặc vuông là tùy chọn. Một lệnh cơ bản có hai phần, phần thứ nhất là tên của lệnh (hoặc phần ghi nhớ) sẽ được thực hiện và phần thứ hai là các toán hạng hoặc các tham số của lệnh.

Sau đây là một số ví dụ về các câu lệnh hợp ngữ điển hình:

INC COUNT        ; Increment the memory variable COUNT

MOV TOTAL, 48    ; Transfer the value 48 in the 
                 ; memory variable TOTAL
					  
ADD AH, BH       ; Add the content of the 
                 ; BH register into the AH register
					  
AND MASK1, 128   ; Perform AND operation on the 
                 ; variable MASK1 and 128
					  
ADD MARKS, 10    ; Add 10 to the variable MARKS
MOV AL, 10       ; Transfer the value 10 to the AL register

Chương trình Hello World trong Assembly

Mã hợp ngữ sau đây hiển thị chuỗi 'Hello World' trên màn hình:

section	.text
   global _start     ;must be declared for linker (ld)
	
_start:	            ;tells linker entry point
   mov	edx,len     ;message length
   mov	ecx,msg     ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call 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  ;string to be printed
len equ $ - msg     ;length of the string

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

Hello, world!

Biên dịch và liên kết một chương trình lắp ráp trong NASM

Đảm bảo rằng bạn đã đặt đường dẫn nasmldnhị phân trong biến môi trường PATH của bạn. Bây giờ, hãy thực hiện các bước sau để biên dịch và liên kết chương trình trên -

  • Nhập mã trên bằng trình soạn thảo văn bản và lưu nó dưới dạng hello.asm.

  • Đảm bảo rằng bạn đang ở trong cùng một thư mục với nơi bạn đã lưu hello.asm.

  • Để lắp ráp chương trình, hãy nhập nasm -f elf hello.asm

  • Nếu có bất kỳ lỗi nào, bạn sẽ được nhắc về điều đó ở giai đoạn này. Nếu không, một tệp đối tượng của chương trình của bạn có tênhello.o sẽ được tạo ra.

  • Để liên kết tệp đối tượng và tạo tệp thi hành có tên hello, hãy nhập ld -m elf_i386 -s -o hello hello.o

  • Thực thi chương trình bằng cách gõ ./hello

Nếu bạn đã làm mọi thứ một cách chính xác, nó sẽ hiển thị 'Xin chào, thế giới!' trên màn hình.