2010-10-23 29 views

Trả lời

70

Leal, hay tên đầy đủ lea là "địa chỉ hiệu quả Load" và nó không chính xác này: Nó thực hiện một tính toán địa chỉ.

Trong ví dụ của bạn tính toán địa chỉ rất đơn giản, bởi vì nó chỉ bổ sung thêm một bù đắp để EBX và lưu trữ kết quả trong eax:

eax = ebx + 0x10

lea có thể làm nhiều hơn nữa. Nó có thể thêm thanh ghi, nhân các thanh ghi với các hằng số 2, 4 và 8 để tính toán địa chỉ của các từ, số nguyên và tăng gấp đôi. Nó cũng có thể thêm một bù đắp.

Lưu ý rằng lea là đặc biệt theo cách nó sẽ không bao giờ sửa đổi cờ, ngay cả khi bạn sử dụng nó như là một bổ sung đơn giản như trong ví dụ trên. Các trình biên dịch đôi khi khai thác tính năng này và thay thế một phần bổ sung của một trình đơn để giúp trình lên lịch. Nó không phải là không phổ biến để xem hướng dẫn lea làm số học đơn giản trong mã biên dịch vì lý do đó.

+0

Rất tốt được giải thích cho trình biên dịch ..thực sự –

+0

Ngoài ra, như đã đề cập, có thể sử dụng leal để thực hiện các phép toán số học. Nhưng nó không thiết lập các mã điều khiển. Vì vậy, không nên được sử dụng cho nhảy có điều kiện hoặc di chuyển có điều kiện. –

+0

Câu trả lời tuyệt vời! – Eloff

4

lea là viết tắt của "địa chỉ hiệu quả tải"; nó là một cách để sử dụng các chế độ địa chỉ phức tạp của bộ lệnh IA32 để làm số học. Hậu tố l là một cách để phân biệt kích thước của toán hạng lệnh trong cú pháp của GNU như, mà bạn có trên hộp Linux của bạn.

Vì vậy, trong ngắn hạn, có, đó là một loại hướng dẫn bổ sung. Nó cũng có thể xử lý phép nhân bằng 2, 4 hoặc 8 cùng một lúc.

Xem thêm this related question (nơi họ đang sử dụng cú pháp của Intel để thảo luận về lệnh tương tự):

0

Để thêm vào Nils Đáp lại,

Là một bồi dưỡng, chế độ addresing trong IA32 lắp ráp thường có dạng:

IO (Rb, Ri, s), trong đó:

IO = ngay lập tức offset

Rb = cơ sở ký

Ri = Index Đăng ký

s = Scaling Yếu tố {1, 2, 4, 8}

Vì vậy, các địa chỉ hiệu quả được tính như * IO + [Eb] + [Ei] s

Leal trông tương tự với các hướng dẫn khác như movl, nhưng nó hơi đặc biệt. Thay vì đọc từ nguồn đến đích, nó sao chép địa chỉ hiệu quả của nguồn đến đích.

Vì vậy, nó có thể được sử dụng để tạo con trỏ cho các tham chiếu bộ nhớ sau này, và cũng cho các phép tính số học cơ bản, như Nils đã chỉ ra.

Ví dụ:

hãy đăng ký% edx chứa một giá trị của x

Leal 1 (% edx,% edx, 8),% eax

sẽ được tải địa chỉ có hiệu lực 1 + x + 8 * x = 1 + 9x để đăng ký% eax.

Về bản chất, các hoạt động:

Lealnguồn, điểm đến =>điểm đến = địa chỉ củanguồn

Nếu bạn quen với C, nó là tương đương với:

char * b = & a;

nơi địa chỉ của char một được gán cho char trỏ b

hơn ví dụ:

Hãy đăng ký% eax giá trị giữ x, và đăng ký% ecx giá trị giữ y

Leal (% eax,% ecx, 4),% edx sẽ chỉ định giá trị x + 4y để đăng ký% edx

leal 0xB (,% ecx, 5),% edx sẽ gán giá trị 0xB + 5y = 11 + 5y đến% edx

Leal (% eax,% eax, 2),% eax sẽ gán 3x giá trị đăng ký% eax

Hope this helps

2

GNU như 2.18 docs

https://sourceware.org/binutils/docs-2.18/as/i386_002dMemory.html

AT & T: -4 (% ebp), Intel: [ebp - 4]

và sau đó là Cú pháp của Intel tự giải thích.

Quan trọng hơn, các tài liệu cũng giải thích các trường hợp chung:

Một cú pháp Intel tham khảo bộ nhớ gián tiếp của mẫu

section:[base + index*scale + disp] 

được dịch sang cú pháp AT & T

section:disp(base, index, scale) 

nơi cơ sở và chỉ mục là cơ sở 32 bit tùy chọn và thanh ghi chỉ mục, phân là chuyển tùy chọn và tỷ lệ, lấy giá trị 1, 2, 4 và 8, nhân chỉ mục để tính toán địa chỉ của toán hạng

Mọi thứ có chút lộn xộn tại AT & T khi chúng tôi bỏ qua một số phần của địa chỉ, ví dụ: -4(%ebp), nhưng với các ví dụ trong tài liệu, chúng tôi có thể dễ dàng suy ra tất cả các trường hợp cú pháp.

Để thực sự hiểu điều gì đang diễn ra, tôi khuyên bạn nên xem hướng dẫn được mã hóa như thế nào. Đây là một hướng dẫn tốt: http://www.c-jump.com/CIS77/CPU/x86/lecture.html Khi bạn thấy điều đó, nó sẽ trở nên rõ ràng lý do tại sao một số phần của địa chỉ có thể được bỏ qua, và những gì mỗi hình thức sẽ biên dịch.

Các vấn đề liên quan