게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
8051 C언어, 어셈블 코드 질문드립니다.
게시물ID : programmer_16641짧은주소 복사하기
작성자 : 전벙글이예요
추천 : 0
조회수 : 465회
댓글수 : 3개
등록시간 : 2016/04/10 21:07:21
옵션
  • 본인삭제금지
아래 코드들은 최대값을 도출해내는 코드입니다.

#include <reg51.h>
 
void main(void){
unsigned char i, max;     //i: for문용 && max: 최대값 데이터 저장
unsigned char R1 = 0x3F; //R1은 R0의 크기(R1 == 비교할 횟수라고 봐도 무방)
unsigned char R0[R1] = [R1만큼의 데이터를 넣었다고 가정]
unsigned char R2; //R0[R1]의 크기를 저장
unsigned char* R3; //R0 배열의 마지막 주소값 저장
 
max = R0[0]; //최대값에 R0배열의 첫번쨰 값 대입
 
for(i=0; i<R1; i++){
if(max < R0[i]) max = R0[i];
}
R2 = R1 * sizeof(R0); //sizeof를 써도 되는지?
R3 = &R0[R1-1];
}

위 C언어에서 궁금한점은 8051 C코딩할때도 sizeof를 써도 되는지가 의문입니다.

그리고 아래는 위 C코드를 어셈블로 대략적으로 바꾼것입니다
=============================================

ORG  0000H  ; 프로그램 시작

  JMP  START

;

START:  

  MOV  R0,#30H                   ; 데이터가 들어있는 최초의 주소를 R0에 저장

  MOV  R1,#3FH  ; 비교할 횟수 저장

  MOV  R2,#00H  ; 공간값계산을위해 0으로 초기화 --> 이 부분을 0으로 초기화하는데 #00H가 맞는지?

  MOV  MAX,@R0 ;MAX에 최초의 데이터를 저장

  MOV  R4, MAX  ; R4=MAX --> R4에 MAX값 저장

LOOP:  

  MOV  MAX, R4 ; 이부분은 도대체 왜 필요한것입니까? 버려도 무관한것 같은데...

  INC  R0   ;주소값 1 증가

  INC  R2   ;공간값 계산을 위해 루프를 돌때마다 ++시킴

  CLR  C

  SUBB  MAX,@R0       ; MAX와 R0가 지시하는 번지의 내용을 비교

  JNC  GREAT       ; MAX가 더 크면 GREAT로 점프

  MOV  MAX,@R0           ; 작으면 R0가 지시하는 번지의 내용을 MAX에 저장

  MOV  R4, MAX           ;

GREAT:   DJNZ  R1,LOOP

  MOV  70H, MAX

  MOV  R3, @R1-1 ;이건 직접 작성해본건데.. R3에 마지막주소값을 넣는 것입니다. 그 주소의 데이터가아니라 그 주소숫자자체!!

  END  ; 프로그램 끝


====================================================


그냥 C언어, 어셈블이라면 이해가 쉽겠는데

8051로 하려니 조금씩 달라져버려서 너무 혼란스럽니다..

궁금한 점은 모두 굵은 글씨로 처리해봤어요..ㅠㅠ

꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호