Information Security
레지스터(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 |