어셈코드에서 c함수를 콜할때 스택에 관련해서...질문입니다.
글쓴이: goblin0228 / 작성시간: 목, 2005/08/11 - 4:13오후
안녕하세요.
요즘 어셈이랑 c 연결하는거 공부하는데요 안되는게 있어서 질문올립니다.
어셈코드는요..
segment .text [extern _start] [bits 32] start: cli mov eax, SysDataSelector mov ds, eax mov es, eax mov ss, eax mov fs, eax mov gs, eax call _start jmp $
이거구요. SysDataSelector 는 gdt테이블 작성되어있습니다..
글고 c코드가...
int start() { // while(1); return 0; }
요겁니다... 간단하죠..-_-;;
저기서 while문장 넣으니 에러가 안나더라구요..그니까 리턴시가 문제가 되는것같긴한데.. 스택이 뭐가 더쌓이거나 덜 쌓았거나 그런것같습니다.
gcc컴파일할때 친구가 알려줘서.. gcc -c main.c --save-temps 해줬더니 위 c 코드가
.file "main.c" .section .text .globl _start _start: pushl %ebp movl %esp, %ebp movl $0, %eax popl %ebp ret .ident "GCC: (GNU) 4.0.0"
요렇게 어셈되어있더라구요..
ret가 있길래. 위 어셈 코드에 call _start 위에
push dword SysDataSelector push esp push dword SysCodeSelector lea eax, [returnpoint] push eax
요거 집어넣어줘봤는데 안되더라구요.. returnpoint:는 call _start 바로 아래로했습니다.
아직 초보라.. 잘모르겠네요... 디버그하기도 어렵고... 도움말좀 부탁드립니다.. (--)(__)
Forums:
cygwin 인가요?함수 이름앞에 "_"가 붙는 것으로 보아 그런것
cygwin 인가요?
함수 이름앞에 "_"가 붙는 것으로 보아 그런것 같습니다만,
mov 의 인자도 순서가 바뀌어 있는 것으로 보아
처음 작성하신 코드는 gcc가 이해하는 의 어셈블이 아닌것 같군요.
---
http://coolengineer.com
댓글 달기