2012-06-26 29 views
12

Tôi là một chút nhầm lẫn về sự khác biệt giữaHướng dẫn lắp ráp LEAL làm gì?

leal -4(%ebp), %eax  

movl -4(%ebp), %eax 

Ai đó có thể giải thích điều này với tôi?

+2

liên quan: http://stackoverflow.com/questions/4003894/leal-assembler-instruction – mensi

+2

và loại lặp lại: http://stackoverflow.com/questions/1658294/x86-asm-whats-the-purpose-of-the-lea-instruction – mensi

+1

Đầu mối có trong tên. Tải địa chỉ hiệu quả chỉ tải địa chỉ. – harold

Trả lời

25

LEA (tải địa chỉ hiệu quả) chỉ cần tính địa chỉ của toán hạng, nó thực sự không coi trọng nó. Hầu hết thời gian, nó chỉ thực hiện một phép tính như một phép nhân và cộng gộp kết hợp, ví dụ, lập chỉ mục mảng.

Trong trường hợp này, nó thực hiện phép trừ số đơn giản: leal -4(%ebp), %eax chỉ cần gán cho số %eax đăng ký giá trị %ebp - 4. Nó tương đương với một lệnh sub đơn lẻ, ngoại trừ sub yêu cầu đích đến giống với một trong các nguồn.

Hướng dẫn movl, ngược lại, truy cập vị trí bộ nhớ tại %ebp - 4 và lưu trữ giá trị đó vào %eax.

+0

Tôi đã có sự hiểu biết đó sau một thời gian khi tôi thấy rằng nó thiết lập đăng ký eax cho kết quả. –

1

Tương đương với LEA trong cú pháp của Intel, tải địa chỉ hiệu quả (dài?).

3

Nếu bạn muốn xem xét điều này trong điều khoản của một ngôn ngữ lập trình khác nhau, sau đó:

int var; 
[ ... ] 
func (var, &var); 

đánh giá như sau (Linux x86_64) mã lắp ráp:

[ ... ] 
    4: 8b 7c 24 0c    mov 0xc(%rsp),%edi 
    8: 48 8d 74 24 0c   lea 0xc(%rsp),%rsi 
    d: e8 xx xx xx xx   callq ... <func> 
[ ... ]

Kể từ %rdi/%rsi là các đối số 1 st/2 nd, bạn có thể thấy rằng lea ... truy xuất địa chỉ&var của biến số, trong khi mov ... tải/lưu trữ giá trị var của cùng một giá trị.

I.e. trong hội đồng, việc sử dụng lea thay vì mov tương tự như sử dụng địa chỉ của nhà điều hành & trong C/C++, chứ không phải giá trị() của biến đó.

lea có nhiều công dụng hơn thế, nhưng bạn đã hỏi rõ về sự khác biệt giữa hai loại.

Để minh hoạ: mov với một toán hạng bộ nhớ luôn luôn thực hiện một truy cập bộ nhớ (tải hoặc cửa hàng), trong khi các toán hạng bộ nhớ để lea được chỉ đơn thuần coi là con trỏ số học - tức là địa chỉ được tính toán và giải quyết nhưng không có quyền truy cập bộ nhớ xảy ra tại bản thân hướng dẫn.Hai:

lea 1234(%eax, %ebx, 8), %ecx 
movl (%ecx), ecx 

kết quả trong tương tự như:

movl 1234(%eax, %ebx, 8), %ecx 

trong khi những điều sau:

leal (%eax, %eax, 4), %eax 

nhân với giá trị trong %eax với năm.

0

Cả LEA và MOV đều có thể tải đăng ký với giá trị bù trừ cho ví dụ .

MOV cũng có thể chuyển nội dung của vị trí bộ nhớ sang thanh ghi, LEA không thể. Cả LEA & MOV có thể tính toán "offsets hiệu quả" mà có thể được sử dụng để làm toán hiệu quả hơn nhiều

+0

Điều này là không thực sự hữu ích, so với các câu trả lời khác đã được lên trong ba năm. Tôi khuyên bạn nên thử trả lời các câu hỏi tương đối mới, hoặc những câu hỏi không có câu trả lời được chấp nhận, trừ khi bạn có một cái gì đó thực sự mới lạ và hữu ích để thêm vào. –

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