2010-01-08 41 views

Trả lời

34

[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').

+4

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

+4

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

+3

Trường hợp ngoại lệ cho điều này là LEA. –

5

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.

1

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.

1

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.

0

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ý.

25

Đơ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

+0

đ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

+11

@ 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

20

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ác vấn đề liên quan