Information Security

레지스터(Register)와 사칙연산 본문

System Hacking

레지스터(Register)와 사칙연산

leeeeye321 2018. 1. 18. 04:52
레지스터(Register)

CPU가 연산에 필요한 데이터를 기억하는 고속의 임시 기억 장치이다.

용도별로 여러 개의 레지스터가 존재한다.

 

속도

레지스터 >> 메모리(주기억장치) >> 보조기억장치(디스크, USB)

 

1) 범용 레지스터

EAX(Extended Accumulator Register)

EBX(Extended Base Register)

ECX(Extended Counter Register)

EDX(Extended Data Register)

 

2) 포인터 레지스터

ESI(Extended Source Index)

EDI(Extended Destination Index)

-> 문자열 복사(Source -> Destination)에 이용

 

EBP(Extended Base Pointer)

ESP(Extended Stack Pointer)

EIP(Extended Instruction Pointer)

 

3) 플래그 레지스터

EFLAGS

-> 프로세스의 상태 정보를 나타낸다. 

 

앞에 E가 붙은 레지스터의 크기는 모두 32bit이다.

 

EAX(32) -> AX(16) -> AH, AL(8)

전체 레지스터에서 얼마만큼 사용할지를 결정할 수 있다.

 

사칙연산

1) 덧셈: ADD

10 + 20 = 30

 

 

2) 뺄셈: SUB

20 - 10 = 10

 

 

3) 곱셈: MUL

 

3-1) Operand Size가 Byte일 때 MUL 연산

하나의 operand만 필요하다.

 

 

45 * 98 = 4410

 

3-2) Operand Size가 Word일 때 MUL 연산

3321을 ax에 할당하고, a의 값 1996과 mul 연산을 수행했다.

 

 

 

 

dx: 0000 0000 0110 0101

ax: 0010 0101 0110 1100

상위 16비트는 dx에, 하위 16비트는 ax에 저장된다.

 

 

0000 0000 0110 0101 0010 0101 0110 1100을 10진수로 변환하면 6628716이다.

1996 * 3321 = 6628716

 

4) 나눗셈: DIV

 

4-1) Operand Size가 Byte일 때 DIV 연산

 

96을 ax에 할당했다. 그리고 a의 값 7과 div 연산을 수행했다.

eax의 값을 확인한 결과는 1293이다.

 

1293의 binary 값은 0000 0101 0000 1101 이다.

 

AL(8bit): 0000 1101 -> 13

AH(8bit): 0000 0101 -> 5

 

Quotient(몫)은 AL, Remainder(나머지)는 AH을 확인해야 한다.

-> 96 / 7은 몫이 13이고, 나머지는 5이다.

 

4-2) Operand Size가 Double word 일 때 DIV 연산

 

 

 

6628716의 binary 값은 0000 0000 0110 0101 0010 0101 0110 1100이다.

 

피제수의 상위 16비트는 DX에, 하위 16비트는 AX에 할당한다.

상위 16 비트(DX): 0000 0000 0110 0101 -> 101

하위 16 비트(AX): 0010 0101 0110 1100 -> 9580

그 후 a의 값 3321과 div 연산을 수행한다.

 

몫은 AX, 나머지는 DX를 확인해야 한다.

6628716 / 3321의 몫은 1996, 나머지는 0이다. 

 

push eax

push edx

push output2

call printf

위의 어셈블리 코드는 C언어로

printf("%d %d", edx, eax); 와 같다.

 

※ 비트 연산: shift

-비트를 왼쪽(shl)/오른쪽(shr)으로 이동

 

       

mov ax, 3321
mul word [a]

-> 3321 * 1996 의 결과 중 상위 16비트(101)는 dx, 하위 16 비트(9580)는 ax에 할당된다.

 

mov dword [result], edx
shl dword [result], 16

 

-> edx의 값을 왼쪽으로 16비트 shit 하면 101이 6619136이 된다.

상위 16 비트의 위치로 옮겼다고 생각하면 된다.

 

그리고 이 값에 eax의 값(9580)을 add 하면 6628716이 되는데, 이 값은 1996 * 3321의 결과와 같다.

이렇게 shift와 add 연산으로 mul 연산과 같은 결과를 얻을 수 있다.

 

 

 

 

'System Hacking' 카테고리의 다른 글

함수  (0) 2018.01.23
관계 연산(cmp) + 제어문  (0) 2018.01.19
주소 vs 메모리  (0) 2018.01.16
C언어로 만들어진 프로그램의 실행과정 이해  (0) 2018.01.12
System Hacking 실습 환경 구성  (0) 2018.01.10