8051을 배우고있는데요...
교수님께서 명령어는 이런동작이다 ! 라고만 알려주고..
최소값 최대값 구하는 프로그램을 짜보라고해서..
이리저리 생각해보았지만..너무막막합니다.
30H~35H까지 임의의 값을 넣고 36H , 37H에 최대값과 최소값을 계산하여 저장하는 프로그램을 만들라고하셨어요...
R0를 사용해서 넣으라고하는데..
만들어 주시면 정말 감사하겠지만.. 너무 염치없어서
어떤명령어들을쓰고 어떤순서로 작성해야하는지..조언좀해주세요...
이레포트는 서브루틴까지 배우고 내주셨어요..그러니까 CJNE 까지는 사용할수있어요..
http://cluster1.cafe.daum.net/_c21_/bbs_search_read?grpid=lH2L&fldid=3zK1&datanum=185&contentval=&docid=lH2L3zK118520041113133526
8501 어셈블리어를 공부하는 분들에게 좋은 예제라고 생각해서 간단히 설명을 하겠습니다.
(8051 강좌와 8051 조각내기 강좌를 공부하시는 것이 도움이 되리라 생각합니다.)
내부 데이터 메모리 20h - 27h 까지 8 개의 (8비트 부호 없는) 데이터 중에서 최대값을 R2 (08h) 에 저장하는 프로그램을 작성합니다.
8051 에는 비교명령은 없고, 비교후 점프명령(cjne) 이 있습니다. 이 명령을 사용해서 데이터들을 비교해서 값이 큰 값을 R2 레지스터에 저장하는 방식으로 프로그램을 작성합니다.
아래 프로그램에서
$include (reg51.inc) 에서 reg51.inc 파일에는 8051 의 SFR 에 있는 레지스터 이름이 선언되어 있습니다. 이 파일을 포함하라는 명령입니다.
MAX EQU 0AH 명령은 0AH (뱅크 1 의 R2) 대신에 MAX 라는 이름으로 사용할 것을 선언합니다.
고동색 부분은 8 개의 (임의의) 데이터를 내부 데이터 메모리(20h - 28h) 에 저장하는 것입니다.
MOV PSW,#08H 명령은 뱅크 1 을 사용한다는 것입니다. 즉 R0 - R7 레지스터가 08h - 0Fh 가 됩니다.
MOV R0,#20H 명령은 R0 를 포인터로 사용하기 위해서 초기값(=20h) 을 할당하였습니다.
MOV R1,#7 명령은 R1 을 카운터로 사용하기 위하여 초기값(=07h) 을 할당하였습니다.
CJNE A,MAX,NEXT1 명령은 A 레지스터와 MAX 에 있는 내용을 비교하는 명령입니다. 비교후 무조건 NEXT1, 즉 다음 줄로 점프합니다. 이때 A 가 MAX 보다 작은면 C(캐리) 가 '1' 이 됩니다. A 가 MAX 보다 크거나 같으면 캐리는 '0' 이 됩니다.
DJNZ R1,LOOP1 명령은 카운터로 사용된 R1 을 -1 해서 0 이 아니면 점프하는 명령입니다.
$include (reg51.inc)
MAX EQU 0AH
;
ORG 0000H
;----------------------------
MOV 20H,#1BH
MOV 21H,#08H
MOV 22H,#35H
MOV 23H,#0B2H
MOV 24H,#0ABH
MOV 25H,#0FEH
MOV 26H,#48H
MOV 27H,#0BBH
;----------------------------
MOV PSW,#08H
MOV R0,#20H
MOV R1,#7
MOV MAX,@R0
LOOP1:
INC R0
MOV A,@R0
CJNE A,MAX,NEXT1
NEXT1:
JC NEXT2
MOV MAX,A
NEXT2:
DJNZ R1,LOOP1
JMP $
;----------------------------
END
위 프로그램을 RIDE51 통합환경에서 시뮬레이션 하는 과정을 살펴 보겠습니다.
프로젝트를 생성해서 어셈블(Make all) 하는 방법은 8051 강좌의 [[초급]] C 컴파일러 (RIDE51) 실행하기[1] 를 참조하세요.
스텝 단계로 동작을 보는 방법은 8051 강좌의 [[초급]] C 컴파일러 (RIDE51) 실행하기[2] 를 참조하세요.