Các Phương Thức Địa Chỉ Cơ Bản Trong Tập Lệnh x86

Phương thức địa chỉ và cách sử dụng

Phương thức Ví dụ (MOV đích, nguồn) Vị trí tham số Đặc điểm
**Số ngay** MOV ECX, 0x5A3F Trong lệnh Đưa giá trị hằng trực tiếp vào thanh ghi.
**Thanh ghi** MOV EDX, ECX Thanh ghi CPU Tốc độ nhanh nhất, dùng cho thao tác giữa các thanh ghi.
**Trực tiếp** MOV EAX, [0x7000] Địa chỉ bộ nhớ cố định Truy cập biến tĩnh qua địa chỉ cụ thể.
**Gián tiếp thanh ghi** MOV EBX, [EDX] Bộ nhớ chỉ bởi thanh ghi Thanh ghi đóng vai trò con trỏ, dùng cho duyệt mảng.
**Thanh ghi + lệch** MOV EAX, [ESI + 0x12] [Thanh ghi cơ sở + lệch] Truy cập trường cấu trúc hoặc phần tử mảng (lệch cố định).
**Cơ sở + chỉ số** MOV EAX, [EBX + EDI] [Thanh ghi cơ sở + thanh ghi chỉ số] Phù hợp cho mảng 2 chiều (cơ sở hàng + chỉ số cột).
**Cơ sở + chỉ số tỷ lệ** MOV EAX, [ECX + EDI*8 + 0x30] [Cơ sở + chỉ số*phân số + lệch] Cơ chế linh hoạt nhất cho mảng (phân số 1,2,4,8 tương ứng với BYTE, WORD, DWORD, QWORD).

1. Số ngay

Giá trị hằng được nhúng trực tiếp vào mã lệnh.
  • Định dạng: MOV thanh_ghi_mục_tiêu, số_ngay
  • Ví dụ:
    MOV BL, 0xAA     ; Gán giá trị 8-bit AA vào BL
    MOV DX, 0x1234   ; Gán giá trị 16-bit vào DX
    MOV RAX, 0x12345678 ; Gán giá trị 32-bit vào RAX
    
  • Lưu ý: Số ngay chỉ dùng làm nguồn. Kích thước phải khớp với thanh ghi đích.

2. Thanh ghi

Tham số nằm trực tiếp trong thanh ghi CPU.
  • Định dạng: MOV thanh_ghi_mục_tiêu, thanh_ghi_nguồn
  • Ví dụ:
    MOV EDX, EAX     ; Sao chép giá trị từ EAX sang EDX
    ADD EDX, ECX     ; EDX = EDX + ECX
    XOR EBX, EBX     ; Xóa EBX (hiệu quả hơn MOV EBX, 0)
    
  • Lưu ý: Phương thức nhanh nhất, không truy cập bộ nhớ.

3. Trực tiếp

Sử dụng địa chỉ bộ nhớ cụ thể.
  • Định dạng: MOV thanh_ghi, [địa_chỉ]
  • Ví dụ:
    MOV AX, [0x5555]       ; Đọc từ 2 byte tại địa chỉ 0x5555 vào AX
    MOV DWORD PTR [0x6000], EAX ; Ghi giá trị EAX vào địa chỉ 0x6000
    
  • Lưu ý: Trong chế độ bảo vệ 32-bit, địa chỉ là địa chỉ tuyến tính. [ ] chứa lệch, kết hợp với đoạn DS.

4. Gián tiếp thanh ghi

Thanh ghi chứa địa chỉ truy cập bộ nhớ.
  • Định dạng: MOV thanh_ghi, [thanh_ghi]
  • Ví dụ:
    MOV ESI, offset buffer ; ESI trỏ đến đầu bộ đệm
    MOV AL, [ESI]          ; Đọc 1 byte tại địa chỉ ESI
    INC DWORD PTR [EDX]    ; Tăng giá trị tại địa chỉ EDX
    
  • Lưu ý: Thường dùng ESI, EDI, EBX. Cơ sở cho thao tác con trỏ.

5. Thanh ghi + lệch

Kết hợp thanh ghi và lệch cố định.
  • Định dạng: MOV thanh_ghi, [thanh_ghi + lệch]
  • Ví dụ:
    MOV EAX, [EBX + 0x10]      ; Truy cập trường cấu trúc
    MOV EAX, [EBP - 0x20]      ; Truy cập biến cục bộ
    MOV EAX, [ESI + 0x40]      ; Truy cập phần tử mảng thứ 10 (0x40 = 10*4)
    
  • Lưu ý: Lệch có thể âm/dương, hỗ trợ truy cập cấu trúc dữ liệu.

6. Cơ sở + chỉ số

Kết hợp hai thanh ghi để tính địa chỉ.
  • Định dạng: MOV thanh_ghi, [thanh_ghi_cơ_sở + thanh_ghi_chỉ_số]
  • Ví dụ:
    MOV EAX, [EDX + ECX]    ; Địa chỉ hiệu dụng = EDX + ECX
    ; EDX: cơ sở mảng, ECX: chỉ số cột
    
  • Lưu ý: Hai thanh ghi có thể thay đổi vai trò.

7. Cơ sở + chỉ số tỷ lệ

Cơ sở + chỉ số * hệ số tỷ lệ (1,2,4,8) + lệch.
  • Định dạng: MOV thanh_ghi, [thanh_ghi_cơ_sở + thanh_ghi_chỉ_số*phân_số + lệch]
  • Ví dụ:
    MOV EAX, [EDX + ECX*4]          ; Truy cập mảng DWORD (ECX: chỉ số)
    MOV EAX, [array_base + EDX*8 + 0x20] ; Truy cập trường cấu trúc
    
  • Lưu ý: Hệ số tỷ lệ tương ứng với kích thước phần tử (4=DWORD). Phương thức tối ưu nhất cho mảng.

Phương pháp chọn lựa

  • Tối ưu tốc độ: Ưu tiên thanh ghi (không truy cập bộ nhớ).
  • Biến cục bộ: Dùng [EBP +/- lệch] (thanh ghi + lệch).
  • Mảng: Dùng cơ sở + chỉ số tỷ lệ (ví dụ [EDX + ECX*4]).
  • Con trỏ: Dùng gián tiếp thanh ghi ([ESI]).

Thẻ: x86 assembly addressing-modes memory-access array-indexing

Đăng vào ngày 16 tháng 7 lúc 02:37