어셈블리 언어 입문 

 

- 어셈블리 언어 부분은 실습 위주의 수업이였기 때문에 필기 하기 애매.

 

 

 

 

[문자와 엔디안]

 

메모리에 값을 저장할때 두가지 방법이 있다.

- 빅 엔디언 : 조금더 직관적이다.

- 리틀 엔디언 : 

 

 

나중에 서버에서 data를 little endian으로 보내주는데 클라에서 받을때는 big endian으로 받게 되면, 완전히 다른 데이터를 받게 된다.

 

지금은 중요해보이지는 않지만, 나중 되면 큰 이슈가 될 수 있다.

 

리틀 엔디언 : 캐스팅에 유리하다.
빅 엔디언 : 숫자 비교에 유리

 

 


 

[ 데이터 갖고 놀기 ]

 

 

스택 메모리 , 스택 프레임 

 

 

 

 

-  0 이 아닌 초기값이 있으면 .data 영역
-  초기값이 0 이거나, 초기값이 없는 변수라면 .bss 영역

 

 

char hp; // 1byte -128 ~ 127
short b; // 2byte  -32,768 ~ 32,767
int c;  //4byte   -21억 ~ 21억
__int64 d; //8byte (long long) ( 어마어마하게 크다. )

unsigned char dhp; // 1byte 0  ~ 255
unsigned short db; // 2byte  0 ~ 65,536
unsigned int dc;  // 4byte  0 ~ 42.9억
unsigned __int64 ad; //8byte (long long) ( 어마어마하게 크다. )

 


[ 정수 ]

 

부동 소수점은 항상 ' 근사 값' 이다

- float , double

- 실수 2개를 ==으로 비교하는 것은 지양.

 

 


[문자와 문자열 ]

 

ASCII ( American Standard Code for Information Interchange)

- 알파벳을 표기하는 국제 표준.

 

 

  • 국제화 시대에는 영어만으로 서비스 할 수 없음
  • 전 세계 모든 문자에 대해 유일 코드를 부여한 것이 유니코드 (unicode)
  • 유니코드는 표기 방식이 여러가지가 있는데 대표적으로 UTF8UTF16 이 있다.

 

UTF8 

    - 알바펫 , 숫자 1바이트 ( ASCII 동일한 번호 )

    - 유럽 지역의 문자는 2바이트

    - 한글, 한자 등 3바이트

 

UTF16 ( C#, MS에서는 UTF16 을 사용 )

    - 알바펫, 숫자, 한글 ,한자 등 거의 대부분 문자 2바이트

 

 

아스키 코드를 저장하는 C++ 타입은 char

 

 

UTF16을 저장하는 타입은 wchar_t  ( 문자 앞에 L 을 붙혀준다 )

 

wchar_t wch = L'안';

출력 하려고 cout 해주게 되면

 

50504 라는 숫자를 출력하는데

 

이는 cout이 wchar_t 를 오버로딩하고 있지 않아서이다.

wcout << wch << endl;

 

cout 말고  wcout을 사용하여 출력하여야한다.

 

심지어는 한글을 인식 못해서 

wcout.imbue(locale("kor"));

해줘야 한다.

 


 

[ 산술 연산 ]

 

#pragma region
	~~~~~
#pragma endregion

해주게 되면 함수가 아니여도 코드를 줄였다 폈다 할 수 있다.

 


[ 비트 연산 ]

 

~ bitwise not 

 단일 숫자의 모든 비트를 대상으로 0 은 1로 1은 0으로 뒤집음.

 

& bitwise and
 두 숫자의 모든 비트 쌍을 대상으로, and를 한다.

 

| bitwise or

 두 숫자의 모든 비트 쌍을 대상으로, or을 한다.

 

^ bitwsie xor

 두 숫자의 모든 비트 쌍을 대상으로 xor을 한다. 

  = 둘 이 같으면 0 다르면 1

 

xor 의 특별한 특징.

같은 숫자 두개를 xor 하면 0이 나온다.

숫자를 두번 xor 하면은 원래 값이 나온다. ( 암호학에서 유용하게 사용 )

 


<<    >>  비트연산을 할때는 비트연산 할 숫자를 unsigned 형태로 변경해주는것이 정신 건강에 좋다.

 

<< 를 할때 넘치는 N개의 비트는 버리고 새로 생성되는 N개의 비트는 0으로 만든다.

>> 를 할때 넘치는 N개의 비트는 버리는것 까지는 똑같은데 맨 왼쪽에 생성되는 부호 비트는 기존에 있던 숫자가 음수면 1로 되고 아니면 0으로 채운다.

 


Bit Flag

사실상 char는 1byte 짜리 정수랑 같은데, 

 

여기에 특별한 의미를 부여하여 bit 단위로 사용할 수 있다면 주고 받는 패킷양을 줄일 수 있어서 유용하다.

 

0b 0000 [ 무적 ] [ 변이 ] [ 스턴 ] [ 공중부양 ]

 

물론 전부 boolean 타입으로 만들 수 도 있지만 노가다일 뿐더라 bool 도 1byte 짜리 데이터 타입이다.

 

// 0b 0000 [무적] [변이] [스턴] [공중부양]

	unsigned char flag; // unsigned 이여야지 >> 를 하더라도 부호 비트가 딸려오지 않는다.

	// 무적 상태로 만든다.
	flag = 8; //  ob 1000 이니깐 무적 상태는 맞지만,   bit를 64개를 사용한다고 한다면 힘들다.
	flag = (1 << 3); 

	// 변이 상태를 추가한다 ( 무적 + 변이 )
	flag |= 4; // 마찬가지로 아래의 방법이 더 좋다. 
	flag |= (1 << 2);

	// 무적인지 아닌지 확인하고 싶다. ( 다른 상태는 관심 없다. )
	// BitMask
	bool invincible = (flag & (1 << 3));  // 무적인 상태면 1이 아니니깐 True 가 나온다. or 0


	// 무적이거나 스턴 상태인지 확인하고 싶다면?
	bool mask = (1 << 3) | (1 << 1); // 0b1010 
	bool stunOrInvincible = (flag & mask);

+ Recent posts