mov esp, ebp
그것이 어디를 가리 키도록 esp
변경 :이 방법을 컴파일 및 링크
(gdb)
Program received signal SIGILL, Illegal instruction.
0xbffff49a in ??()
:
SECTION .text
global strrev
strrev:
push ebp
mov ebp, esp
push esi
push edi
push ebx
// doing things with al, bl, ecx, edi, and esi registers here
// restore registers and return
mov esp, ebp
pop ebx
pop edi
pop esi
pop ebp
ret
오류 :에만 관련 코드를 게시하려고
mov ebp, esp
이 실행되었을 때. 그것은 esi
, edi
및 ebx
을 스택에 넣기 전에 더 이상 팝업 할 수 없기 때문입니다. 이후로 스택이 잘못되어 ret
이 원하는대로 작동하지 않습니다.
mov esp, ebp
명령어를 삭제할 수 있습니다. 이와 같이 스택 포인터를 복원하는 것은 루틴에서 스택 포인터를 변경할 때 (예 : 스택을 원하는 정렬로 이동하거나 가변 길이 배열을위한 공간을 만들 때) 필요한 경우에만 필요합니다. 스택이 간단하게 처리된다면, 밀어 넣는 것의 역순으로 팝업됩니다. 스택에 대한 변수가 변경된 경우 ebp
이 아니라 다른 위치로 포인터를 복원해야 ebx
, edi
및 esi
을 팝업 할 수 있습니다.
디버거에서 팝업되는 부분과 반환 할 곳을주의 깊게 살펴보십시오. –