본문 바로가기

System Hacking

5일차] 연산자 (사칙연산)

사칙연산 ]

 

1. 덧셈: ADD 

 

 

# 먼저 sum에 10을 넣고, sum의 값고 20을 더하는 모습이다.

 

# 레이블 a와 b에 10과 20을 넣고 둘이 더한 값을 sum에 넣는 모습이다.

 

 

2. 뺄셈: SUB

# 뺄셈은 ADD와 별 다를 것이 없다. 같은 형식으로 사용하면 된다.

 

 

3. 곱셈

- MUL  ( unsigned ) - 피연산자 1개

- IMUL ( signed )    - 1개~3개

 

# 상위 16비트만 사용하기 때문에 초기화 과정을 거쳐주어야 한다.

 

# 이렇게하면 상위 16비트는 edx 하위 16비트는 eax에 저장된다. 따라서 추후에 비트연산을 통해서 확인해보면 된다.

 

 

4. 나눗셈

- DIV( unsigned )

- IDIV( signed )

 

 

 

[실습]

- 두 정수를 입력받아서 덧셈, 뺌셈, 곱셈, 나눗셈(몫, 나머지)의 결과를 출력하는 어셈블리 프로그램을 작성

! 입력값의 크기는 8비트로 제한

! DIV 명령어 사용 시 -Floating Point Error 발생 시 DIV 명령어 전에 다음의 명령어 중에 하나를 사용

- CBW : Convert Byte To Word

- CWD: Convert Word

 

위와 같이 실행 결과가 나온다. 어셈블리도 마찬가지로 문자열에 %를 문자로 쓰고싶다면 %를 한번 더 붙여야 출력이 가능하다. 메모리와 주소에 대한 이해만 있다면 scanf 와 printf를 쓰는데는 큰 어려움이 없다.

 

2. 비교연산

 

3. 논리연산 : &&, ||

- 기계어로 직접 표현되지 않는다.

- 간접적으로 표현

- if문같은 분기문을 이용할 때 확인 가능.

 

4. 비트연산 : &, |, ^, !

- and

- or

- xor

 

 

5. 할당 / 타입변환

movzx (작은 -> 큰 형변환)

# 곱셈이나 나눗셈은 나뉘어서 결과가 나오는 경우가 많기 떄문에 비트연산자를 통해서 쉽게 결과를 확인할 수 있다.