본문 바로가기
System_Security

04. 비트연산자 & 형변환

by Jnamelight 2017. 7. 20.

비트연산자


비트 연산자는

and , or , xor , neg (NOT ) , shift ( >>, > ,< , << ) 가 있다.


일단 가장 많이 사용되는 명령어는 SHIFT 명령어인대 크게 두가지로 나뉜다.



1 ) 부호가 있는 쉬프트

- SAL

- SAR


이 두가지의 명령어의 특징은 메꾸어지는 값이 1 이라는 점이다.


이말인 즉슨, 내가 shitf 연산을 이용해서 값을  shift 시켰을때 채워 지는 값이 1이라는 소리 


* 여기서 중요한 점은 right 일때만 해당된다. left 일경우는 0으로 채워짐, 

  아마도... 부호는 가장 앞의 비트가 해당되기 때문일 것이다.


2)  부호가 없는 쉬프트


- SHL

      - SHR


이건 반대로 메꾸어지는 값이 0 이다. 위와 특징은 같다.


and : 둘다 1인경우 1


- 짝수인지 아닌지 체크 // 마스킹


or : 둘중에 하나만 1 이면 1

xor : 두개가 다르면 1 , 같으면 0


- 레지스트 초기화


neg : 0 -> 1 , 1 -> 0




형변환



형변환이란 저번에 했던 레지스트에서 큰레지스트 값으로 이동하거나, 작은 레지스트로 이동하는 것을

형변환이라고 한다.


1) 작은 - > 큰


큰 문제가 되지는 않지만, 새로운 명령어를 이용해서 mov 시켜주어야 한다 ( 어셈블리 )


예를들면


char small = 10;

int big;


big = small; 


은 C 언어 상에서 에러가 발생하지는 않겠지만, 만약 big 의 변수가 초기화가 되어있지 않으면 1바이트 짜리가 들어가면

나머지 3바이트에는 쓰레기 값이 들어가 있을 확률이 있다.



그래서 어셈블리어 에서는 새로운 명령어를 사용하는대


movsx , movzx 이다.


각각의 차이점은 역시 아까 쉬프트와 같이 부호가 있냐, 없냐 인대


확장되었을때 확장 부분을 1로 채울 것이냐, 0으로 채울 것이냐이다.



2) 큰 -> 작은


이것은 문제가 발생한다, 일단 가장 먼저 데이터 손실이 일어날 가능성이 있다. 


4바이트 -> 1바이트 로 가면 당연히 3바이트가.. 손실된다. 어셈블리어 에서 어떤식으로 처리해야 할까?


어셈블리에서는 범용 레지스트가 존재하는대, 각각의 범용 레지스트를 이용해서


32bit 레지스트를 16bit 레지스트 두곳에다가 옮기는 방법이 있다.


예를 들면 배열을 생각하면 쉬운대..


큰정보를 각각의 배열에 나누어서 저장한다고 생각하면 된다.


메모리를 이용해서 큰 데이터를 작은 데이터에 넣는 것이다.




















'System_Security' 카테고리의 다른 글

06. 프로세스 메모리 구조  (0) 2017.07.26
05. 분기문,반복문  (0) 2017.07.24
03. 어셈블리 사칙연산  (0) 2017.07.19
02. 레지스트 개념  (0) 2017.07.15
01. 프로그램의 개념  (0) 2017.07.14

댓글