윈도우즈 시스템 프로그래밍이라는 책과 해당 책의 저자이신 윤성우님의 강의를 통해 공부한 내용을 정리하는 글입니다.
Direct 모드의 문제점과 Indirect 모드의 제안
메인 메모리의 주소값을 나타내는 Source 부분을 보면 표현할 수 있는 값의 범위가 0x0000~0x00ff까지 밖에 안된다. 그러므로 0x0100번지에 저장된 데이터를 참조할 경우에는 문제가 발생한다.
이러한 메모리 접근방식을 가리켜 Direct Addressing 모드(이하 Direct 모드)라고 한다. Direct 모드를 통해서는 메모리의 모든 영역을 접근할 수 없으므로 이를 해결하기 위해 Indirect Addressing 모드(이하 Indirect 모드)가 등장한다.
Direct 모드와 Indirect 모드
⦁ Direct 모드 : 메모리의 주소값을 직접 지정해서 값을 가져오는 방식. 예를들어 LOAD r1, 0x10이라는 명령은 0x10번지의 데이터를 레지스터 r1에 저장하라는 뜻이 된다.
⦁ Indirect 모드 : 메모리의 주소값을 직접 지정하는 것이 아니라 [] 기호 안에 감싸진 주소에 저장된 값을 주소값으로 참조해서 값을 읽어오는 방식이다. 예를들어 LOAD r1, 0x10 명령은 0x10번지에 저장된 값을 주소값으로 참조해서 해당 주소에 저장된 값을 레지스터 r1에 저장하라는 뜻이 된다.
Indirect 모드 활용 예제
int a = 10; // 0x0010번지 할당
int b = 20; // 0x0100번지 할당
int c = 0; // 0x0020번지 할당
c = a + b;
세 번째 줄까지는 이미 완료되었다고 가정하고 마지막 줄 연산에 대해서 생각해봐야 한다.
앞서 해결했던 예제는 다음과 같은 순서로 해결했다.
1. 0x0010(a) 번지와 0x0100(b) 번지에 저장되어 있는 값을 각각 레지스터 r1, r2로 이동한다.
2. 레지스터 r1과 r2에 있는 값을 더해서 레지스터 r3에 저장한다.
3. 레지스터 r3에 저장된 값을 0x0020(c) 번지에 저장한다.
이 중 첫 번째 연산을 진행하기 위해서는
LOAD r1, 0x0010 // 0x0010번지에 저장된 데이터를 r1로 이동
LOAD r2, 0x0100 // 0x0100번지에 저장된 데이터를 r2로 이동
위와 같은 명령어가 필요하다.
첫 번째 명령은 문제가 없는데, 두 번째 명령어는 0x0000~0x00ff의 범위를 넘어선 주소를 참조하려고 하기 때문에 문제가 발생한다. 이러한 문제는 Indirect 모드를 도입하여 해결할 수 있다.
0x0100은 십진수로 256이니 이 숫자를 먼저 만들어내야 한다.
MUL r0, 4, 4 // r1에는 데이터 0x0010이 저장되어 있으므로 r0에 연산결과 저장
MUL r2, 4, 4
MUL r3, r0, r2
사칙연산 명령어 구조를 보면 피연산자가 상수로 올 때 나타낼 수 있는 값의 범위는 0~7이므로 이 숫자를 가지고 256을 조합해야한다.
1. r0에 MUL 명령어를 사용해 만든 값 16을 저장한다.
2. r2에도 16을 만들어 저장한다.
3. 이 두 레지스터에 저장된 값을 곱해서 r3에 저장한다.
이제 r3에 저장된 주소값을 참조하여 레지스터 r2로 저장해야한다.
이때 LOAD 명령어의 두 번째 피연산자 위치에는 주소 값이 오도록 디자인했으므로,
LOAD r2, r3 와 같은 명령어 조합은 사용할 수 없다.
일단 레지스터 r3에 저장된 주소 값을 메모리에 옮겨다 놓는다.
STORE r3, 0x0030 // STORE 명령어로 표현할 수 있는 범위에 저장해야 하므로 0x0030을 지정했다.
그리고 메모리를 Indirect 모드로 참조해서 값을 읽어오도록 LOAD 명령어를 구성한다.
LOAD r2, [0x0030]
이렇게 되면 0x0100 번지에 저장된 데이터를 레지스터 r2에 저장하는 것이 해결되었다.
c = a + b에 해당하는 명령어 조합을 정리하면 아래와 같다.
LOAD r1, 0x0010
MUL r0, 4, 4
MUL r2, 4, 4
MUL r3, r0, r2
STORE r3, 0x0030
LOAD r2, [0x0030]
ADD r3, r1, r2
'윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
윈도우즈 시스템 프로그래밍 5장 - 프로그래밍을 통한 프로세스 생성 (0) | 2021.07.23 |
---|---|
윈도우즈 시스템 프로그래밍 5장 - 프로세스와 스케줄러의 이해 (0) | 2021.07.22 |
윈도우즈 시스템 프로그래밍 4장 - LOAD & STORE 명령어 디자인 (0) | 2021.07.21 |
윈도우즈 시스템 프로그래밍 4장 - 컴퓨터 구조의 접근방법 (0) | 2021.07.21 |
윈도우즈 시스템 프로그래밍 3장 - 프로그램 구현 관점에서의 WIN32 vs WIN64/오류의 확인 (0) | 2021.07.21 |