2013-04-12 2 views
0

main.c에서 호출되는 어셈블리에서 함수를 구현하는 프로젝트로 작업하고 있습니다. C의 서명 함수 선언은 void strrev(char *str) ;입니다. Ret 명령이 잘못된 명령 오류를 제공하고 있습니다. 왜? 이 일을 처음하는 시간입니다.불법적 인 명령 취소

nasm -f elf -g strrepl.asm 
nasm -f elf -g strrev.asm 
gcc -Wall -g -c main7.c 
gcc -Wall -g strrepl.o strrev.o main7.o 
+1

디버거에서 팝업되는 부분과 반환 할 곳을주의 깊게 살펴보십시오. –

답변

3

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, ediebx을 스택에 넣기 전에 더 이상 팝업 할 수 없기 때문입니다. 이후로 스택이 잘못되어 ret이 원하는대로 작동하지 않습니다.

mov esp, ebp 명령어를 삭제할 수 있습니다. 이와 같이 스택 포인터를 복원하는 것은 루틴에서 스택 포인터를 변경할 때 (예 : 스택을 원하는 정렬로 이동하거나 가변 길이 배열을위한 공간을 만들 때) 필요한 경우에만 필요합니다. 스택이 간단하게 처리된다면, 밀어 넣는 것의 역순으로 팝업됩니다. 스택에 대한 변수가 변경된 경우 ebp이 아니라 다른 위치로 포인터를 복원해야 ebx, ediesi을 팝업 할 수 있습니다.

+0

Gotcha, 내 생각에 맞는 말이야. 나는 집에 돌아 왔을 때 이것을 더 보게 될 것이다. – b15

+0

이제 리턴을 지나쳤지만, main.c 프로그램이 역전 된 문자열을 출력 할 때 빈 문자열을 출력합니다 – b15

관련 문제