SP : 레지스터가 스텍의 꼭대기
스텍의 데이터 구조 이해는 [접시닦기]
1. 새로 씻은 접시는 선반 위에 쌓아둔 접시더미 맨 위에 올려둔다(PUSH)
2. 그 다음 씻은 접시는 그 위에 올림(PUSH)
3. 음식을 담기 위해 맨 위 접시를 사용(POP)
========================================
범용 레지스터
EAX: 피연산자/연산결과의 저장소
EBX: DS segment 데이터인, 포인터
ECX: 문자열 처리 또는 루프인 카운터
EDX: I/O 포인터
ESI: DS 레지스터의 data segment 내의 어느 데이터를 가르키는 포인터, 문자열 처리에서 source 부분을 가리킴.
EDI: ES 레지스터의 data segment 내의 어느 데이터를 가르키는 포인터, 문자열 처리에서 destination 을 가리킴.
ESP: SS 레지스터의 Stack segment의 맨 꼭대기를 가리키는 포인터
EBP: SS 레지스터가 가리키는 스텍상의 한 데이터를 가리키는 포인터(basce pointer)
========================================
세그먼트 레지스터
CS: code segment
DS/ES/FS/GS: data segment
SS: stack segment
========================================
플래그 레지스터
상태, 컨트롤, 시스템의 집합체
시스템리셋시, 0x00000002의 값을 가지고,
1,3,5,15,22~31번 비트는 예약되어 사용X
@Status flags
CF: 연산수행에서 carry 혹은 borrow 발생시 1을 가진다. 덧셈연산시 bit bound를 넘어가거나 뺄샘을 하는데 빌려오는 경우.
PF: 연산결과 최하위 바이트값이 1이 짝수일 경우 1이 된다. 패리티 체크시 사용
AF: 연산 결과 캐리나 브로우가 3bit 이상일때 1이다.
ZF: 결과가 zero임, if문 같은 조건문이 만족시 set
SF: 연산 결과 최상위 비트값(=) singed 변수의 경우 양수이면 0, 음수이면 1을 가짐
OF: 정수형 결과값이 너무 큰 양수거나, 너무 작은 음수여서 피연산자의 데이터 타입에 다 들가지 못할경우 1
DF: 문자열처리에 있어서 1일경우, 문자열 처리 instruction이 자동으로 감소(highAddr->lowAddr), 0일 경우 자동으로 증가한다.
@System flags
IF: 프로세서에게 mask한 중단에 응답하려면 1을준다
TF: 디버깅할때 single-step 이려면 1을준다.
IOPL: 현재 수행중인 프로세스 또는 task 권한 레벨
- 프로세스권한 가르키는 CPL이 I/O Addr영역에 접근하기 위해서는 IOPL 보다 작거나 같아야한다.
NT: interrupt의 chain 제어, 1이 되면 이전 실행 task와 현재 task가 연결
RF: Exception debug 를 위해 프로세서 응답제어
VM: Virual-8086 모드를 사용하려면 1을 줌
AC: 비트와 CR0 레지스터의 AM비트가 set 되면 메모리 레퍼렌스의 alingment checking 가능하다.
VIF: IF flag의 가상이미지, VIP flag와 결합사용
VIP: 인터럽트가 팬딩 되었음을 가리킨다.
ID: CPUID instuction을 지원하는 CPU인지 알려줌
$gcc -S -o [Filename].asm [Filename].c
: -S 옵션으로, 어셈블리 코드로 컴파일을 한다.
0x//16진수 관련 내용
sub [뺄수], [뺄값] : 뺄값을 뺄수로 뺀다.
- 무엇을 뺀다는 의미(뺄수만큼 바이트의 공간이 생김)
lea [깂1], [값2] : 값1을 값2 주소를 복사
mov [값1], [값2] : 값1을 값2에 복사한다.
push [값] : 아래의 내용
- stack 포인터에 저장하면 4바이트 아래 가리킨다.
call [값] : 값의 명령을 수행하라는 것이다.
- call 명령은 함수 호출할때 사용되는 명령으로 함수 실행이 끝난다음 다시 이후 명령 할 수 있도록 이후 명령이 있는 주소를 스텍에 넣은다음 EIP에 함수의 시작 지점의 주소를 넣는다.
ret: 리턴주소는 POP되어 EIP에 저장, 스택은 4바이트 위로 증가
add [값2], [값1] : 값1의 스텍을 값2 바이트 줄인다
$gdb [Filename]
★스텍은 4바이트 단위로 자라난다.
★ 8바이트의 dummy가 들어가있다.
(gdb) break *[레지스터값]
(gdb) r : 실행 프로그램의 위치
(gdb) info register esp : 검색
쉘실행 execve()함수
:바이너리 형태의 실행 파일 또는 스크립트 파일을 실행 시키는 함수
execve [Filename], [인자포인터], [환경변수 포인터]
'끄적이기' 카테고리의 다른 글
멘탈이 강한 사람자들의 특징 (0) | 2014.01.04 |
---|---|
그린가드(GreenGuard) (0) | 2014.01.02 |
한국학생IT연합(KSIA) 지원 (0) | 2013.12.17 |
안드로이드 킵 URL (0) | 2013.12.02 |
EditPlus3 (에디터플러스3) (0) | 2013.09.20 |