Я выполняю задание, связанное с программированием на языке C и ассемблере. Вот простая программа на языке C:
int multiply(int a, int b) {
int k = 4;
int c,d, e;
c = a*b ;
d = a*b + k*c;
return d;
}
И это оптимизированная сборка
_a$ = 8 ; size = 4
_b$ = 12 ; size = 4
_multiply PROC
mov eax, DWORD PTR _a$[esp-4]
imul eax, DWORD PTR _b$[esp-4]
lea eax, DWORD PTR [eax+eax*4]
ret 0
_multiply ENDP
Я хочу знать значение регистра eax после этой строки кода в сборке
lea eax, DWORD PTR [eax+eax*4]
Я знаю, что при добавлении целых чисел в сборку результат сохраняется в месте назначения. и когда мы умножаем, он сохраняется в eax. поэтому, если я вызову функцию умножения ( 3 , 8 ), значение регистра eax после этой строки должно быть 120. Я прав?
eax
после выполнения этой инструкции должно равнятьсяeax+eax*4
- person ForceBru   schedule 21.08.2019c
вeax
, то есть значениеa*b
.d = a*b + c*4
совпадает сd = c + c*4
(компилятор достаточно умен, чтобы понять это).lea eax, DWORD PTR [eax + eax*4]
загружаетeax
со значениемeax + eax*4
, которое равноc + c*4
, таким образом, желаемое возвращаемое значение функции. Тем не менее, я бы порекомендовал выполнить поиск в Интернете поx86 lea instruction
, так как вы найдете много информации о том, что он делает и почему. - person lurker   schedule 21.08.2019lea
? Если это так, обратитесь к Какова цель инструкции LEA?. - person Sander De Dycker   schedule 21.08.2019mul
илиimul
и результат идет в EDX:EAX. Когда вы используете обычный 2-операндimul
, это точно так же, какadd
. Вы можете делать такие вещи, какimul esi, edi
. (Это быстрее, потому что ему не нужно никуда записывать старшую половину, поэтому этот компилятор, похоже, MSVC, решил использоватьimul eax, [esp-4 + _b$]
вместо одного операндаimul dword ptr [esp-4 + _b$]
, хотя у него уже есть другой операнд в EAX и он было бы безопасно забить EDX) - person Peter Cordes   schedule 21.08.2019