Lea assembly là gì

  • LEA có nghĩa là tải địa chỉ hiệu quả
  • MOV có nghĩa là Giá trị tải

Nói tóm lại, LEA tải một con trỏ tới 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 người thực hiện phép tính địa chỉ không 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 chỉ có các hằng số liên quan, đôi khi MOV [thông qua các phép tính không đổi của trình biên dịch] đôi khi có thể xuất hiện trùng lặp với các trường hợp sử dụng đơn giản nhất của LEA. Nó hữu ích nếu bạn có một tính toán nhiều phần với nhiều địa chỉ cơ sở, v.v.

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 để lấy Mov-tức thì thay vì tải.

Lệnh MOV reg, addr có nghĩa là đọc một biến được lưu trữ tại địa chỉ addr vào reg reg. Lệnh LEA reg, addr có nghĩa là đọc địa chỉ [không phải biến được lưu trữ tại địa chỉ] vào đăng ký reg.

Một dạng khác của lệnh MOV là MOV reg, immdata có nghĩa là đọc dữ liệu tức thời [tức là hằng số] vào đăng ký reg. Lưu ý rằng nếu addr trong LEA reg, addr chỉ là hằng số [nghĩa là phần bù cố định] thì lệnh LEA về cơ bản giống hệt như một reg reg tương đương, lệnh imdata tải cùng hằng số như dữ liệu tức thời.

Nếu bạn chỉ xác định một nghĩa đen, không có sự khác biệt. LEA có nhiều khả năng hơn, tuy nhiên, và bạn có thể đọc về chúng ở đây:

//www.oopweb.com/Assugging/Document/ArtOfAssugging/Volume/Ch CHƯƠNG_6/CH06-1.html#HEADING1-136

Nó phụ thuộc vào trình biên dịch được 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 phải là phần bù cho table_addr. Bạn nên sử dụng thay thếmov ax,offset table_addr

hoặc làlea ax,table_addr

mà hoạt động như nhau.

lea phiên bản cũng hoạt động tốt nếu table_addr là một biến cục bộ, ví dụ:.some_procedure proc local table_addr[64]:Word lea ax,table_addr

Về cơ bản ... "Chuyển sang REG ... sau khi tính toán nó ..." có vẻ cũng tốt cho các mục đích khác :]

nếu bạn quên rằng giá trị là một con trỏ, bạn có thể sử dụng nó để tối ưu hóa/tối thiểu hóa mã ... những gì đã từng ..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

nguyên bản nó sẽ là:MOV EAX, EBX ADD EAX, ECX ADD EAX, 5

Video liên quan

Chủ Đề