int* pptr2 부분이 올바른 표현 방법이다. 포인터를 사용해서 넣을 경우 위와 같은 형식으로 어셈블리어가 구성된다. *ptr : ptr 변수 내부의 값이 가리키고 있는 값(즉, 변수 c의 값)ptr : ptr 변수 내부의 값(즉, 변수 c의 주소)&ptr : ptr 변수의 주소 값 int* pptr1 = *ptrmov eax, dword ptr [ptr] => 먼저 ptr 이 가리키는 값을 구하려면 일단 ptr 변수 내부의 값부터 알아야 한다. ebp를 기준으로 ptr 변수의 주소를 확인한 후 값을 구한다.mov ecx, dword ptr [eax] => ptr은 포인터이기 때문에 주소 값을 가지고 있다. 그리고 우리가 원하는 값은 주소 내부에 있기 때문에 eax에 저장된 주소를 기준으로 가져온다...
#--------------------------------------------------- Windows의 특권 레벨 ---------------------------------------------------------# Windows에서는 0~3까지의 특권레벨이 있다. 0은 커널, 1과 2는 디바이스 드라이버 레벨, 3은 유저 레벨을 나타낸다. 하지만 실제로 사용하는 특권레벨은 0과 3 정도이고 1과 2는 본 적이 없다. 세그먼트 레지스터를 갱신할 때는 특권레벨에 대해 조건을 만족해야만 한다. 특정 특권레벨을 가지고 수행되는 코드가 다른 데이터 세그먼트의 메모리를 참조하기 위해서는 그 데이터 세그먼트의 DPL이 현재 실행중인 CPL보다 수치적으로 크거나 같아야 참조할 수 있다.데이터 세그먼트 갱신..
#------------------------------------------------------- 기존 내용 정리 -------------------------------------------------------------#페이지 테이블 : 각각의 프로세스가 페이지 프레임을 통해 실제 메모리에 어떻게 매핑되는지를 나타내는 매핑 목록페이지 디렉토리 : 페이지 테이블만을 사용하여 페이징을 표현하기에는 너무 양이 어마어마하기 때문에 분담해서 저장하기 위해 한 번 더 쪼개어 페이지 테이블의 엔트리를 저장한 목록, 페이지 디렉토리가 없을 경우 하나의 프로세스마다 대략 1048576(1024*1024)개의 테이블 엔트리를 만들어야 한다. 이 경우 갯수가 너무 많아서 메모리 또한 더욱 복잡해 질거임. 다시 보는..