Я запутался. Я объявляю переменную в функции main
и другую переменную в другой функции. Но в gdb я обнаружил, что программа посещает переменную в функции main
по регистру %esp
и посещает переменную в другой функции по регистру %ebp
. разве все это не должно посещаться функцией %ebp
? Или это скрытое правило, что посещение %esp
регистрируется в main
, которого я не знаю?
/* source_file.c */
#include <stdio.h>
void localfunc(void)
{
int local_in_func;
local_in_func = 0x21;
printf("local_in_func = %d\n", local_in_func);
}
int main(int argc, char **argv)
{
int local_in_main;
local_in_main = 0x97;
printf("local_in_main = %d\n", local_in_main);
return 0;
}
И его код дизассемблирования ниже:
(gdb) disassemble main
Dump of assembler code for function main:
0x08048407 <+0>: push %ebp
0x08048408 <+1>: mov %esp,%ebp
0x0804840a <+3>: and $0xfffffff0,%esp ; visit local_in_main by esp
0x0804840d <+6>: sub $0x20,%esp
0x08048410 <+9>: movl $0x97,0x1c(%esp)
0x08048418 <+17>: mov $0x8048524,%eax
0x0804841d <+22>: mov 0x1c(%esp),%edx
0x08048421 <+26>: mov %edx,0x4(%esp)
0x08048425 <+30>: mov %eax,(%esp)
0x08048428 <+33>: call 0x8048300 <printf@plt>
0x0804842d <+38>: mov $0x0,%eax
0x08048432 <+43>: leave
0x08048433 <+44>: ret
End of assembler dump.
(gdb) disassemble localfunc
Dump of assembler code for function localfunc:
0x080483e4 <+0>: push %ebp
0x080483e5 <+1>: mov %esp,%ebp
0x080483e7 <+3>: sub $0x28,%esp
0x080483ea <+6>: movl $0x21,-0xc(%ebp) ; visit local_in_func by ebp
0x080483f1 <+13>: mov $0x8048510,%eax
0x080483f6 <+18>: mov -0xc(%ebp),%edx
0x080483f9 <+21>: mov %edx,0x4(%esp)
0x080483fd <+25>: mov %eax,(%esp)
0x08048400 <+28>: call 0x8048300 <printf@plt>
0x08048405 <+33>: leave
0x08048406 <+34>: ret
End of assembler dump.
Мои инструменты:
ОС: убунту 12.04
скомпилировать: gcc версии 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
отладка: GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
%esp
в основной функции встроенным кодомasm
, и это приведет к тому, что я потерял свои локальные переменные в функцииmain
. Итак, как я могу решить эту проблему? Большое спасибо! 24.12.2014main
функции с помощьюC
кода, затем я изменяю%esp
регистр с помощью встроенногоasm
кода, а затем я пытаюсь использоватьC
код для посещения объявленной мной локальной переменной, но программа посещает локальную переменную с помощью%esp
, поэтому, прежде чем я изменю, например, переменная находится в-0xc(%esp)
, но теперь0xc(%esp)
не является местоположением переменной, потому что я изменил%esp
. Я не являюсь носителем английского языка, возможно, мое описание неясно, извините за это. Спасибо за ваш ответ искренне. 24.12.2014