일부 어셈블리 코드를 이해하려고하는데 몇 줄을 제외하고 대부분을 완료 할 수있었습니다. 내부에서 일어나는 일의 대부분을 이해할 수 있지만 코드의 시작과 끝에서 무엇이 (그리고 왜) 일어나고 있는지 완전히 이해할 수는 없습니다. 누군가가 이것에 대해 밝힐 수 있습니까?일부 어셈블리 문의 목적 이해
int main() {
int a, b;
a = 12;
b = 20;
b = a + 123;
return 0;
}
분해 된 버전 :
8048394:8d 4c 24 04 lea 0x4(%esp),%ecx ; ??
8048398:83 e4 f0 and $0xfffffff0,%esp ; ??
804839b:ff 71 fc pushl -0x4(%ecx) ; ??
804839e:55 push %ebp ; Store the Base pointer
804839f:89 e5 mov %esp,%ebp ; Initialize the Base pointer with the stack pointer
80483a1:51 push %ecx ; ??
80483a2:83 ec 4c sub $0x4c,%esp ; ??
80483a5:c7 45 f8 0c 00 00 00 movl $0xc,-0x8(%ebp) ; Move 12 into -0x8(%ebp)
80483ac:c7 45 f4 14 00 00 00 movl $0x14,-0xc(%ebp) ; Move 20 into -0xc(%ebp)
80483b3:8b 45 f8 mov -0x8(%ebp),%eax ; Move [email protected](%ebp) into eax
80483b6:83 c0 7b add $0x7b,%eax ; Add 123 to [email protected]
80483b9:89 45 f4 mov %eax,-0xc(%ebp) ; Store the result into [email protected]c(%ebp)
80483bc:b8 00 00 00 00 mov $0x0,%eax ; Move 0 into eax
80483c1:83 c4 10 add $0x10,%esp ; ??
80483c4:59 pop %ecx ; ??
80483c5:5d pop %ebp ; ??
80483c6:8d 61 fc lea -0x4(%ecx),%esp ; ??
스택의 위치를 그림으로 그리는 것이 도움이됩니다. –
댓글에서 opcodes에 대한 영어 이름 만 쓰면 도움이되지 않습니다. 더 높은 수준으로 만들어보십시오. 그리고 만약 당신이 정말로 dissasembly로부터 뭔가를 배우고 싶다면, 컴파일러가 아닌 인간의 코드를 사용해보십시오. – ruslik
일반적으로 시작과 끝 부분은 일반적인 스택 설정 코드입니다. 할당 및 정렬 등. – zdav