Menu
CoddyTech

LEA: nạp địa chỉ

Thuộc phần Kiến thức nền tảng trong hành trình Assembly của Coddy. Bài học 19 trên 45.

Đến giờ, bạn đã dùng mov để tải giá trị từ bộ nhớ vào các thanh ghi. Nhưng đôi khi bạn không cần giá trị. Bạn cần chính địa chỉ.

LEA là viết tắt của Load Effective Address. Lệnh này tính địa chỉ bộ nhớ rồi đưa địa chỉ đó vào một thanh ghi mà không truy cập bộ nhớ.

Cú pháp:

lea register, [address]

MOV so với LEA:

LệnhChức năng
mov al, [number]Truy cập bộ nhớ, lấy giá trị bên trong rồi đưa vào al
lea rsi, [number]KHÔNG truy cập bộ nhớ. Tính địa chỉ của number rồi đưa vào rsi

Hãy hình dung như thế này:

  • mov = mở chiếc hộp và lấy thứ bên trong
  • lea = ghi số hộp (địa chỉ) lên một mảnh giấy

Ví dụ:

number db 42        ; Giá trị (value) 42 nằm tại một địa chỉ nào đó

mov al, [number]    ; al = 42 (giá trị)
lea rsi, [number]   ; rsi = địa chỉ của number (ví dụ: 0x402000)

Tại sao bạn cần LEA?

Trong hợp ngữ, khi muốn in ra một chuỗi hoặc truyền một địa chỉ bộ nhớ cho hàm, bạn cần địa chỉ, không phải giá trị. Lệnh gọi hệ thống write (bạn sẽ học trong chương 5) cần một địa chỉ trong rsi.

LEA có thể làm gì (ngoài việc xử lý địa chỉ đơn giản):

LEA cũng có thể thực hiện phép toán cơ bản với địa chỉ. Ví dụ:

lea rsi, [number + 5]   ; rsi = địa chỉ của number + 5 byte

Điều này hữu ích khi làm việc với mảng và cấu trúc dữ liệu.

challenge icon

Thử thách

Viết một dòng assembly để nạp địa chỉ của message vào thanh ghi rsi.

Tự làm thử

section .data
    msg_prefix db 'message = '
    prefix_len equ $ - msg_prefix

section .text
    global _start

_start:
    ; Lệnh lea của bạn chạy trước
    ; Giờ rsi cần chứa địa chỉ của message
    
    ; In ra tiền tố
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_prefix
    mov rdx, prefix_len
    syscall
    
    %include "solution.asm"
    
    ; In ra chuỗi bằng địa chỉ bạn đã nạp
    mov rax, 1
    mov rdi, 1
    ; rsi đã chứa địa chỉ (từ code của bạn)
    mov rdx, 6                    ; "Hello" + ký tự xuống dòng = 6 byte
    syscall
    
    ; Thoát
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức nền tảng

Tự luyện tập: Playground Assembly