Tôi muốn biết những gì là sự khác biệt giữa các hướng dẫn là:Sự khác nhau giữa MOV và LEA là gì?
MOV AX, [TABLE-ADDR]
và
LEA AX, [TABLE-ADDR]
Tôi muốn biết những gì là sự khác biệt giữa các hướng dẫn là:Sự khác nhau giữa MOV và LEA là gì?
MOV AX, [TABLE-ADDR]
và
LEA AX, [TABLE-ADDR]
Nói tóm lại, LEA tải một trỏ đến mục bạn đang xử lý trong khi MOV tải giá trị thực tại địa chỉ đó.
Mục đích của LEA là cho phép một để thực hiện một tính toán địa chỉ không phải tầm thường và lưu trữ kết quả [để sử dụng sau]
LEA ax, [BP+SI+5] ; Compute address of value
MOV ax, [BP+SI+5] ; Load value at that address
Trong trường hợp có chỉ là hằng số liên quan, MOV (thông qua tính toán ổn định của lắp ráp đôi khi có thể xuất hiện chồng chéo với các trường hợp sử dụng LEA đơn giản nhất. Nơi hữu ích của nó là nếu bạn có một tính đa phần với nhiều địa chỉ cơ sở, vv
+1 cảm ơn lời giải thích rõ ràng, đã giúp tôi [answer] (http://stackoverflow.com/a/25824111/183120) một câu hỏi khác. – legends2k
Nó gây nhầm lẫn cho tôi rằng lea có "tải" trong tên và mọi người nói nó "tải" một địa chỉ tính toán vào sổ đăng ký, bởi vì tất cả các đầu vào để tính toán vị trí bộ nhớ là giá trị ngay lập tức hoặc thanh ghi. AFAICT lea chỉ thực hiện một tính toán, nó không tải bất cứ điều gì, nơi tải có nghĩa là chạm vào bộ nhớ? –
@josephGarvin IIRC tìm nạp cụm từ sẽ được áp dụng cho khía cạnh đó; Tải chỉ là cách bạn thay thế giá trị trong sổ đăng ký bằng thứ gì đó từ đầu. ví dụ. 'LAHF' là: _Load FLAGS vào AH register_. Trong CIL của CLR (là một máy tính trừu tượng dựa trên nền tảng xếp chồng cao hơn, thuật ngữ _load_ đề cập đến việc đặt một giá trị lên chồng thường và thường là 'l' ..., và' s' ... tương đương với nghịch đảo) . Những lưu ý này: https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/load.html) gợi ý rằng thực sự có những kiến trúc mà sự phân biệt của bạn không áp dụng. –
Nếu bạn chỉ định một nghĩa đen, không có sự khác biệt. LEA có khả năng hơn, mặc dù, và bạn có thể đọc về họ ở đây:
http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-1.html#HEADING1-136
Tôi đoán, với ngoại lệ mà trong GNU assembler nó không đúng khi nói đến nhãn trong phân đoạn .bss? AFAIR bạn có thể không thực sự 'leal TextLabel, LabelFromBssSegment' khi bạn có smth. như '.bss \t .lcomm LabelFromBssSegment, 4', bạn sẽ phải' movl $ TextLabel, LabelFromBssSegment', phải không? – JSmyth
@JSmyth: Đó là chỉ vì 'lea' yêu cầu một đích đến đăng ký, nhưng' mov' có thể có nguồn 'imm32' và đích đến bộ nhớ. Hạn chế này tất nhiên không cụ thể đối với trình biên dịch GNU. –
Ngoài ra, câu trả lời này về cơ bản là sai bởi vì câu hỏi đặt ra là hỏi về 'MOV AX, [TABLE-ADDR]', là một tải. Vì vậy, có một sự khác biệt lớn. Lệnh tương đương là 'mov ax, OFFSET table_addr' –
Nó phụ thuộc vào lắp ráp đã qua sử dụng, bởi vì
mov ax,table_addr
trong MASM hoạt động như
mov ax,word ptr[table_addr]
Vì vậy, nó tải các byte đầu tiên từ table_addr
và KHÔNG bù đắp cho table_addr
. Bạn nên sử dụng thay vì
mov ax,offset table_addr
hoặc
lea ax,table_addr
mà hoạt động giống.
lea
phiên bản cũng hoạt động tốt nếu table_addr
là biến cục bộ, ví dụ:
some_procedure proc
local table_addr[64]:word
lea ax,table_addr
cảm ơn rất nhiều, nó chỉ là tôi không thể đánh dấu nhiều hơn một như câu trả lời: ( – naveen
Sự khác biệt giữa các hướng dẫn x86 MOV và LEA chắc chắn nhất KHÔNG phụ thuộc vào người lắp ráp –
Sự khác biệt là tinh tế nhưng quan trọng. Lệnh MOV là một 'MOVe' một cách hiệu quả một bản sao của địa chỉ mà nhãn TABLE-ADDR đại diện cho. Lệnh LEA là 'Tải Địa chỉ Hiệu quả' là một hướng dẫn được chỉ định, có nghĩa là các điểm TABLE-ADDR trỏ đến một vị trí bộ nhớ mà tại đó địa chỉ tải được tìm thấy.
Sử dụng hiệu quả LEA tương đương với việc sử dụng con trỏ bằng các ngôn ngữ như C, vì vậy đây là hướng dẫn mạnh mẽ.
Tôi nghĩ câu trả lời này là điều khó hiểu nhất. "Lệnh LEA là" Địa chỉ hiệu quả tải "là một hướng dẫn được chỉ định, có nghĩa là TABLE-ADDR trỏ tới vị trí bộ nhớ địa chỉ để tải được tìm thấy. "Trên thực tế LEA sẽ tải địa chỉ, không phải nội dung của địa chỉ. Tôi nghĩ thực sự người hỏi cần được yên tâm rằng MOV và LEA có thể chồng lên nhau và thực hiện chính xác điều tương tự, trong một số trường hợp –
Lệnh MOV reg, addr có nghĩa là đọc một biến được lưu tại địa chỉ addr vào thanh ghi reg. Lệnh LEA reg, addr có nghĩa là đọc địa chỉ (không phải biến được lưu tại địa chỉ) vào thanh ghi reg.
Một hình thức khác của lệnh MOV là MOV reg, immdata có nghĩa là đọc dữ liệu ngay lập tức (tức làhằng số) immdata vào reg đăng ký. Lưu ý rằng nếu addr trong LEA reg, addr chỉ là hằng số (nghĩa là offset cố định) thì lệnh LEA về cơ bản giống hệt với reg reg tương đương, chỉ lệnh immdata tải cùng một hằng số như dữ liệu ngay lập tức.
Trong cú pháp NASM:
mov eax, var == lea eax, [var] ; i.e. mov r32, imm32
lea eax, [var+16] == mov eax, var+16
lea eax, [eax*4] == shl eax, 2 ; but without setting flags
Trong cú pháp MASM, sử dụng OFFSET var
để có được một mov-ngay lập tức thay vì một tải.
in Cú pháp của MASM chỉ trong cú pháp MASM, 'mov eax, var' là một tải, giống như' mov eax, [var] ', và bạn phải sử dụng' mov eax, OFFSET var' để sử dụng một nhãn như là một hằng số ngay lập tức . –
Rõ ràng, đơn giản và thể hiện những gì tôi đang cố gắng xác nhận. Cảm ơn. – JayArby
Về cơ bản ... "Di chuyển vào REG ... sau khi tính toán nó ..." nó có vẻ là tốt đẹp cho các mục đích khác cũng :)
nếu bạn chỉ cần quên đi rằng giá trị là một con trỏ bạn có thể sử dụng nó cho mã tối ưu hóa/giảm thiểu ... những gì bao giờ ..
MOV EBX , 1
MOV ECX , 2
;//with 1 instruction you got result of 2 registers in 3rd one ...
LEA EAX , [EBX+ECX+5]
EAX = 8
originaly nó sẽ là:
MOV EAX, EBX
ADD EAX, ECX
ADD EAX, 5
Yup, ['lea' là hướng dẫn thay đổi và thêm] (https://stackoverflow.com/questions/46597055/address-computation-instruction-leaq/46597375#46597375) sử dụng mã hóa và cú pháp máy tính toán-bộ nhớ , bởi vì phần cứng đã biết cách giải mã ModR/M + SIB + disp0/8/32. –
trùng lặp: http://stackoverflow.com/questions/1658294/x86-asm-whats-the-purpose-of-the-lea-instruction –
cảm ơn nick. Trước hết, tôi sẽ không tìm thấy câu trả lời cho câu hỏi này bằng cách nhìn vào liên kết đó. Ở đây tôi đang tìm kiếm một thông tin cụ thể, các cuộc thảo luận trong liên kết mà bạn cung cấp có nhiều tính chất hơn trong tự nhiên. – naveen
Tôi upvoted @ Nick của dup tuổi trước đây nhưng vtc'd chỉ bây giờ. Trên phản ánh, tôi đã quá vội vàng và bây giờ với naveen rằng a) câu hỏi khác không trả lời "sự khác biệt là gì" và b) đây là một câu hỏi hữu ích. Xin lỗi để naveen cho sai lầm của tôi - nếu chỉ tôi có thể hoàn tác vtc ... –