티스토리 뷰
레지스터 뱅크 알아보기[2]
이전에는 어셈을 사용하여 레지스터 뱅크에 대해서 알아 보았습니다. 이번 강좌에서는 C 언어에서 레지스터 뱅크를 선택하는 방법과 사용하는 뱅크에 따라 변수와 포인터(R0, R1)가 어떻게 동작하는지를 알아보겠습니다. 아래 프로그램 소스는 "[강좌 7] C 언어로 내부 데이터 메모리 살펴보기"의 소스와 동일합니다. main() 함수 선언 부분에 using 2 라는 레지스터 뱅크 선택 명령이 추가 되었습니다. 8051 C 언어에서는 프로그래머가 직집 범용 레지스터(R0-R7)를 사용하지 않습니다. 다만 함수에서 사용하는 레지스터 뱅크를 결정해 줄 수 있을 뿐입니다. 레지스터 뱅크를 선택하는 명령이 using 입니다. using 뒤에 0 부터 3 까지 숫자를 붙여서 사용하는 레지스터 뱅크를 결정합니다. 아래 프로그램을 스텝동작으로 실행하고 변수의 위치와 포인터(R0) 의 위치를 살펴보겠습니다. #include #define IDATA ((char *)0x10000) void delay(long int dly) { while(dly--); } void disp(char ch) { P1 = ch; delay(10000); } void main() using 2 // -- 1 { char r0; char acc; r0 = 0x30; acc = 0x3a; IDATA[r0] = acc; // -- 2 disp(~IDATA[r0]); r0++; acc += 2; IDATA[r0] = acc; disp(~IDATA[r0]); ...(이하 생략) } 위 그림을 보면 변수 r0 와 acc 는 08h 와 09h 번지에 각각 30h 와 3ah 의 값을 갖고 있습니다. 파란줄 위의(-- 2) 명령인 IDATA[r0]=acc; 는 현재 acc 의 값을 r0 가 가리키는 번지(=30h) 에 넣으라는 뜻인데, 이 r0 의 값이 내부 데이터 메모리 00h 가 아닌 10h 에 30h 값이 들어 간 것을 볼 수 있습니다. using 명령이 없을 때는 뱅크 0 이 디폴트로 선택이 되어 00h 번지에 값이 들어가지만([강좌7]에서), main() 함수 선언시 using 2 라는 명령이 추가 되어 뱅크 2 가 사용되고 있음을 알 수 있습니다.
'C언어' 카테고리의 다른 글
SFR (특수기능 레지스터) 영역 살펴보기 (0) | 2021.07.31 |
---|---|
상위 데이터 메모리 (80h-FFh) 사용하기 (0) | 2021.07.30 |
레지스터 뱅크 알아보기[1] (0) | 2021.07.29 |
내부 데이터 메모리 살펴보기 (0) | 2021.07.28 |
C 언어로 내부 데이터 메모리 살펴보기 (0) | 2021.07.28 |