달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2011. 7. 15. 09:30

0715) Windows Azure 퍼옴2011. 7. 15. 09:30


http://www.architecturejournal.org/wiki/Windows_Azure_Platform

퍼오기가 뭐해서 링크를 그대로 겁니다.
:
Posted by 투잌
2011. 7. 12. 18:19

0712) 디자인 패턴 2011. 7. 12. 18:19

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2011. 1. 3. 16:16

0103) 퍼옴 / CreateFile, WriteFile, ReadFile 퍼옴2011. 1. 3. 16:16


[ 파일 입출력 ]

 

파일을 열고 출력하는 간단한 예제


test.txt 라는 파일을 만들고 그 내용을 "I am Hacker" 이라고 한다음 이 파일을

컴파일하려는 실행파일과 같은 폴더에 넣고 컴파일후 실행파일을 실행해보면

파일 입출력 예를 확인 할수 있다.

-------------------- CreateFile 예 --------------------
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("First");  //윈도우 이름 및 타이틀바에 등록할 문자열


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;

 g_hInst = hInstance;

 //------------ 아래 부분은 윈도우 클래스를 설정해주는 것이다. --------------------

 WndClass.cbClsExtra = 0;
 WndClass.cbWndExtra = 0;
 WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance = hInstance;
 WndClass.lpfnWndProc = WndProc;
 WndClass.lpszClassName = lpszClass;
 WndClass.lpszMenuName = NULL;
 WndClass.style = CS_HREDRAW | CS_VREDRAW;

 //------------ 위 부분은 윈도우 클래스를 설정해주는 것이다. --------------------

 RegisterClass(&WndClass);   //  <-- 여기서는 위에서 설정한 클래스를 등록한다.

 hWnd = CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);   // 설정하고 등록한 윈도우를 생성한다.

 ShowWindow(hWnd,nCmdShow);   //생성한 윈도우를 출력..(이 함수를 호출하지않으면 윈도우가 보이지 않는다.)

 while(GetMessage(&Message,NULL,0,0))   //사용자가 종료하기 전까지 반복해서 메세지 처리를 호출한다.
 {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }

 return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) //여기서 실제로 메시지를 처리한다.
{
 HANDLE hFile = NULL;
 char buf[1024] = {0};
 DWORD dwByte = 0;

 switch(iMessage)
 {
 case WM_LBUTTONDOWN:
  hFile = CreateFile(TEXT("test.txt"),GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);

  if(hFile == INVALID_HANDLE_VALUE) MessageBoxA(0,"CreateFile Error","OK",0);
 
  if( ReadFile(hFile,buf,1024,&dwByte,NULL) == FALSE ) MessageBoxA(0,"ReadFile Error","OK",0);

  MessageBoxA(0,buf,"Read",MB_OK);


  CloseHandle(hFile);
  return 0;
  


 case WM_DESTROY:

  PostQuitMessage(0);
  return 0;
 }

 return DefWindowProc(hWnd,iMessage,wParam,lParam);  //프로그래머가 처리하지 않은 나머지 동작을 기본처리로 넘긴다.
}


-------------------------------------------------------

※ 파일핸들에 파일을 연결하면 그 순간부터 메모리에는 입출력 버퍼라는 공간이
 
    생기고 이것을 이용해서 하드디스크에 저장한다고 한다. 그래서 만약 파일을 다 사용하고나서

    파일핸들을 닫지 않는다면 입출력 버퍼가 계속 남아 있기 때문에 시스템의 자원이 낭비가 된다.

     물론 프로그램이 끝날때는 자동으로 반환되지만 아직 끝나지 않고 실행을 더해야 한다면

      문제를 일으킬수도 있다.

---------------------------------------------------------------------------

 

=================================================================================


[ CreateFile ]

 

------------------함수 원형------------------

HANDLE CreateFile (
 LPCTSTR lpFileName,
 DWORD deDesiredAccess,
 DWORD deShareMode,
 LPSECURITY_ATTRIBUTES lpSecurityAttributes,
 DWORD dwCreationDisposition,
 DWORD dwFlagsAndAttributes,
 HANDLE hTemplateFile);

---------------------------------------------

많은 인자를 갑고 있다. 파일 뿐만 아니라..

파이프, 메일 슬롯, 콘솔, 직렬, 병렬 포트 등의 오브젝트를 만들거나 열기도 하는 아주

복잡한 함수다.  간단하게 인수를 확인해보자

---------------------------------------------------

인자설명 :

 

===== lpFileaName =====

열거나 만들고자 하는 파일의 완전경로를 문자열로 지정한다. 완전경로 이므로 드라이브, 디렉토리,

파일명, 확장자가 한꺼번에 들어갈 수 있으며 네트워크 경로까지 지정할 수도 있다.

문자열의 길이는 MAX_PATH 이하여야 한다. MAX_PATH의 길이는 운영체제 버전에 따라

달라지겠지만 일단은 260이라고 생각하면 된다. 완전 경로뿐만 아니라 UNC까지 지원하므로

"\\서버\공유명\디렉토리\파일" 형식으로 공유된 파일을 열 수 있고

\\122.233.69.180\뭐뭐 식으로 IP를 직접 지정하면 지구상의 어떤 파일도 열 수 있다.

물론 이렇게 되려면 해당 서버에 접근할 수 있는 권한이 있어야 한다.

 

===== dwDesiredAccess =====

파일의 액세스 타입, 즉 파일로부터 데이터를 읽을 것인지 쓸것인지를 지정한다. 파일로부터 데이터를

읽기만 하면 GENERIC_READ 플래그를 주고 쓰기만 하면 GENERIC_WRITE 플래그를 주되

읽기도 하고 쓰기도 할 것이면 두 플래그를 OR 연산자로 연결하면 된다.

이외에 Win32의 다양한 엑스스 권한 플래그를 줄 수 있으나 파일 입출력을 할 때는

위에 보이는 두 플래그만 사용해도 충분한다.

 

===== dwShareMode =====

열려진 파일의 공유모드를 지정한다. 이 인수가 0 이면 파일은 공유되지 않으며 이미 열려진

파일을 또 열 수 없게 된다. 공유하고자 할 경우 다음 세 가지 중 하나를 지정한다.

다음 장에서 각 플래그에 따라 어떤 효과가 있는지 예제를 만들어 볼 것이다.

----------------------------------------------
플래그   설명
----------------------------------------------
FILE_SHARE_DELETE NT에서만 쓸수있으며 삭제 엑세스에 대해서만 파일을 열수 있다.

FILE_SHARE_READ  읽기 모드로 열 때만 파일을 열 수 있다.

FILE_SHARE_WRITE  쓰기 모드로 열 때만 파일을 열 수 있다.


===== lpSecurityAttributes =====

리턴된 핸들을 차일드 프로세스로 상속할 것인지 아닌지를 지정하는

SECURITY_ATTRIBUTES 구조체의 포인터이다. 사용하지 않을 경우 NULL을 지정한다.

 

===== dwCreationDisposition =====

만들고자 하는 파일이 이미 있을 경우, 또는 열고자 하는 파일이 없을 경우의 처리를 지정한다.

즉 일종의 비정상적인 상황에 대한 처리 지침이라고 할 수 있는데 다음 플래그 중 하나를 지정한다.

----------------------------------------------
플래그   설명
----------------------------------------------
CREATE_NEW 새로운 파일을 만들되 만약 지정한 파일이 이미 있으면 만들지 않는다.

CREATE_ALWAYS 새로운 파일을 만들되 만약 지정한 파일이 이미 있으면 기존의 파일을 삭제하고
  다시 만든다. 이때 파일의 속성은 다시 설정된다.

OPEN_EXISTING 이미 있는 파일을 열되 만약 파일이 없으면 에러 코드를 되돌린다.

OPEN_ALWAYS 파일을 열되 만약 없으면 새로 만든다.

TRUNCATE_EXISTING 파일을 열고 파일의 크기를 0으로 만든다. 이 플래그를 쓰려면
  GENERIC_WRITE 모드로 파일을 열어야 한다.
--------------------------------------------------------------

어떤 플래그를 사용할 것인가는 아주 신중하게 선택해야 한다. 이 플래그를 잘못 선택했다가는

멀쩡하던 파일이 새로 만들어질 수도 있고 있지도 않은 파일을 만든 후 있다고 우기는 이상한 사태가

발생할 수도 있다. 예를 드렁 사용자가 선택한 그래픽 파일을 보여주는 프로그램에서 그래픽 파일을

OPEN_ALWAYS 로 열었다고 해 보자. 그러면 CreateFile은 파일이 없으면 만든 후 핸들을 반환하므로

이 프로그램은 사용자가 선택한 파일이 진짜 그래픽 파일인줄 알게 될 것이며 당연히 그래픽은 제대로

출력될 리가 없다.

이때는 없으면 없다고 에러 코드를 번환하는 OPEN_EXISTING을 사용하는 것이 옯다. 생성할 때도

마찬가지로 이미 파일이 있을 경우 덮어쓰고 새로 만들 것인지, 에러를 반환할 것인지 잘 결정해야

한다. 에러를 리턴하지 않고 파일을 덮어써 버리면 기존의 존재하던 파일이 불시에 파괴되는 사고가

발생할 수도 있다. 플래그 뒤에 ALWAYS가 있는 것들은 무조건이라는 뜻이며 그렇지 않은 플래그는

비정상적인 상황일 때 에러를 리턴한다는 차이가 있다.


===== dwFlagsAndAttirbutes =====

이 인수는 파일의 속성과 여러 가지 옵션을 설정한다. 우선 파일의 속성에는 다음 플래그 중

원하는 것들을 OR 연산자로 묶어줄 수 있다.

----------------------------------------------
속성   설명
----------------------------------------------
FILE_ATTRIBUTE_ARCHIVE 아카이브 속성

FILE_ATTRIBUTE_HIDDEN 숨은 파일

FILE_ATTRIBUTE_NORMAL 아무 속성도 가지지 않은 보통파일. 이 플래그는 반드시
   단독으로 사용되어야 한다.

FILE_ATTRIBUTE_OFFLINE 연결되지 않은 저장 장치에 있어 즉시 사용할 수 없는 파일

FILE_ATTRIBUTE_READONLY 읽기 전용

FILE_ATTRIBUTE_SYSTEM 운영체제가 배타적으로 사용하는 파일

FILE_ATTRIBUTE_TEMPORARY 임시 저장소에 저장되는 파일, 이 속성의 파일은 디스크에 저장
   되지 않고 메모리에 저장되므로 입출력 속도가 빠르다. 사용후
   반드시 지워야한다.

----------------------------------------------------------

파일 속성 플래그 외에 다음과 같은 옵션을 OR 연산자로 묶어서 같이 지정할 수 있다.

다음 플래그 외에 파이프와 함께 사용하는 몇 개의 옵션들도 있으나 이는 생략하였다.

굉장히 고급 플래그들이다.

----------------------------------------------
속성   설명
----------------------------------------------
FILE_FLAG_WRITE_THROUGH 데이터 출력시 캐시를 통해 곧바로 디스크로출력한다.
   이 플래그를  지정하면 플러쉬가 더 빨라진다.

FILE_FLAG_OVERLAPPED 비동기 입출력을 행한다.

FILE_FLAG_NO_BUFFERING 버퍼나 캐시 없이 파일을 연다.

FILE_FLAG_RANDOM_ACCESS 임의 접근 파일임을 알린다.

FILE_FLAG_SEQUENTIAL_SCAN 순차 접근 파일임을 알린다. 이상의 두 플래그는 시스템이
   캐시를 최적화하는데 도움을 줄 뿐이며 이 플래그를 지정했다고
   해서 반드시 순차 입출력만 할 수 있는 것은 아니다.

FILE_FLAG_DELETE_ON_CLOSE 핸들이 닫힐 때 파일을 삭제한다.

FILE_FLAG_BACKUP_SEMANTICS 백업이나 리스토어를 위해 파일이 열리거나 만들어질 것을 지시한다.

FILE_FLAG_POSIX_SEMANTICS    POSIX 규칙대로 파일을 액세스한다. 이 플래그로 만들어진 파일은
   도스나 16비트 윈도우즈에서 읽을 수 없다.

FILE_FLAG_OPEN_REAPRSE_POINT  NTFS의 reparse를 금지시킨다.

FILE_FLAG_OPEN_RECALL 원격 저장 장치에서 사용하는 플래그이다.

----------------------------------------------------------------------

 

===== hTemplateFile =====

새로 만들고자 하는 파일의 추가 속성을 지원하는 템플릿 파일의 핸들을 지정한다 윈95/98은

이 인수를 지원하지 않으며 큰 실용이 없으므로 이 인수는 통상 사용되지 않는다 NULL로 지정하는 것이

보통이다.

----------------------------------------------------------------------

 

===== 리턴 값 =====

파일을 열거나 만들기에 성공했다면 파일의 핸들을 리턴한다. 어떤 이유로 파일 열기에 실패하면

INVALID_HANDLE_VALUE 를(을) 리턴하는데 이 함수가 리턴하는 값은 반드시 점검해 보아야 한다.

멀티 태스킹 환경에서 파일이란 있다가도 금방 사라질 수 있는 존재이기 때문에 입출력 과정 전반에

걸쳐 에러 처리를 섬세하게 해야 한다. 주의할 것은 이 함수가 실패했을 때 리턴하는

INVALID_HANDLE_VALUE 값은 -1로 지정되어 있다는 점이며  0 이 아니라는 것을 항상 생각해야 한다.

그래서 흔 하던 습관대로 if(hFile == NULL) 이렇게 비교하는 것은 틀린 에러 처리다 상식과 틀리므로

꼭 기억하기 바란다.


========================================================================


[ 파일 쓰기 ]

 

파일에 데이터를 슬 때는 다음 함수를 사용한다.

------------------- 파일 쓰기 ------------------

BOOL WriteFile(
 HANDLE hFile,
 LPCVOID lpBuffer,
 DWORD nNumberOfBytesToWrite,
 LPDWORD lpNumberOfBytesWritten,
 LPOVERLAPPED lpOverlapped);


인자
  - hFile : 대상 파일 핸들
  - lpBuffer : 데이터가 들어갈 버퍼
  - nNumberObBytesToWrite : 쓰고자하는 바이트 수
  - lpNumberOfBytesWritten : 실제로 쓰여진 바이트 수가 저장되기때문에 DWORD형 포인터
  - lpOverlapped : 비동기 입출력을 할때 사용한다 보통 NULL로 지정

----------------------------------------------------

파일 읽기도 위의 WriteFile 함수와 거의 동일하다. 그래서 아래에서

WriteFile 함수의  예제를 확인해보자

---------------------- WriteFile 함수 예 --------------------------

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("First");  //윈도우 이름 및 타이틀바에 등록할 문자열


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;

 g_hInst = hInstance;

 //------------ 아래 부분은 윈도우 클래스를 설정해주는 것이다. --------------------

 WndClass.cbClsExtra = 0;
 WndClass.cbWndExtra = 0;
 WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
 WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
 WndClass.hInstance = hInstance;
 WndClass.lpfnWndProc = WndProc;
 WndClass.lpszClassName = lpszClass;
 WndClass.lpszMenuName = NULL;
 WndClass.style = CS_HREDRAW | CS_VREDRAW;

 //------------ 위 부분은 윈도우 클래스를 설정해주는 것이다. --------------------

 RegisterClass(&WndClass);   //  <-- 여기서는 위에서 설정한 클래스를 등록한다.

 hWnd = CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
  CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);   // 설정하고 등록한 윈도우를 생성한다.

 ShowWindow(hWnd,nCmdShow);   //생성한 윈도우를 출력..(이 함수를 호출하지않으면 윈도우가 보이지 않는다.)

 while(GetMessage(&Message,NULL,0,0))   //사용자가 종료하기 전까지 반복해서 메세지 처리를 호출한다.
 {
  TranslateMessage(&Message);
  DispatchMessage(&Message);
 }

 return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) //여기서 실제로 메시지를 처리한다.
{
 HANDLE hFile = NULL;
 char buf[1024] = "I am Hacker!!\n";
 DWORD dwByte = 0;

 switch(iMessage)
 {
 case WM_LBUTTONDOWN:
  hFile = CreateFile(TEXT("c:\\windows\\temp\\test.txt"),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);

  if(hFile == INVALID_HANDLE_VALUE) MessageBoxA(0,"CreateFile Error","ok",0);

  if( WriteFile(hFile,buf,sizeof(buf),&dwByte,NULL) == FALSE )
   MessageBoxA(0,"WriteFile Error","ok",0);

  CloseHandle(hFile);
  return 0;
  


 case WM_DESTROY:

  PostQuitMessage(0);
  return 0;
 }

 return DefWindowProc(hWnd,iMessage,wParam,lParam);  //프로그래머가 처리하지 않은 나머지 동작을 기본처리로 넘긴다.
}

'퍼옴' 카테고리의 다른 글

0715) Windows Azure  (0) 2011.07.15
0712) 디자인 패턴  (0) 2011.07.12
0101) 비주얼 스튜디오 단축키  (0) 2011.01.01
퍼옴) C 프로그래머가 알아야 할 어셈블리.  (0) 2010.11.28
어셈블리 명령어  (0) 2010.11.28
:
Posted by 투잌
2011. 1. 1. 13:55

0101) 비주얼 스튜디오 단축키 퍼옴2011. 1. 1. 13:55


디버그/빌드
F5 : 디버그 시작
F9 :디버그 브렉포인트 설정
Ctrl-F9 : 현위치 설정된 브렉포인트 해제
Ctrl-Shift-F9 : 모든 브렉포인트 해
Shift-F5 : 디버그 빠져나오기
Ctrl-F10 : 커서가 있는곳까지 실행
Shift-F11 : 현 함수를 빠져나감.
Shift+Ctrl+B :  전체 빌드(프로젝트가 여러개있을경우 모두 빌드)
Alt+B, C : 해당 프로젝트만 정리.
Alt+B, U : 해당 프로젝트만 빌드.

창관련
Shift+Alt+Enter : 전체 창 (토글 됨)
F4 : 속성창 보여준다.
Ctrl+Alt+X : 리소스에디터 툴박스창
Ctrl+Alt+K : 작업목록 창.
Ctrl-K, Ctrl-H : 바로가기 설정. ( 작업목록 창에서 확인가능 )
Ctrl-K,K : 북마크 설정 / 해제
Ctrl-K,L : 북마크 모두 해제
Ctrl-K,N : 북마크 다음으로 이동
Ctrl-K,P : 북마크 이전으로 이동
Ctrl-K,C : 선택한 블럭을 전부 코멘트
Ctrl-K,U : 선택한 블럭을 전부 언코멘트(코멘트 해제)
Ctrl-F3 : 현재 단어 찾기
  -> F3 : 다음 찾기
Ctrl-F7 : 현 파일만 컴파일
Ctrl-Shift-B : 전체 프로젝트 빌드
Ctrl-F5 : 프로그램 시작
Ctrl-i : 일치하는 글자 연속적으로 찾기
Ctrl+ - (대시문자), Ctrl+Shift+ -  :
Ctrl-F12 : 커서위치 내용의 선언으로 이동
F12 : 커서위치 내용의 정의로 이동
Shift+Alt+F12 : 빠른기호찾기
F12 : 기호찾기
-----------------------------------------------------------------------------------------
Ctrl-M, Ctrl-L : 소스파일의 함수헤더만 보이기 (구현부는 감추고) (토글 키)
Ctrl-M, Ctrl-M : 현재 커서가 위치한 함수를 접는다/편다. (토글 키)
Ctrl-F : 찾기 대화상자
Ctrl-H : 바꾸기 대화상자
Ctrl-Shift-F : 파일들에서 찾기 대화상자
Ctrl-Shift-H : 파일들에서 바꾸기 대화상자
Ctrl-G : 해당 줄로 가기 (별로 필요없음)
Ctrl-K,Ctrl-F : 선택된 영역 자동 인덴트 (VS6의 Alt-F8기능)
Ctrl-] :괄호({,}) 쌍 찾기 : 괄호 앞이나 뒤에서 눌러서 닫거나, 여는 괄호이동
Ctrl-Shift-Spacebar : 함수이름편집중 툴팁으로나오는 함수와매개변수설명이 안나올경우, 강제로 나오게
alt-LButton ->Drag : 원하는 영역의 블럭을 세로로 잡기
Ctrl+Shift+V (히스토리 붙이기) : Ctrl + V와는 달리 클립보드에 있는 복사된내용을 돌아가면서 붙여준다.
Ctrl-Z : 이전으로 되돌리기
Ctrl-Shift-Z : 되돌렸다, 다시 복구하기

'퍼옴' 카테고리의 다른 글

0712) 디자인 패턴  (0) 2011.07.12
0103) 퍼옴 / CreateFile, WriteFile, ReadFile  (0) 2011.01.03
퍼옴) C 프로그래머가 알아야 할 어셈블리.  (0) 2010.11.28
어셈블리 명령어  (0) 2010.11.28
1125) 어셈블리 기초지식  (0) 2010.11.25
:
Posted by 투잌
2010. 11. 28. 19:26

퍼옴) C 프로그래머가 알아야 할 어셈블리. 2010. 11. 28. 19:26

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2010. 11. 28. 19:19

어셈블리 명령어 2010. 11. 28. 19:19

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2010. 11. 25. 10:22

1125) 어셈블리 기초지식 퍼옴2010. 11. 25. 10:22



1. 어셈블리란?

  - 어셈블리어(assembly, 문화어: 아쎔블러언어) 는 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급언어이다.

기계어는 실제로 컴퓨터 CPU가 읽어서 실행할 수 있는 0 1로 이루어진 명령어의 조합이다. 이러한 각 명령어에 대해 사람이 알아보기 쉬운 니모닉 기호(mnemonic symbol)를 정해 사람이 좀 더 쉽게 컴퓨터의 행동을 제어할 수 있도록 한 것이 어셈블리 언어이다.

예를 들어,

10110000 01100001   

x86 계열 CPU의 기계어 명령이고, 이것을 어셈블리어로 옮겨 쓰면 다음과 같다.

mov  al, 061h

명령어 mov는 영어 move를 변형한 니모닉이며, al CPU안에 있는 변수를 저장하는 레지스터의 하나이다. 그리고, 061h 16진수 61 (즉 십진수 97, 이진수 01100001)이다. 이 한 줄의 뜻은 16진수 61 al레지스터에 넣으라는 뜻이며, 1 0의 반복인 기계어보다 사람이 혼동없이 이해하기 한결 쉽다. 어셈블리어는 이러한 문장들로 구성된다.

어셈블리어를 기계어로 번역하는 것이어셈블러”(assembler)이며, 거꾸로 기계어를 어셈블리어로 바꾸는 것은디스어셈블러”(disassembler)이다. 고급언어와는 달리 어셈블리어는 간단한 문장에 대해 기계어와 일대일 대응 관계가 있지만, 자주 쓰이는 몇 명령은 둘 이상의 기계어 명령을 묶어 하나의 어셈블리 명령어에 대응시키기도 한다.

컴퓨터 아키텍처마다 사용하는 기계어가 달라지며, 따라서 기계어에 대응되어 만들어지는 어셈블리어도 각각 다르게 된다. 컴퓨터 CPU마다 지원하는 오퍼레이션의 타입과 개수는 제각각이며, 레지스터의 크기과 개수, 저장된 데이터 형의 표현도 각기 다르다. 모든 범용 컴퓨터는 기본적으로 동일한 기능을 수행하지만, 기능을 어떤 과정을 거쳐 수행할지는 다를 수 있으며, 이런 차이는 어셈블리어에 반영되게 된다.

게다가 단일 명령 집합에 대해 여러 니모닉과 신택스가 대응될 수 있다. 그런 경우에는 제조사가 만든 문서에서 쓰이는 것이 가장 자주 쓰이게 된다.

 

 2. 어셈블러와 링커

- 어셈블러는 어셈블리 언어로 작성된 소스 코드 프로그램을 기계어로 변환하는 유틸리티 프로그램이다. 링커(linker)는 어셈블러가 생성한 파일들을 하나의 실행 프로그램으로 합치는 유틸리티이다. 디버거(debugger)는 프로그램 실행 동안 프로그램을 단계적으로 실행하고 레지스터와 메모리를 살펴보게 한다.

 

 3. 어셈블리 언어의 이식성

- 고급 언어와 어셈블리 언어의 중요한 차이는 이식성을 다루어야 한다는 것이다. 소스 프로그램을 컴파일하여 다양한 컴퓨터 시스템에서 실행될 수 있는 언어를 이식성이 있다고 말한다.

 어셈블리 언어는 특정 프로세서 계열용으로 만들어 졌기 때문에 이식성이 없다. 오늘날 많은 수의 다른 어셈블리 언어들이 널리 사용되고 있으며 각 어셈블리 언어는 하나의 프로세서 계열에 기반을 두고 있다. 어셈블리 언어에서의 명령어는 컴퓨터의 구조와 직접 대응되거나 마이크로코드 해독기라고 하는 프로세서 내에 있는 프로그램에 의해서 실행되는 동안 번역될 수도 있다.

 

 4. 어셈블리언어의 규칙

- 어셈블리 언어의 대부분의 규칙은 목표 프로세서와 기계어의 물리적 제한에 바탕을 둔다. 따라서 c++이나 java보다 적은 규칙을 가지고 있다. c++ 이나 java는 저수준 데이터 접근을 못하는 대신에 예기치 않은 논리 오류를 줄이도록 하기 위한 구문 규칙을 가지고 있다. 어셈블리 언어는 고급 언어가 가지고 있는 제한을 쉽게 넘어설 수 있다. 예를 들어 java와 어셈블리 언어의 메모리 접근방식은 java JNI클래스를 사용 c서브루틴을 호출하여 자바의 제한을 넘어 작업할 수 있지만 작업한 프로그램은 유지보수에 어려움을 느낀다 하지만 어셈블리 언어는 어떠한 메모리 주소라도 접근할 수 있다. 이러한 이유로 어셈블리 언어 프로그래머가 디버깅에 많은 시간을 소모한다.

 

 5. 가상기계

   - 컴퓨터는 여러 개의 레이어로 구성되는데 각 레이어는 상위 수준 명령어 집합에서 하위 수준 명령어 집합으로 변환하는 레이어를 나타낸다.




 6. 데이터 표현

1) MSB,LSB

  

 - 2진수 한 자리를 비트(bit)라 부르며 비트는 오른쪽에서 0부터 시작하여 왼쪽으로 증가하면서 번호가 부여된다. 왼쪽에 있는 비트를 최상위 비트(most significant bit : MSB)라고 하며 오른쪽에 있는 비트를 최하위 비트(Least significant bit : LSB)라고 한다.

이 포스팅은 어셈블리 언어 제 5판|교보문고 의 내용을 요약한 것입니다. 더 자세한 내용은 서적을 참고하세요
:
Posted by 투잌
2010. 11. 25. 09:26

1124) 어셈블리와 레지스터의 개념 퍼옴2010. 11. 25. 09:26

[출처] |어셈블리 개념| 레지스터 정리 및 개념|작성자 좋은하루




1. 레지스터란?

- CPU 바로 안에 있는 고속 저장 장소이며 일반 메모리보다 훨씬 빠른 속도로 접근되도록 설계되었다. 예를 들어 루프 처리가 속도에 최적화될 때에 루프 카운터는 변수가 아니라 레지스터에 저장된다. 기본적인 프로그램 실행 레지스터는 8개의 범용 레지스터와 6개의 세그먼트 레지스터,프로세서 상태 플래그 레지스터(EFLAGS)와 명령어포인터가 있다.

그림 1) 32-bit Generel-Purpose Register

 

 

[표 1] - 특별한 용도의 레지스터

 

특징

EAX

* 곱셈과 나눗셈 명령어에서 자동적으로 사용된다.

ECX

* CPU에 의해 자동적으로 루프카운터로 사용된다.

EBP

* 고급언어에서 스택에 있는 함수 매개 변수와 지역 변수를 참조하기 위해서 사용된다. EBP는 고급 수준의 프로그래밍이 아니라면 일반적인 계산과 데이터 전송에 사용하지 말아야 한다.

ESP

* 스택에 있는 데이터의 주소를 지정한다. ESP는 보통의 계산과 데이터 전송에는 거의 사용되지 않는다.

ESI, EDI

* 고속 메모리 전송 명령어에서 사용한다.

 

EIP

* 명령어 포인터 레지스터는 실행할 다음 명령어의 주소를 포함한다. 어떤 기계어 명령어는 EIP를 조작하여 프로그램을 새 위치로 분기하게 한다.

EFLAGS

* EFLAGS레지스터는 CPU의 동작을 제어하거나 CPU연산의 결과를 반영하는 개별적인 2진수 비트들로 구성된다.

* 세그먼트 레지스터 : 실제모드에서 세그먼트 레지스터는 세그먼트라고 하는 미리 할당된 메모리 영역의 시작 주소를 가리킨다. 보호모드에서는 세스먼트 서술자 테이블에 대한 포인터를 갖는다.

 

- 위의 표에서 확인할 수 있듯이 범용레지스터는 계산과 데이터 전송에 주로 사용되고 다음 그림처럼 각 레지스터 하나의 32비트 값이나 두 개의 16비트 값으로 다룰 수 있다.

 

그림 2) 범용 레지스터의 16BIT와 32BIT

 

 

- 나머지 범용 레지스터는 하위 16비트에 대해서만 특정한 이름을 갖는다

 

그림 3) 범용 레지스터의 16BIT

 

 

1) EFLAGS - 32bit(4byte)이며 각 레지 레지스터 bit 마다 의미를 가지고 있고 1 또는 0의 값을 가지며 On/Off 혹은 True/False를 표시 합니다. 일부 bit는 시스템에서 직접 세팅하고, 일부 bit는 프로그램에서 사용된 명령의 수행결과에 따라 세팅됩니다.

* 플래그는 1일 때에 설정되고 0일 때에 해제 또는 리셋된다.

 

[표 2] - 플래그 레지스터의 각 비트의 의미

 

특징

CF : 캐리 플래그

* 연산한 결과, 최상의 비트로부터의 높은 자리로 자리올림(캐리 CARRY) 혹은 최상의 비트로부터 빌림(borrow)이 발생한 경우에 1로 세트되고 그 이외의 경우 0으로 리셋된다. 그 밖의 목적으로 사용될 때도 잇다.

* 캐리 플래그는 프로그램에 의해서도 세트 혹은 리셋할 수 있다.

PE : 패리티 플래그

* 연산한 결과, 1로 된 비트의 수가 짝수(even number)개일 때 1로 세트되고, 홀수(odd number) 일 때 0으로 리셋된다

AF : 보조 캐리 플래그

* 8(16)비트 연산에서, 하위 4(8)비트로부터 상위 4(8)비트로 자리올림 혹은 빌림이 발생한 경우에 1로 세트되고 그 이외의 경우 0으로 리셋된다. 10진 보정명령에 있어서도 사용된다.

ZF : 제로 플래그

* 연산한 결과 가 0으로 되었을 때에 1로 세트되고, 그 이외 일대에 0으로 리셋된다.

SF : 사인 플래그

* 연산한 결과, 최상의 비트가 1이 되었을 때(즉, 보수 표현으로 음수가 되었을때) 1로 세트되고, 그 이외일 때에 0으로 리셋된다.

OF : 오버플로 플래그

* 연산을 부호가 달린 숫자로 했을 때, 오버플로 혹은 언더플로(under flow)가 발생한 경우에 1로 세트된고, 그 이외일 때에는 0으로 리셋된다.

 

DF : 디렉션 플래그

* 스트링 조작을 할 때에 이 플래그가 0이면 번지를 나타내는 레지스터값이 자동적으로 증가하고 1이면 레지스터값은 자동적으로 감소한다.

IF : 인터럽트 플래그

이 플래그가 0일 때 INTR 단자로부터의 외부 인터럽트 요구는 무시되고, 1일 때에는 외부 인터럽트 요구를 받아들일 수 있게 된다.

TF : 트랩 플래그

- 이 플래그가 0일때 CPU는 보통대로 명령을 실행한다.

 

- 이 플래그가 1일때 CPU는 한 명령을 실행할 때마다 자동적으로 내부 인터럽트(INT1)를 발생하고,인터럽트 처리 루틴으로 들어간다.(단, 이 처리 루틴의 실행중에는 트랩 플래그는 0으로 클리어된다) 프로그램의 추적(trace)에 사용된다.

 

2)시스템 레지스터

- IA-32에서 중요한 시스템 레지스터를 갖는다. MS - Windows는 가장 높은 특권 레벨(level 0)에서 수행되는 프로그램에서만 이 레지스터들의 접근을 허용한다.

 

- 인터럽트 서술자 테이블 레지스터 (Interrupt Descriptor Table Register : IDTR)

인터럽트 서술자 테이블의 주소를 포함. 이 테이블은 인터럽트를 처리하는 방법을 제공한다.

 

- 전역 서술자 테이블 레지스터 (Global Descriptor Table Register : GDTR)

전역 서술자 테이블의 주소를 포함. 이 테이블은 태스크 상태 세그먼트와 프로그램 지역 서술자 테이블에 대한 포인터를 포함한다.

 

- 지역 서술자 테이블 레지스터 (Local Descriptor Table Register : LDTR)

현재 실행 중인 프로그램의 코드, 데이터, 스택에 대한 포인터를 포함한다.

 

- 테스크 레지스터 (Task Register)

현재 실행 중인 테스크에 대한 태스크 상태 세그먼트의 주소를 포함한다.

 

- 디버그 레지스터 (Debug Register)

디버깅할 때에 프로그램이 brake point를 설정하게 한다.

 

- 제어 레지스터 (Control Register) CR0, CR2, CR3, CR4

태스크 전환, 페이징, 캐시 메모리 활성화와 같은 시스템 수준의 동작을 제어하는 상태 플래그와 데이터 필드를 포함한다.

 

- 모델 특정 레지스터 (Model-Specific Register)

성능 모니터링과 기계 구조의 확인과 같은 운영체제의 스템 작업에 사용. 용도는 IA - 32 프로세서의 종류에 따라 변한다.

 

아래의 그림은 각 저장소에 대한 수용능력과 수행능력,엑세스스피드를 나타내는 피라미형 그래프이다.


    이 포스팅은 어셈블리 언어 제 5판|교보문고 의 내용을 요약한 것입니다. 더 자세한 내용은 서적을 참고하세요

'퍼옴' 카테고리의 다른 글

어셈블리 명령어  (0) 2010.11.28
1125) 어셈블리 기초지식  (0) 2010.11.25
퍼옴) 풀다운, 풀업 저항  (0) 2010.10.17
퍼옴) 리눅스의 상대경로와 절대경로  (0) 2010.10.17
vimrc 설정  (0) 2010.10.17
:
Posted by 투잌
2010. 10. 17. 18:17

퍼옴) 풀다운, 풀업 저항 퍼옴2010. 10. 17. 18:17

1. 풀업(Full-up) 저항


 

스위치

ON

OFF

(a)그림

0V(Low)

Floating

(b)그림

0V(Low)

+5V(High)

 

그림1Logic은 입력을 low로 만들어놓은 그림이다. 여기서 (a) (b)의 차이가 바로 풀업 저항의 의미가 된다.
일단, (a) 그림을 보면 스위치가 ON되면 전원으로부터 접지라인까지 바로 연결이 되니까 이 Logic low가 인가가 된다. 그런데 스위치가 OFF 될 경우는 입력 상태가 어떤 상태인지 알 수가 없다. 이런 경우를 floating 되어있다고 한다. floating 상태에서는 입력 레벨이 어떤지 알 수 없기 때문에 Logic Device가 동작하는데 문제가 생길 수 있다. 왜냐하면 알 수 없는 입력이 들어왔기 때문에 알 수 없는 결과값이 나오게 되기 때문이다. 이런 floating 되어 있는 입력 상태를 없애주고자 고안된 것이 풀업 저항이다.

풀업 저항의 주 목적은 바로 스위치가 OFF 될 때가 된다. (b)그림을 보면 (a)그림과는 다르게 풀업 저항을 통해서 전원 +5V로 연결이 되어 있기 때문에 스위치가 OFF되더라도 입력값의 혼동이 없다. , 이른바 알려진 입력 상태가 되는 것이다.
그리고 풀업 저항이 없으면 스위칭 시 과도한 전류가 흐를 개연성이 많기 때문에, 디바이스에 안 좋은 영향을 끼칠 수가 있다. 이런 문제도 풀업(또는 풀다운)저항으로 해결할 수가 있다
.

2. 풀다운(Full-down) 저항

논리적으로 L-레벨 상태를 유지하기 위해 신호의 입력/출력 단자와 접지 단자 사이에 접속하는 저항

 

스위치

ON

OFF

(a)그림

+5V(High)

Floating

(b)그림

+5V(High)

0V(Low)

이 포스트를..

덧글 1개 엮인글 쓰기

'퍼옴' 카테고리의 다른 글

1125) 어셈블리 기초지식  (0) 2010.11.25
1124) 어셈블리와 레지스터의 개념  (0) 2010.11.25
퍼옴) 리눅스의 상대경로와 절대경로  (0) 2010.10.17
vimrc 설정  (0) 2010.10.17
기본적인 vi 명령어  (0) 2010.10.17
:
Posted by 투잌
2010. 10. 17. 18:11

퍼옴) 리눅스의 상대경로와 절대경로 퍼옴2010. 10. 17. 18:11


*상대경로, 절대경로 보충 (출처 : http://jjackq.tistory.com/89 )
요즘은 X-window가 워낙 보편화 되고 윈도우즈에 익숙해져 있긴 하지만 아직도 리눅스 대부분의

작업은 콘솔창에서 이뤄지고 있습니다.

↑ 요렇게 생긴거(DOS와 비스므리하게 생긴거)

앞으로 대부분의 작업은 이 콘솔창에서 이뤄지겠습니다.(저는 아직도 Xwindow환경보다 이게 편합니다)

이제 이번에 강좌할 상대경로와 절대경로를 위한 기초 명령어 ls, pwd, cd를 먼저 알아보겠습니다.

먼저 ls, 이건 DOS의 dir과 같은 역할을 한다고 보시면 됩니다. 현재 위치하고 있는 곳의 파일과

디렉토리 리스트를 전부 보여줍니다.

위의 그림에서도 보실 수 있죠?^^

기타 옵션은 나중에 하기로 하고 일단 'pwd' 이건 현재 커서(앞으로 자기 자신이라고 표기합니다)

가 위치하고 있는 경로를 알려줍니다.

위에서 보시듯 첫번째 pwd에서는 현재 경로가 루트, 즉 '/'에 위치함을 알려주고

아래쪽 빨간색 사각 박스에서는 '/home'에 위치한다고 알려줍니다.

이제 위에서 사용한 cd 명령어는 감이 잡히실꺼라 봅니다. 물론 DOS를 사용해보신 분들은

이게 DOS와 같이 디렉토리간 이동을 나타낸다는 사실을 아실 겁니다.

다음은 상대경로절대경로입니다. 컴퓨터를 이용해 프로그래밍이나 리눅스를 처음 만지시는

분들이 많이 헷갈려 하시더라구요.

이건 윈도우즈에서도 마찬가지로 동작하기 때문에 알아두시면 좋습니다.

보통 콘솔에서 위치를 이동할때
1. 경로 <- 상대경로
2. ./경로 <-상대경로
3. ../경로 <-상대경로
4. /경로 <-절대경로
5. ~/경로 <-절대경로


를 많이 사용하는데 1번부터 알아보겠습니다.

예를 들어 루트(/) 에서 cd home이라고 치게 되면 루트에서 ls 명령어를 통해 볼 수 있는 home이란

디렉토리로 이동합니다. 이건 쉽게 이해하실 겁니다.

2번 ./의 경우는 1번의 좀더 정확한 표현이 되겠습니다. 점(.)이 하나가 붙게 되는데 이건 현재 자신이

위치하고 있는 곳에서부터입니다.

3번 ../은 점이 두개가 붙어있는데 이건 현재 위치에서 한단계 상위 디렉토리로 올라간 위치를 뜻합니다.

예를 들어 자신이 /home/jjackq에 위치하고 있다고 가정했을때

cd movie 와
cd ./movie 와
cd ../jjack/movie 와
cd ../../home/jjackq/movie 는 같은 곳으로 이동하게 되는 것입니다.


여기까지 대표적으로 쓰이는 상대경로의 예제입니다.

그 다음은 절대경로 / 를 알아보겠습니다.

위의 상대경로의 예제는 절대경로로 사용하였을 때 cd /home/jjack/movie와 같은 명령어로

이동할 수 있습니다.

자신의 위치가 어디에 있던 절대적인 위치를 말하는 겁니다.

cd /home/jjack/movie 의 경우 자신의 위치가 어디에 있던간에 같은 경로로 이동하게 될겁니다.

마지막으로 ~/ 인데 자신의 홈 디렉토리로 이동하게 됩니다. 리눅스의 경우 대부분 사용자 계정을

생성하게 되면 홈 디렉토리를 만들어주게 되고 보통 /home/사용자명 으로 만들어 지게 됩니다.

제가 사용하고 있는 계정이 jjack이라고 했을때

jjack$jjackq-Desktop:/

이라고 프롬프트 창이 뜰텐데 젤 앞에 지금 사용하는 사용자 계정 명이라고 보시면 됩니다.

그러 cd ~/ 를 쳐보게 습니다.(cd ~ 도 같은 동작을 합니다)


이렇게요.

그럼 아까 상대경로의 예를 든 /home/jjackq/movie의 경우

당연히 cd ~/movie라고 치면 똑같이 이동이 될겁니다.

일단 처음 강좌는 여기까지입니다. 그리 어렵지 않게 쓸려고 했는데 뭔가 내용이 너무 없군요.

다음엔 좀 더 유익하고 다양한 내용을 실을 수 있도록 하겠습니다.

:
Posted by 투잌
2010. 10. 17. 18:09

vimrc 설정 퍼옴2010. 10. 17. 18:09


vi는 vim 이라고 불리기도 한다. vim의 환경설정을 하고 싶다면 .vimrc 파일을 생성해야 한다.

>> cd 를 입력
>> pwd를 눌러 /home/계정명 으로 잘 이동해왔는가 확인
>> vi .vimrc 를 입력
>> 넣고 싶은 환경설정 명령을 입력하고 저장한다.


>> 저장이 끝났다면 vi로 아무 파일이나 열었을시 원하는 설정값이 적용되었는가 확인.

* vim 환경설정 명령어들

set autoindent " 자동으로 들여쓰기를 한다.     
set cindent " C 프로그래밍을 할때 자동으로 들여쓰기를 한다.     
set smartindent " 좀더 똑똑한 들여쓰기를 위한 옵션이다.     
set textwidth=79 " 만약 79번째 글자를 넘어가면     
set wrap " 자동으로 를 삽입하여 다음 줄로 넘어간다.     
set nowrapscan " 검색할 때 문서의 끝에서 다시 처음으로 돌아가지 않는다.     
set nobackup " 백업 파일을 만들지 않는다.     
set visualbell " 키를 잘못눌렀을 때 삑 소리를 내는 대신 번쩍이게 한다.     
set ruler " 화면 우측 하단에 현재 커서의 위치(줄,칸)를 보여준다.     
set tabstop=4 " Tab을 눌렀을 때 8칸 대신 4칸 이동하도록 한다.     
set shiftwidth=4 " 자동 들여쓰기를 할때 4칸 들여쓰도록 한다.     
set number      
set bs=2     
set nocp   

set tabstop=2 - 탭간격을 2칸으로 지정
set expandtp - 탭문자를 공백문자로 변환
set nobackup - 백업파일을 생성하지 않음
set incsearch - 키워드를 입력할때 검색하는 점진 검색 사용
syntax on - 구분 강조 기능 사용
filetype on - 파일의 종류에 따라 구분 강종
colorscheme evening - vi색상테마변경
set background=dark - 어두운 배경색 상용
set hisearch - 검색어 강조 기능 사용0
set ignorecase -검색,편집 치환시에 대소문자 구분하지 않음
 
colorscheme slate  
syntax on  
filetype on  
 
if $LANG[0] == 'k' && $LANG1 == 'o' 
set fileencoding=korea  
endif  
 
set tags=./tags,tags  
set tags+=/usr/src/linux/tags  
 
"GUI 이면, 시작시 크기 설정  
if has("gui_running")  
    set guifont=Bitstream\ Vera\ Sans\ Mono\ 10  
    set lines=89  
    set co=114  
endif 

======================================================
주요 vi 옵션 설명

옵션 약어 설명

autoident ai 새로운 각 행을 이전 행 또는 새로운 행이 생길 때 커서가 어떤 위치에 자동으로 인덴트되도록 한다. c 프로그래밍할 때 유리하다.
autowrite aw 다른 화일로 옮겨갈 명령을 실행하기 전 또는 쉘로 잠시 나오기 전에
현재 화일을 강제로 저장한다. 
ignorecase ic 검색과 대치시 대소문자 구분을 무시한다.
magic 모든 정규식 문자를 사용할 수 있게 한다.
mesg 문서 편집 동안 메시지가 화면에 출력되는 것을 허용한다.
number nu 문서의 행에 행번호를 붙여 화면에 출력한다.
showmatch sm )나 {를 입력할 때마다 자동으로 커서가 대응하는 (나 }로 이동하여
1초동안 머문다. 
showmode 상태 행에 현재 편집 모드를 출력한다. 
wrapscan ws vi가 매번 화일 전체를 검색하도록 한다. 검색은 항상 현재 행부터
시작해서 화일의 끝으로 진행된다. 

예1) 문서의 각행에 행번호를 출력하는 예제
     :set number
예2) 행번호 출력을 해제하는 예제
     :set nonumber
예3) 현재 vi 모드를 출력하는 예제
     :set showmode
예4) 자동 들여쓰기 할때
 
:set ai / 해제는 set noai (autoiden의 약자ai)
vi에서 탭, 줄바꿈 등 표시하고 싶을때는
:set list

vi에서 탭, 줄바꿈 등 표시하고 싶지 않을때는
:set nolist

각 표시에 대한 기호 옵션을 주지 않으면
탭은 ^I (대문자 아이), 줄바꿈은 $로 표시된다.
탭의 크기(길이)에 상관없이 탭하나에 ^I하나만 표시되는데
Bram스러운 처리라 할 수 있겠다.

만약 이러한 캐릭터를 바꾸고 싶다면
:set lcs=tab:>-,eol:%
와 같이하면 되는데, 만약
:set lcs=tab:>-
만 하게되면 탭을 제외한 다른 캐릭터들은 표시되지 않는다.


색상스키마 설정
colorscheme default
colorscheme desert
colorscheme evening
colorscheme slate
:
Posted by 투잌
2010. 10. 17. 18:06

기본적인 vi 명령어 퍼옴2010. 10. 17. 18:06

★ 실제 내가 자주 쓰는 명령어
(기본적인 명령어는 저~~ 아래에 붙여놨습니다.)

이동
H(shift h) : 떠있는 화면 제일 처음
L(shift l) : 떠있는 화면 제일 끝

gg : 문서의 제일 처음
G(shift g) : 문서의 제일 끝

0 : 제일 오른쪽
$ : 제일 왼쪽

숫자+G(shift g) : 해당 숫자 라인
v : 커서로부터 블록지정 시작

u : 방금했던 작업 취소
U(shift u) : 현재 커서가 위치한 줄에서 한 모든 작업만 취소.

Ctrl + R(shift r) : 취소를 취소하기.
>> u는 뒤로, Ctrl + R 은 앞으로.

/ : 찾기
 >> 다음 찾기 : n, 역방향 : N(shift n)

? : 역방향 찾기

문자열 바꾸기 (foo 에서->bar 로)

:%s/foo/bar/c
 >> 바꿀지 물어보는데 y를 누르면 하나씩, n을 누르면 그 다음 단어를 물어보고, a를 물어보면 모두 바꿔버린다.

:%s/\<foo\>/bar
 >> 정확하게 원단어로 존재하는 단어만 바꾼다. 아원단어아 같은 경우는 x

:%s/foo/bar/i
 >> 대소문자 구분 없이 찾아 바꾼다.

:%s/foo/bar/g
 >> 문장의 모든 foo를 bar로 바꾼다. / 나 같은 경우 사용 빈도가 높다.

:%s/foo/bar/gi
 >> 문장의 모든 foo를 bar로 대소문자 구분없이 찾아 바꾼다.

파일 합치기
:r test.txt
같은 디렉토리 안에 있는 test.txt를 커서가 위치한 곳에 끼워넣는다.

대소문자 변경
v로 블록 지정후 u는 소문자, U는 대문자

~ : 커서가 있는 곳을 반대로 변경
 (대문자<->소문자)

gUU : 커서가 위치한줄 모두 대문자
guu : 커서가 위치한줄 모두 소문자

다른창으로 이동
Ctrl  ww

창사이즈 확대
Ctrl w+
창사이즈 축소
 Ctrl w-

창 닫기
Ctrl w c


*새창 열기
:new test.txt  / 자주 씀.


 


리눅스 명령어 모음

찾기 : find / -name 'et*' -type d
 >> -type d 라고 하면 디렉토리 검색

ls > ls.txt  : ls로 출력되는 화면을 ls.txt로 저장한다.
 ex) cal.txt , date.txt, help.txt






★ VI 명령어 (퍼옴)
(더 자세히 보고 싶으면 http://ej5811.blog.me/80096435741 참고)

* 방향키
h : 왼쪽으로(<-)
l  : 오른쪽으로(->)
j : 아래로(↓)
k : 위로(↑)
0 : 제일 왼쪽
$ : 제일 오른쪽

*삭제 (잘라내기) >> 붙여넣기를 하면 삭제되었던 부분이 해당 위치에 입력됨.
x : 커서 뒤에 있는 한글자 삭제
X (shift x)  : 커서 앞에 있는 한글자 삭제
dd : 커서가 있는 한줄 삭제
dw : 커서가 있는 문자 삭제
d2↓ : 커서줄 포함, 아래로 3줄 자른다.
  >> 몇 줄인지는 지정 가능하다. 방향키로 삭제 방향 지정 가능.
shift d : 커서 뒤부터 모두 삭제

*붙여넣기
p : 붙여넣기(아래에)
P (shift p) : 붙여넣기(위에)

*확장모드 (shift 세미콜론)
set number : 화면에 라인이 표시된다.
  >> = set nu
/ : 검색
 >> 특정 단어에서 * 를 누르면 그 단어만 찾을 수도 있다.

* 종료
:q : 그대로 종료하기
:q! : 변경된 내용을 저장하지 않고 강제로 종료하기
:wq : 변경된 내용을 저장후 종료
  >>  :x 와 동일, ZZ와 동일
:W @@.TXT : @@.txt라는 새 이름으로 저장후 종료

:
Posted by 투잌

출처 : http://regulation.tistory.com/tag/endian



컴퓨터에서 어떤 크기의 데이터를 메모리에 저장할 때 바이트 단위로 나누어 저장한다.
그렇다면 2바이트나 4바이트 크기의 데이터는 어떤 바이트 순서로 저장할까?

먼저 본론부터 말하면 CPU 유형에 따라 바이트 저장순서가 달라질 수 있다.
크게 두 가지로 나뉘는 데 그것이 바로 ‘리틀 엔디안’과 ‘빅 엔디안’ 방식이다.

1. 리틀 엔디안 (Little-Endian)

연산이 빠르다. 새로운 내용 추가에 유리.

시작 주소에 하위 바이트부터 기록

( Intel 80x86 (IBM-PC),  DEC VAX,  DEC PDP-11 )
주로 SCO 유닉스나 MS 윈도우가 돌아가는 Intel 프로세서 계열 시스템

 -----------------------------------------------------------------------

-----------------------------------------------------------------------


2. 빅 엔디안 (Big-Endian) 

논리 연산에 유리. (참, 거짓)

시작 주소에 상위 바이트부터 기록
( IBM370,  Motorola 68000,  Pyramid )
상용 UNIX가 주로 돌아가는 RISC 프로세서 계열 시스템


-----------------------------------------------------------------------

-----------------------------------------------------------------------


네트웍에서 데이터 전송을 할 때도 이러한 엔디안  방식에 주의해야 한다.
서로 다른 데이터 저장 방식의 시스템끼리 통신하게 되면 전혀 엉뚱한 값을
주고받기 때문이다. (저장순서가 서로 반대임)

 네트웍 데이터 통신에서는 네트워크 바이트 순서(network byte order, 빅 엔디안)를
따르도록 데이터의 바이트 순서를 변경해야 한다.
(TCP/IP, XNS, SNA 규약은 16비트와 32비트 정수에서 빅 엔디안 방식을 사용함)

 클라이언트측 : 네트워크 바이트 순서(빅 엔디안)로 변경하여 전송한다.
      htonl 같은 함수(host to network)를 이용해서 변경시켜주면 된다.

      data = htonl(data);   // data : 전송할 4바이트 값
      write(client_sockfd, (void *)&data, sizeof(int));

 서버측 : 받은 값(네트웍 바이트 순서(빅 엔디안))을 자신에게 맞게 변환하여 사용한다.
        ntohl 같은 함수(network to host)를 이용해서 변경시켜주면 된다.

        printf("%d\n", ntohl(data));   // data : 전송 받은 4바이트 값
        close(client_sockfd);

 <이상>

 참조 : ‘endian에 대해서, 윤 상배(dreamyun@yahoo.co.kr)’ 등 인터넷 문서 일부


 ---------------------------------------------------------------------------

다음 코드를 이용하여 여러분의 프로그램이 수행될 시스템의
Endian(바이트정렬) 정보를 알 수 있습니다.
 
int x = 1;
 
if (*(char *)&x == 1) {
  /* Little-Endian */
  /* printf("Little-Endian\n"); */
}
else {
  /* Big-Endian  */
  /* printf("Big-Endian\n"); */
}

참조 : C Programming FAQs, By Steve Summit, January/1/2001

'퍼옴' 카테고리의 다른 글

퍼옴) 풀다운, 풀업 저항  (0) 2010.10.17
퍼옴) 리눅스의 상대경로와 절대경로  (0) 2010.10.17
vimrc 설정  (0) 2010.10.17
기본적인 vi 명령어  (0) 2010.10.17
(퍼옴) 실수를 계산하는 방법(다른버전)  (0) 2010.10.04
:
Posted by 투잌
2010. 10. 4. 10:40

(퍼옴) 실수를 계산하는 방법(다른버전) 2010. 10. 4. 10:40

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.