Я новый ученик, и я не хорошо пишу по-английски. Я прочитал из многих источников, что для доступа к локальной переменной в процедуре первый локальный доступ осуществляется с использованием [ebp-4]
. Я делаю эту программу для отображения EAX
, и только одна информация (string
) локальная. Что случилось, [ebp-4]
не работал. Я перешел на [ebp-8], и он работает. Почему так?Доступ к локальной строке через EBP
mov eax,0x0ffffc345
push eax
call Disp_EAX
call exit
Disp_EAX:
push ebp
mov ebp,esp
sub esp,12 ;for string to display EAX
cld
lea edi,[ebp-8] ;why can't [ebp-4]?
mov esi,8
mov edx,[ebp+8]
mov eax,0
extract:
shld eax,edx,4
add al,0x30
cmp al,0x39
jle continue
add eax,7
continue:
stosb
dec esi
cmp esi,0
je done
rol edx,4
xor al,al
jmp extract
done:
mov eax,0
stosb
lea esi,[ebp-8]
cinvoke printf,esi
add esp,12
mov esp,ebp
pop ebp
ret
Надеюсь, вы можете мне помочь.
Дополнение: Если я использовал [ebp-4]
, мой цикл программ непрерывно, но отображается правильно. Я действительно смущен.
Спасибо за хорошее объяснение Шут. Таким образом, доступ к локальным данным не всегда начинается с [ebp-4]. Это было очень запутанное чтение из некоторых веб-материалов. Это все говорит. или это просто я понял, что это совершенно неправильно. – kent
Локальные данные заканчиваются на 'ebp'. Первый локальный, если это целое число в 4 байта, находится в 'ebp-4', а второй - в' ebp-8', так как стек растет. Локали занимают область памяти, заканчивающуюся на 'ebp', начиная с' esp', которая представляет собой некоторое отрицательное смещение (размер всех локальных пользователей) из 'ebp'. – Jester
Да. я узнаю, что большинство ссылок предполагают, что локальные данные должны быть 4 байта. очень редко я нахожу ee, я нахожу примеры, используя строку большего размера. Я думаю, что это вызывает путаницу. 4 байта - это стандарт де-факто для примеров стека. еще раз спасибо – kent