lea ecx, [rax + 5] - что загружает?
где то в коде написано вот что.
mov rax, [rbp+var_38]
mov [rbp+var_18], rax
mov eax, [rbp+var_3C]
shl eax, 3
lea ecx, [rax+5]
очень странный код для меня. похоже на какую то манипуляцию с битами. но что для меня странно, так это то, что var_38 это указатель на выделенную память и я могу предположить, что этот адрес будет каждый раз разный при перезапуске программы. потом еще верхняя часть rax не меняется, а меняют eax и потом с помощью lea ecx, [rax+5] хотят получить адрес. и вот еще одна странность. это же 64 битный код. как тогда можно загружить адрес из rax + 5 в регистр ecx? и что значит rax + 5 - это типа сишного такого кода &val[5]?
Ответы (1 шт):
Вы не показываете достаточно контекста, приходится гадать. Скорее всего, var_38, var_18, var_3C это offset, то есть коснтанта, програмно генерируемое имя локальной переменной.
mov rax, [rbp+var_38]
mov [rbp+var_18], rax
Это присваивание локальных переменных, типа x = y; Значение из var_38 копируется в var_18.
mov eax, [rbp+var_3C]
Локальная переменная копируется в eax.
shl eax, 3 не нуждается в комментариях.
lea ecx, [rax+5]
Работает в соответствии с LEA, Intel Assembly Reference:
Operand size 32, Address Size 64. 64-bit effective size is calculated, and the lower 32 bits of the address are stored in the requested 32-bit register destination.
Для чего - возможно код, следующий за этими строками, поможет разобраться. Может, это заготовка для какого-нибуть цикла, типа rep stos.