Với đoạn mã sau:Dấu ngoặc có nghĩa là gì trong x86 asm?
L1 db "word", 0
mov al, [L1]
mov eax, L1
gì các dấu ngoặc ([L1]) đại diện?
Với đoạn mã sau:Dấu ngoặc có nghĩa là gì trong x86 asm?
L1 db "word", 0
mov al, [L1]
mov eax, L1
gì các dấu ngoặc ([L1]) đại diện?
[L1]
nghĩa là nội dung bộ nhớ tại địa chỉ L1. Sau khi chạy mov al, [L1]
tại đây, thanh ghi al
sẽ nhận byte tại địa chỉ L1 (chữ 'w').
Dấu ngoặc có nghĩa là bỏ tham chiếu địa chỉ. Ví dụ:
mov eax, [1234]
nghĩa là, mov nội dung của địa chỉ 1234 sang EAX. Vì vậy:
1234 00001
EAX sẽ chứa 00001.
Như với nhiều ngôn ngữ lắp ráp, điều này có nghĩa gián tiếp. Nói cách khác, mov
tải đầu tiên al
với nội dung của L1
(byte 'w'
nói cách khác), chứ không phải địa chỉ.
thứ hai mov
thực sự tải eax
với địa chỉL1
và bạn có thể sau dereference rằng để có được hoặc thiết lập nội dung của nó của bạn.
Trong cả hai trường hợp đó, L1
được coi là địa chỉ khái niệm.
Họ có nghĩa là thay vì di chuyển giá trị của thanh ghi hoặc giá trị số L1
vào sổ đăng ký al
, đối xử với giá trị đăng ký hoặc giá trị số L1
như một con trỏ vào bộ nhớ, lấy nội dung của địa chỉ bộ nhớ, và di chuyển mà nội dung vào al
.
Trong trường hợp này, L1 là một vị trí bộ nhớ, nhưng cùng một logic sẽ được áp dụng nếu một tên đăng ký là trong dấu ngoặc:
mov al, [ebx]
Còn được gọi là tải.
Nó chỉ ra rằng thanh ghi phải được sử dụng làm con trỏ cho vị trí thực tế, thay vì hành động theo chính bản thân sổ đăng ký.
Direct memory addressing - al
sẽ được tải với giá trị nằm ở địa chỉ bộ nhớ L1
.
Đơn giản chỉ cần lấy bộ nhớ tại địa chỉ được đánh dấu bằng nhãn L1.
Nếu bạn thích C, sau đó nghĩ về nó như thế này: [L1]
cũng giống như *L1
điều này có thể gây nhầm lẫn vì trong C '* p' có nghĩa là _dereference p và ngừng truy xuất ký tự khi bạn sẽ đến' \ 0'_ và không chỉ _dereference char thứ nhất trong chuỗi/chuỗi được trỏ bởi p_ – user2485710
@ user2485710 Không, '* p' có nghĩa là dereference char được chỉ bởi' p'. Chuỗi không có gì để làm với điều này. – Navin
Phép toán thuộc loại này, chẳng hạn như [ebp]
, được gọi là memory operands.
Tất cả các câu trả lời ở đây là tốt, nhưng tôi thấy rằng không ai nói về sự báo trước trong sau này như một quy luật cứng nhắc - nếu dấu ngoặc, sau đó dereference, trừ khi đó là lea
hướng dẫn.
lea
là ngoại lệ đối với quy tắc trên. Nói rằng chúng tôi đã
mov eax, [ebp - 4]
Giá trị của ebp
được trừ 4 và dấu ngoặc chỉ ra rằng giá trị kết quả được thực hiện như là một địa chỉ và giá trị cư trú tại địa chỉ đó được lưu trữ trong eax
. Tuy nhiên, trong trường hợp lea
's được áp dụng khung sẽ không có nghĩa là:
lea eax, [ebp - 4]
Giá trị của ebp
được trừ 4 và giá trị kết quả được lưu trữ trong eax
. Lệnh này sẽ chỉ tính toán địa chỉ và lưu trữ giá trị được tính toán trong thanh ghi đích. Xem this post để biết thêm chi tiết.
Cảm ơn bạn đã trả lời, tôi bắt đầu học asm. Nếu tôi hiểu điều này một cách chính xác, "mov al, [L1]" sẽ di chuyển 'w' vào al, và "mov eax, L1" sẽ di chuyển địa chỉ của L1 thành eax. Đúng không? – joek1975
có. và nếu bạn đã làm 'mov ebx, L1 - mov al, [ebx]' thì 'al' sẽ là 'w' trong trường hợp đó. – Earlz
Trường hợp ngoại lệ cho điều này là LEA. –