.386
.MODEL FLAT
PUBLIC _LINUX
.CODE
_LINUX PROC NEAR32
push ebp
mov ebp, esp
pushfd ; efl 를 스택에 미리 저장
mov ebx, esp ;ebx = esp
add ebx, 8 ;main의 old esp
mov esp, [ebp+8] ;contest 의 시작 주소
add esp, 40 ;contest 의 끝 주소
pushad ; eax, ecx, edx, ebx, esp, ebp, esi, edi
mov eax, [ebp+4] ;eax = eip(return address)
push eax ;eip값을 구조체 멤버 eip에 대입
mov eax, [ebp-4] ;eax = efl
push eax ;efl값을 구조체 멤버 efl에 대입
add esp, 24 ;구조체멤버 ebx에 점프
push ebx ;old esp값을 구조체 멤버 esp에 대입
mov eax, [ebp] ;eax = old ebp
push eax ;old ebp값을 구조체 멤버 ebp에 대입
mov esp, ebp
pop ebp
ret
_LINUX ENDP
END
#include <stdio.h>
typedef struct _contest
{
int efl;
int eip;
int edi;
int esi;
int ebp;
int esp;
int ebx;
int edx;
int ecx;
int eax;
} contest;
void LINUX(contest *);
void printReg(contest *stpReg);
int main ()
{
contest stReg ={0x12345678,
0x12345678,
0x12345678,
0x12345678,
0x12345678,
0x12345678,
0x12345678,
0x12345678,
0x12345678,
0x12345678};
LINUX(&stReg);
printf ("eax : %d\n", stReg.eax);
printf ("ebx : %d\n", stReg.ebx);
printf ("ecx : %d\n", stReg.ecx);
printf ("edx : %d\n", stReg.edx);
printf ("esp : %d\n", stReg.esp);
printReg(&stReg);
return 0;
}
void printReg(contest *stpReg)
{
printf ("EAX VALUE : 0x%08X ECX VALUE : 0x%08X\n", stpReg->eax, stpReg->ecx);
printf ("EDX VALUE : 0x%08X EBX VALUE : 0x%08X\n", stpReg->edx, stpReg->ebx);
printf ("ESP ADDRESS VALUE : 0x%08X EBP ADDRESS VALUE : 0x%08X\n", stpReg->esp, stpReg->ebp);
printf ("ESI ADDRESS VALUE : 0x%08X EDI ADDRESS VALUE : 0x%08X\n", stpReg->esi, stpReg->edi);
printf ("EIP ADDRESS VALUE : 0x%08X EFL ADDRESS VALUE : 0x%08X\n", stpReg->eip, stpReg->efl);
return;
}
'코스웨어 > 13년 스마트컨트롤러' 카테고리의 다른 글
0923 어셈블리 수업내용 _ 이수현 (0) | 2013.09.23 |
---|---|
9월 16일 어셈블리 숙제 - 석주원 (0) | 2013.09.17 |
20130916어셈블리 레지스터 값-문예진 (4) | 2013.09.16 |
어셈블리 레지스터값 출력하기-한성원 (0) | 2013.09.16 |
[stack] 코드의 스텍영역 살펴보기 - 0911 정리 (0) | 2013.09.16 |
20130916 어셈블리 - 이수현 (0) | 2013.09.16 |
20130916 어셈블리 - 전영기 (0) | 2013.09.16 |
ASM 프로시저를 이용한 레지스터값 출력!! (0) | 2013.09.16 |