조립을 처음하다. 나는이 다음 함수 조립에누군가가 어셈블리 코드를 설명해 주시겠습니까?
int foo(char *argv[])
{
char buf[256];
bar(argv[1], buf);
}
-
0x08048473 <foo+0>:push %ebp
0x08048474 <foo+1>:mov %esp,%ebp
0x08048476 <foo+3>:sub $0x118,%esp
0x0804847c <foo+9>:mov 0x8(%ebp),%eax
0x0804847f <foo+12>:add $0x4,%eax
0x08048482 <foo+15>:mov (%eax),%edx
0x08048484 <foo+17>:lea -0x100(%ebp),%eax
0x0804848a <foo+23>:mov %eax,0x4(%esp)
0x0804848e <foo+27>:mov %edx,(%esp)
0x08048491 <foo+30>:call 0x8048454 <bar>
0x08048496 <foo+35>:leave
0x08048497 <foo+36>:ret
사람이 나에게 설명 할 수주십시오? 왜 거기에 하위 280이 있습니까? 256 바이트는 스택에 확실히 할당됩니다. 나는 나머지를 설명 할 수 없다.
감사합니다. 그것은 매우 분명했습니다.그래서 처음 두 줄은 함수 반환 값이 저장된 곳입니다. 반환 값이 함수 매개 변수 다음에, 호출 된 함수의 로컬 변수 앞에 저장되지 않았습니까? – user220201
반환 값은 일반적으로 기존 레지스터 (x86 프로세서의 % eax)에서 교환됩니다. 여기서 당신은'return'을 가지지 않기 때문에 어셈블리 코드는'% eax'에 대해 아무 것도하지 않습니다 : 호출자는'foo()'가 그 시점에서'% eax'의 값을 포함하는 값을 반환한다는 것을 알게 될 것입니다. –
bar()가 돌아 오는 지점에 대해 물어보기를 바랍니다. bar가 반환되면 foo()가 실행을 계속하는 지점입니다. 저장되어있는 곳은 어디입니까? – user220201