* 헥사뷰어 장착!
우선 메모리 디스플레이 기능을 구현한다.
예전에 만들었던 핵사뷰어 프로그램을 가져다 쓰기로 한다.
(라이브러리라니 후훗...)
달라진 점은 예전에는 *를 써서 접근했지만,
이제는 어셈블리 함수로 1Byte값을 가져오는게 달라짐.
우선 어셈블리 함수 MD를 만들어준다.
인자를 보이드 포인터로 하여 아무곳이나
접근 가능하도록 해준다. 반환값은 당연히 unsigned char이다
만약 반환값이 signed char가 되면 부호확장이 일어날 우려가 있다.
우선 C에서 선언을 해준다.
unsigned char MD(void *);
이제 어셈블리를 작업해주도록 한다.
외부에서 볼수 있도록 PUBLIC 선언을 해주도록 한다.
PUBLIC _MD
이제 함수 몸통을 만든다.
push ebp
mov ebp, esp
push ebx
mov ebx, [ebp + 8] ;memory indirection
;인자를 ebx로 들고옴
mov eax, 0
mov al, [ebx] ;1byte만 쓴다. al따문에 1byte만 들고옴
pop ebx
mov esp, ebp
pop ebp
ret
인자의 주소로가서 1Byte 뜯어온다.
여기서 중요한점은 al에 저장한다는 점.
1byte만 필요하기 때문에 al을 사용한다.
그러나 최적화는 4Byte단위이기 때문에 보호확장이 일어날 수 있다.
하여 C에서 선언할때 반환형을 unsigned char로 선언했다.
이제 MD함수를 완성했다.
헥사뷰어에서 포인터 *(ucp + icnt) 대신에 MD(ucp + icnt)를 써주면 된다.
이제 보고싶은곳의 주소를 입력하면 약 16 * 16byte만큼 메모리를 보여 Dream
헥사뷰어 장착 완료
* LDST를 만들어보자
현재 우리가 구현하려는 LDST 어셈블리 함수는
일종의 타임머신 역활을 하게된다.
후에 프로그램을 load시키고 난 후, 프로그램 초기 상태로 돌아가기 위해
레지스터 값을 복원 해야한다.
STST함수에서 레지스터값을 r 구조체에 백업했기 때문에
메모리에 잇는 값을 레지스터로 옮겨야 한다.
일단 C소스에서 선언을 해준다.
void LDST(Context *);
이제 어셈블리 코딩을 한다.
어짜피 호출전 상태로 돌아가는게 아니기 때문에 Entry Code는 필요없다.
_LDST PROC NEAR32
mov esp, [esp + 4]
popfd ;EFL 복원
pop eax ;eax = 리턴어드레스
mov ebx, [esp + 12]
mov [ebx - 4], eax ;EIP 기준은 main esp로 잡아준다
;EBP를 기준으로 하면 다음실행에 뻑난다.
popad
mov esp, [esp - 20]
sub esp, 4
ret
_LDST ENDP
처음에 new ebp를 기준으로 접근했는데
값이 자꾸 변하는 것을 감지하였다.
그래서 스택에 적재된 esp값을 기준으로 움직였다.
다만 esp값은 바뀌면 안되기때문에
또 하나의 레지스터가 필요했다. (ebx)
ebx를 움직여 EIP값을 리턴어드레스에 삽입하였다.
<코딩 과정>
이제 GO를 입력하면
프로그램 시작상태로 돌아가 블로킹 함수에서 멈추게 된다.
(프로그램 흐름제어!)
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
[Assembly]2012/09/13 작업 일지(어셈블리 주소 버그) - by. 이창현 (0) | 2012.09.13 |
---|---|
IT 엑스포 사진... (2) | 2012.09.12 |
LDST 자세한 정리 (1) | 2012.09.12 |
지하철 안에서의 컵라면 아침 식사 =_= (4) | 2012.09.12 |
프로젝트 모니터 (0) | 2012.09.11 |
LDST.obj (0) | 2012.09.11 |
IT expo 사진 (0) | 2012.09.11 |
IT엑스포 후기 (2) | 2012.09.10 |