Каково различие между MOV и ЛЕЕЙ?

Чтобы установить значение состояния в хранилище, мы должны взаимодействовать с Vuex api с помощью мутаций / коммитов.

Попытка установить состояние без мутации, это идет вразрез с дизайном Vuex (с управляемым хранилищем / состоянием)

Обычно попытка установить состояние без мутаций (скажем, внутри действия) приводит к ошибка, но я также считаю, что при получении состояния через '$ store.state' будет возвращено только состояние (и не будет возвращен экземпляр состояния)

Это сделано для поддержания неизменности во всем состоянии приложения [113 ]

116
задан Michael Petch 17 April 2018 в 01:55
поделиться

7 ответов

  • LEA означает загрузку действующего адреса
  • MOV означает загрузку значения

Короче говоря, LEA загружает указатель на элемент, который вы адресация, тогда как MOV загружает фактическое значение по этому адресу.

Цель LEA - позволить выполнить нетривиальное вычисление адреса и сохранить результат [для последующего использования]

LEA ax, [BP+SI+5] ; Compute address of value

MOV ax, [BP+SI+5] ; Load value at that address

Где есть являются просто задействованными константами, MOV (посредством вычислений констант ассемблера) иногда может перекрываться с простейшими случаями использования LEA .

144
ответ дан 24 November 2019 в 02:15
поделиться

ЛЕА (Исполнительный адрес Загрузки) является инструкцией shift-and-add. Это было добавлено к 8 086, потому что аппаратные средства там, чтобы декодировать и вычислить режимы адресации.

0
ответ дан 24 November 2019 в 02:15
поделиться

Как указано в других ответах:

  • MOV захватит данные в [1 112] адрес в скобках и месте что данные в целевой операнд.
  • LEA будет работать вычисление из адреса в скобках и месте, которое вычислило адрес в целевой операнд. Это происходит, на самом деле не выходя в память и получая данные. Работа, сделанная LEA, находится в вычислении "исполнительного адреса".

, поскольку память может быть обращена несколькими различными способами (см. примеры ниже), LEA иногда используется, чтобы добавить или умножить регистры вместе, не используя явное ADD или MUL инструкция (или эквивалентный).

, Так как все показывают примеры в синтаксисе Intel, вот некоторые в AT& T синтаксис:

MOVL 16(%ebp), %eax       /* put long  at  ebp+16  into eax */
LEAL 16(%ebp), %eax       /* add 16 to ebp and store in eax */

MOVQ (%rdx,%rcx,8), %rax  /* put qword at  rcx*8 + rdx  into rax */
LEAQ (%rdx,%rcx,8), %rax  /* put value of "rcx*8 + rdx" into rax */

MOVW 5(%bp,%si), %ax      /* put word  at  si + bp + 5  into ax */
LEAW 5(%bp,%si), %ax      /* put value of "si + bp + 5" into ax */

MOVQ 16(%rip), %rax       /* put qword at rip + 16 into rax                 */
LEAQ 16(%rip), %rax       /* add 16 to instruction pointer and store in rax */

MOVL label(,1), %eax      /* put long at label into eax            */
LEAL label(,1), %eax      /* put the address of the label into eax */
1
ответ дан 24 November 2019 в 02:15
поделиться

Инструкция MOV reg, addr означает чтение переменной, хранящейся по адресу addr, в регистр reg. Инструкция LEA reg, addr означает чтение адреса (а не переменной, хранящейся по адресу) в регистр reg.

Другой формой инструкции MOV является MOV reg, immdata, что означает чтение немедленных данных (т. Е. Константы) immdata в регистр. рег. Обратите внимание, что если addr в LEA reg, addr является просто константой (т. Е. Фиксированным смещением), то эта инструкция LEA по существу точно такая же, как эквивалентная инструкция MOV reg, immdata, которая загружает ту же константу, что и непосредственные данные.

26
ответ дан 24 November 2019 в 02:15
поделиться

Если вы указываете только литерал, разницы нет. Однако у LEA больше возможностей, и вы можете прочитать о них здесь:

http://www.oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-1.html#HEADING1-136

10
ответ дан 24 November 2019 в 02:15
поделиться

Это зависит от используемого ассемблера, потому что

mov ax,table_addr

в MASM работает как

mov ax,word ptr[table_addr]

, поэтому он загружает первые байты из table_addr и НЕ смещение до table_addr . Вместо этого вы должны использовать

mov ax,offset table_addr

или

lea ax,table_addr

, которые работают одинаково.

lea версия также работает нормально, если table_addr является локальной переменной, например

some_procedure proc

local table_addr[64]:word

lea ax,table_addr
10
ответ дан 24 November 2019 в 02:15
поделиться

Разница небольшая, но важная. Инструкция MOV - это «MOVe», фактически копия адреса, обозначенного меткой TABLE-ADDR. Инструкция LEA - это «Load Effective Address», которая является косвенной инструкцией, что означает, что TABLE-ADDR указывает на ячейку памяти, в которой находится адрес для загрузки.

Эффективное использование LEA эквивалентно использованию указателей в таких языках, как C,

-1
ответ дан 24 November 2019 в 02:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: