티스토리 뷰

C언어

내부 데이터 메모리 살펴보기

시작이반입니다 시작이반입니다 2021. 7. 28. 22:00

내부 데이터 메모리 살펴보기

내부 (외부) 데이터 메모리, 내부 (외부) 프로그램 메모리, SFR(특수기능레지스터) 이 있습니다. 그중 베타 키트는 내부 데이터 메모리와 내부 프로그램 메모리, SFR 을 사용할 수 있습니다. 오늘은 내부 데이터 메모리를 살펴 보겠습니다. 내부 데이터 메모리는 8051 은 00H-7FH 까지 있으며, 8052 는 00H-7FH, 80H-FFH 까지 있습니다. 00H-7FH 까지는 직접 번지 지정으로 읽고 쓸수 있으며, 80H-FFH 까지는 간접 번지 지정으로 읽고 쓸 수 있습니다. 여기서 직접 번지 지정이란 명령어에 번지를 직접 표시하는 방식이고, 간접 번지 지정이란 명령어에 번지를 직접 쓰지 못하고, 포인터(@R0, @R1) 를 사용하는 방식입니다. 아래 그림과 같이 프로그램을 작성하고, 화면 아래의 Debugger 탭에서 Data Dump->Data View 와 Main registers 를 더블 클릭해서 내부 데이터 메모리와 레지스터 창을 엽니다. $include(REG52.inc) ;Assignments of the 8052 SFR. ;---------------------------------------------------------- ;MAIN ROUTINE code at 0 ;absolute = RESET vector ljmp START code ;relocatable START: mov r0,#30h mov a,#3ah mov @r0,a ; inc r0 add a,#2 mov @r0,a ; inc r0 add a,r0 mov @r0,a ; inc r0 add a,@r0 mov @r0,a ; inc r0 mov a,33h dec a mov @r0,a ; sjmp $ ;infinite loop ;---------------------------------------------------------- 프로그램 첫줄에 $include (REG52..inc) 는 8052 에서 사용하는 레지스터들을 선언해 놓은 것입니다. c:\ride\inc\51 폴더 안에 있습니다. 세미콜른(';')은 주석문을 나타냅니다. 세미콜른 뒤에는 보통 설명문을 작성합니다. 어셈블 할때 세미콜른 뒤는 무시합니다. code at 0 는 코드(프로그램) 영역을 알리는 것으로 0 번지 부터 기계어로 변환하도록 지시합니다. ljmp START 는 START 라는 레이블로 점프하라는 명령입니다. (여기서는 START 가 바로 아래 있기 때문에 별 의미는 없습니다.) [F8]키를 치면 (Step over 의 단축키) 파란줄이 mov r0,#30h 에 옮겨집니다. mov 는 콤마(',') 뒤의 값을 콤마 앞의 레지스터에 옮기라는 (copy)명령입니다. 샾('#') 이 있으면 직접 수치를 의미하고 #이 없으면 내부 데이터 메모리라는 뜻입니다. 즉 r0 레지스터에 수치 30h 를 입력하라는 명령입니다. [F8]을 치면 데이터 창의 00 번지가 30 으로 바뀝니다. r0 가 내부 데이터 메모리 00 번지 임을 알 수 있습니다. 다음줄의 mov a,#3ah 는 A(ACC) 레지스터에 수치 3ah 를 입력하라는 명령이고, [F8]을 치면 레지스터 창의 ACC 에 3a 가 입력되는 것을 볼 수 있습니다. (A 레지스터 - 어큐물레이터(누산기)) 다음줄의 mov @r0,a 는 A 레지스터의 내용을 @r0 , 즉 r0 가 가리키는 메모리에 입력하라는 뜻입니다. 이것을 포인터 라고 합니다. r0 가 30h 값을 갖고 있으므로 30h 번지에 A 레지스터의 내용을 넣으라는 뜻이 됩니다. (r0, r1 앞에 @ 이 붙으면 포인터로 사용한다는 뜻입니다.) [F8]을 쳐서 내부 데이터 메모리 30 번지에 3a 가 입력되는 것을 확인하세요. inc r0 는 r0 의 내용을 하나 증가 하라는 뜻입니다. (이것을 포인터 증가 라고 합니다.) [F8]을 치면 r0 의 값이 하나 증가 됩니다. 즉 00 번지가 31 이 됩니다. add a,#2 는 A 레지스터에 2 를 더하라는 명령입니다. mov @r0,a 는 r0 가 가리키는 번지에 A 레지스터의 내용을 입력하라는 명령입니다. 결과는 31 번지에 3ch 가 입력됩니다. inc r0 는 r0 를 하나 증가하는 명령입니다. add a,r0 는 A 레지스터와 r0 의 내용을 더해서 A 레지스터에 결과를 두라는 명령입니다. 즉, A 레지스터(3ch) 와 r0(32h) 를 더해서(3eh) A 레지스터에 둡니다. mov @r0,a 는 포인터(@r0) 가 가리키는 번지, 32 번지에 A 레지스터 값을 옮기라는 명령이므로 32 번지에 6eh 값이 들어갑니다. 그 다음의 inc r0 를 실행하면([F8]) r0 가 33h 가 되고 add a,@r0 는 A 레지스터와 @r0 (33 번지의 내용) 을 더하라는 뜻이므로 A 레지스터는 그대로 6eh 가 됩니다. (33 번지의 내용이 00 이므로) mov @r0,a 를 실행하면 33 번지에 A 레지스터의 내용(6eh) 가 들어갑니다. inc r0 를 실행하면 r0 는 34h 가 되고 mov a,33h 는 A 레지스터에 33 번지의 내용을 옮기라는 명령입니다. 즉 ACC 는 6eh 가 됩니다. dec a 명령은 A 레지스터의 내용을 하나 감소하라는 명령입니다. 즉 ACC 는 6dh 가 됩니다. mov @r0,a 는 A 레지스터의 내용을 r0(=34h) 가 가리키는 내부 데이터 메모리에 입력하라는 명령입니다 34 번지에 6dh 가 입력된 것을 볼 수 있습니다. 마지막 줄의 sjmp $ 는 자기 자신으로 점프하라는 뜻입니다.(무한 루프)

댓글
댓글쓰기 폼
공지사항
최근에 달린 댓글
Total
1,227
Today
0
Yesterday
4
링크
TAG
more
«   2021/09   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
글 보관함