티스토리 뷰
레지스터 뱅크 알아보기[1]
오늘은 레지스터 뱅크에 대해 알아보겠습니다. 8051 의 내부 데이터 메모리의 00H 번지부터 1Fh 까지는 특수 용도로 사용할 수 있도록 되어 있습니다. 32 바이트중 00H - 07H 까지는 뱅크 0 이고, 08H - 0FH 까지는 뱅크 1 이고, 10H - 17H 까지는 뱅크 2 이고, 18H - 1FH 까지는 뱅크 3 입니다. 각각의 뱅크는 R0 - R7 으로 표현할 수 있습니다. R0 - R7 까지를 범용 레지스터라고 부릅니다. 범용 레지스터를 사용하면 기계어가 단축되는 장점이 있습니다. 예를 들어서 LOC OBJ LINE SOURCE 0000 1 org 0h 0000 E500 2 mov a,00h 0002 E8 3 mov a,r0 4 end mov a,00h 명령의 기계어는 E5 00 의 두 바이트인 반면 00H 번지대신 R0 를 사용한 mov a,r0 명령의 기계어는 E8 의 한 바이트가 됩니다. (기계어가 짧아졌지요.) 또한 범용 레지스터 중에서 R0 와 R1 은 내부 데이터 메모리의 포인터로도 사용할 수 있습니다. 포인터로 사용할 때에는 '@' 부호를 앞에 붙여 사용합니다. mov r0,#40h mov a,#38h mov @r0,a 위와 같이 하면 r0 를 포인터로 사용한 것이고, r0 가 가리키는 번지, 즉 40 번지에 a 레지스터의 값을 넣으라는 뜻이 됩니다. 이와 같이 메모리 번지를 가리키는 레지스터를 포인터라고 합니다. 뱅크가 4 개 있으므로, 00h, 08h, 10h, 18h 네개가 모두 r0 가 되는데 어느것을 말하는 것인지 어떻게 알수 있을까요? 현재 사용하는 뱅크를 지정하는 방법이 있습니다. SFR(특수기능레지스터)의 PSW 라는 레지스터의 가운데 2 비트로 현재 사용하는 뱅크를 선택합니다. 즉 mov psw,#08h 라고 하면 가운데 두 비트가 01 이므로 뱅크 1 을 선택한 것이고, mov psw,#10h 라고 하면 가운데 두 비트가 10 이므로 뱅크 2 를 선택한 것이 됩니다. 뱅크 1 을 선택했을 때 r0 는 08h 번지가 되고, 뱅크 2 를 선택했을 때 r0 는 10h 가 됩니다. 이상의 내용을 사용하여 레지스터 뱅크를 사용한 간단한 프로그램을 작성해 보겠습니다. $include(REG52.inc) ;Assignments of the 8052 SFR. ;----------------------------------------------------- ;MAIN ROUTINE code at 0 ; absolute = RESET vector ljmp START code ; relocatable START: mov psw,#10h ; bank 2 select mov r0,#30h mov a,#5bh mov @r0,a mov r1,#40h mov a,#0b7h mov @r1,a mov psw,#18h ; bank 3 select mov r0,#50h mov a,#0a7h mov @r0,a mov psw,#10h ; bank 2 select mov a,@r0 mov @r1,a ; sjmp $ ; infinite loop ;----------------------------------------------------- 위 프로그램을 RIDE51 에서 asm 폴더에서 asm02.prj 로 프로젝트를 만들고, asm02.a51 이라는 이름의 어셈블리어로 작성해서 debugger 탭에서 Data dump->Data view 창과 Main registers 창을 열고, 스텝 동작[F8]으로 확인해 보세요. 다음은 스텝동작으로 확인한 그림입니다. 데이터 창에서 각 스텝마다 값이 변화되는 것을 확인하세요.
'C언어' 카테고리의 다른 글
SFR (특수기능 레지스터) 영역 살펴보기 (0) | 2021.07.31 |
---|---|
상위 데이터 메모리 (80h-FFh) 사용하기 (0) | 2021.07.30 |
레지스터 뱅크 알아보기[2] (0) | 2021.07.29 |
내부 데이터 메모리 살펴보기 (0) | 2021.07.28 |
C 언어로 내부 데이터 메모리 살펴보기 (0) | 2021.07.28 |