Assembly - Chế độ địa chỉ

Hầu hết các lệnh hợp ngữ đều yêu cầu các toán hạng được xử lý. Một địa chỉ toán hạng cung cấp vị trí, nơi dữ liệu được xử lý được lưu trữ. Một số lệnh không yêu cầu toán hạng, trong khi một số lệnh khác có thể yêu cầu một, hai hoặc ba toán hạng.

Khi một lệnh yêu cầu hai toán hạng, toán hạng đầu tiên thường là đích, chứa dữ liệu trong một thanh ghi hoặc vị trí bộ nhớ và toán hạng thứ hai là nguồn. Nguồn chứa dữ liệu được phân phối (định địa chỉ ngay lập tức) hoặc địa chỉ (trong thanh ghi hoặc bộ nhớ) của dữ liệu. Nói chung, dữ liệu nguồn vẫn không bị thay đổi sau khi hoạt động.

Ba phương thức địa chỉ cơ bản là -

  • Đăng ký địa chỉ
  • Giải quyết ngay lập tức
  • Định địa chỉ bộ nhớ

Đăng ký địa chỉ

Trong chế độ định địa chỉ này, một thanh ghi chứa toán hạng. Tùy thuộc vào lệnh, thanh ghi có thể là toán hạng đầu tiên, toán hạng thứ hai hoặc cả hai.

Ví dụ,

MOV DX, TAX_RATE   ; Register in first operand
MOV COUNT, CX	   ; Register in second operand
MOV EAX, EBX	   ; Both the operands are in registers

Vì việc xử lý dữ liệu giữa các thanh ghi không liên quan đến bộ nhớ, nó cung cấp khả năng xử lý dữ liệu nhanh nhất.

Giải quyết ngay lập tức

Một toán hạng tức thì có giá trị không đổi hoặc một biểu thức. Khi một lệnh có hai toán hạng sử dụng địa chỉ tức thời, toán hạng đầu tiên có thể là một thanh ghi hoặc vị trí bộ nhớ, và toán hạng thứ hai là một hằng số tức thì. Toán hạng đầu tiên xác định độ dài của dữ liệu.

Ví dụ,

BYTE_VALUE  DB  150    ; A byte value is defined
WORD_VALUE  DW  300    ; A word value is defined
ADD  BYTE_VALUE, 65    ; An immediate operand 65 is added
MOV  AX, 45H           ; Immediate constant 45H is transferred to AX

Định địa chỉ bộ nhớ trực tiếp

Khi các toán hạng được chỉ định trong chế độ định địa chỉ bộ nhớ, cần có quyền truy cập trực tiếp vào bộ nhớ chính, thường là tới đoạn dữ liệu. Cách giải quyết này dẫn đến việc xử lý dữ liệu chậm hơn. Để xác định vị trí chính xác của dữ liệu trong bộ nhớ, chúng ta cần địa chỉ bắt đầu phân đoạn, địa chỉ này thường được tìm thấy trong thanh ghi DS và một giá trị offset. Giá trị bù đắp này còn được gọi làeffective address.

Trong chế độ định địa chỉ trực tiếp, giá trị bù được chỉ định trực tiếp như một phần của lệnh, thường được chỉ định bằng tên biến. Trình hợp dịch tính toán giá trị bù và duy trì một bảng ký hiệu, bảng này lưu trữ các giá trị bù của tất cả các biến được sử dụng trong chương trình.

Trong định địa chỉ bộ nhớ trực tiếp, một trong các toán hạng tham chiếu đến một vị trí bộ nhớ và toán hạng khác tham chiếu đến một thanh ghi.

Ví dụ,

ADD	BYTE_VALUE, DL	; Adds the register in the memory location
MOV	BX, WORD_VALUE	; Operand from the memory is added to register

Định địa chỉ bù trừ trực tiếp

Chế độ địa chỉ này sử dụng các toán tử số học để sửa đổi một địa chỉ. Ví dụ: hãy xem các định nghĩa sau xác định các bảng dữ liệu:

BYTE_TABLE DB  14, 15, 22, 45      ; Tables of bytes
WORD_TABLE DW  134, 345, 564, 123  ; Tables of words

Các thao tác sau truy cập dữ liệu từ các bảng trong bộ nhớ vào các thanh ghi:

MOV CL, BYTE_TABLE[2]	; Gets the 3rd element of the BYTE_TABLE
MOV CL, BYTE_TABLE + 2	; Gets the 3rd element of the BYTE_TABLE
MOV CX, WORD_TABLE[3]	; Gets the 4th element of the WORD_TABLE
MOV CX, WORD_TABLE + 3	; Gets the 4th element of the WORD_TABLE

Định địa chỉ bộ nhớ gián tiếp

Chế độ địa chỉ này sử dụng khả năng của máy tính của Phân đoạn: Định địa chỉ bù đắp . Nói chung, các thanh ghi cơ sở EBX, EBP (hoặc BX, BP) và các thanh ghi chỉ mục (DI, SI), được mã hóa trong dấu ngoặc vuông cho các tham chiếu bộ nhớ, được sử dụng cho mục đích này.

Định địa chỉ gián tiếp thường được sử dụng cho các biến chứa một số phần tử như mảng. Địa chỉ bắt đầu của mảng được lưu trữ trong thanh ghi EBX.

Đoạn mã sau đây cho biết cách truy cập các phần tử khác nhau của biến.

MY_TABLE TIMES 10 DW 0  ; Allocates 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABLE]     ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110          ; MY_TABLE[0] = 110
ADD EBX, 2              ; EBX = EBX +2
MOV [EBX], 123          ; MY_TABLE[1] = 123

Hướng dẫn MOV

Chúng tôi đã sử dụng lệnh MOV được sử dụng để di chuyển dữ liệu từ không gian lưu trữ này sang không gian lưu trữ khác. Lệnh MOV nhận hai toán hạng.

Cú pháp

Cú pháp của lệnh MOV là:

MOV  destination, source

Lệnh MOV có thể có một trong năm dạng sau:

MOV  register, register
MOV  register, immediate
MOV  memory, immediate
MOV  register, memory
MOV  memory, register

Xin lưu ý rằng -

  • Cả hai toán hạng trong hoạt động MOV phải có cùng kích thước
  • Giá trị của toán hạng nguồn không thay đổi

Lệnh MOV đôi khi gây ra sự mơ hồ. Ví dụ, hãy xem các câu lệnh -

MOV  EBX, [MY_TABLE]  ; Effective Address of MY_TABLE in EBX
MOV  [EBX], 110	      ; MY_TABLE[0] = 110

Không rõ bạn muốn di chuyển một byte tương đương hay từ tương đương với số 110. Trong những trường hợp như vậy, bạn nên sử dụng type specifier.

Bảng sau đây cho thấy một số loại chỉ định loại phổ biến:

Loại chỉ định Số byte được giải quyết
BYTE 1
WORD 2
DWORD 4
QWORD số 8
TBYTE 10

Thí dụ

Chương trình sau đây minh họa một số khái niệm đã thảo luận ở trên. Nó lưu tên 'Zara Ali' trong phần dữ liệu của bộ nhớ, sau đó thay đổi giá trị của nó thành một tên khác 'Nuha Ali' theo chương trình và hiển thị cả hai tên.

section	.text
   global _start     ;must be declared for linker (ld)
_start:             ;tell linker entry point
	
   ;writing the name 'Zara Ali'
   mov	edx,9       ;message length
   mov	ecx, name   ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	[name],  dword 'Nuha'    ; Changed the name to Nuha Ali
	
   ;writing the name 'Nuha Ali'
   mov	edx,8       ;message length
   mov	ecx,name    ;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
name db 'Zara Ali '

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

Zara Ali Nuha Ali