@Soultaker

Как отличается работа lea от mov в данном примере?

short int A[20];
short int B[20];
...
lea eax, A;
lea ebx, B;

и второй пример:
short int *A = new short int[20];
short int *B = new short int[20];
...
mov eax, A;
mov ebx, B;


Оба кода делают одно и то же. Как я понимаю, вместо пересылки данных из ячейки памяти в регистр(как делает MOV) команда LEA загружает в регистр адрес данных. Но исходя из этого не могу объяснить, почему работают и как работают эти примеры. Помогите, объясните. Спасибо.
  • Вопрос задан
  • 3541 просмотр
Пригласить эксперта
Ответы на вопрос 2
lea вставляет в регистр указатель на данные, mov копирует данные
mov eax,1; eax = 1
mov eax,VarName ; выдаст ошибку если размер VarName больше чем eax

У вас же в примере все логично, в 1 случае создается массив, через lea в регистр кладется адрес на массив, во стором же случае мы создаем массив и получаем его адрес, и уже его помещаем в регистр
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Давайте посмотрим, какой код будет сгенерирован в каждом из случаев:
@_main	proc	near
	push      ebp
	mov       ebp,esp
; short int A[20];
	add       esp,-40 
	push      ebx
; asm lea eax, A;
 	lea	 eax, word ptr [ebp-40]
; return A[0];
	movsx     eax,word ptr [ebp-40]

@_main	proc	near
	push      ebp
	mov       ebp,esp
; short int *A = new short int[20];
	add       esp,-4
	push      ebx
	push      40
	call      @$bnwa$qui
	pop       ecx
	mov       dword ptr [ebp-4],eax
; mov eax, A;
 	mov	 eax, dword ptr [ebp-4]
; return A[0];
	mov       eax,dword ptr [ebp-4]
	movsx     eax,word ptr [eax]

То есть, в первом случае переменная A - непосредственно массив, а во втором она хранит адрес массива.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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