본문내용
BCD 표현 서브루틴
MOVX@DPTR, A; (DPTR) <- BCD 표현값
INC R1; R1값 갱신
INC DPTR; 저장위치 갱신
DJNZR2, LOOP; R2값을 1씩 감소시키면서 0이 될 때까지 LOOP사이 반복
;
MOV PSW, #0H; BANK 0
JMP 0057H; 모니터 프로그램으로
;
; BCD 표현 서브루틴
; 10으로 나누어 10자리와 1자리를 구함
; 16진 입력값 R1, BCD 표현 출력값 : A
BCDDP:MOV A, R1
MOV B, #10
DIV AB
SWAPA; 몫을 상위 4비트로 이동
ORL A, B; 10자리(상위4비트) 1자리(하위4비트)
RET
;
END
------------------------------------------------------------------------------------------------
; SUBR3.ASM
ORG 4000H
MOV PSW, #08H; BANK 1
;
MOV R0, #30H; R0 <- 소수값 저장초기위치
MOV R1, #2; R1 <- 조사할 초기값
MOV R2, #98; R2 <- 조사횟수
LOOP:CALLSOTEST; 소수 판정 루틴
JZ LEND; A=0이면 LEND로 점프
;
CALLBCDDSP; BCD 표현 서브루틴 콜
;
MOV @R0, A; (R0) <- BCD표현 소수값
INC R0; 저장위치 갱신
LEND:INC R1; 조사할 값 갱신
DJNZR2, LOOP; R2값을 1씩 감소시키면서 0이 될 때까지 LOOP사이 반복
;
MOV PSW, #0H; BANK 0
JMP 0057H; 모니터 프로그램으로
;
; 소수 판정 루틴
; 조사할 입력값 R1, 출력값 소수이면 A=1, 아니면 A=0
; 소수 : 1과 자기자신이외의 수로는 나누어지지 않는 수
; 2부터 (R1-1)까지의 수로 나누어지는 수가 하나라도 있으면 소수가 아님.
SOTEST:MOV A, R1
CJNEA, #2, SOTST1
SJMPSOSU; 조사할 수가 2이면 소수
; 2이외의 수 소수판정 루틴
SOTST1:MOV R4, #2 ; R4 <- 나누어 조사할 초기값
CLR C
SUBBA, #2
MOV R5, A; 조사할 횟수 (R1-2)
SLOOP1:MOV A, R1; A <- 조사할 값
MOV B, R4; B <- 나눌값
DIV AB; 나누기
MOV A, B; A <- 나머지
JZ NOSOSU; 나머지가 0이면 소수가 아님
INC R4; 다음에 나눌수 갱신
DJNZR5, SLOOP1; R2값을 1씩 감소시키면서 0이 될 때까지 SLOOP1사이 반복
SOSU:MOV A, #1; 소수이면 A에 1 저장
JMP SOEND
NOSOSU:MOV A, #0; 소수가 아니면 A에 0 저장
SOEND:RET; 소수판정 루틴 종료
;
; BCD 표현 서브루틴
; 1씩 더해가며 10진 보정
; 16진 입력값 R1, BCD 표현 출력값 : A
BCDDSP:MOV A, R1
MOV R4, A; R4 <- R1
CLR A; A <- 0
BCDLOP:ADD A, #1; A <- A + 1
DA A; 10진 보정
DJNZR4, BCDLOP; R4값을 1씩 감소시키면서 0이 될 때까지 BCDLOP사이 반복
RET; BCD 표현 서브루틴 종료
;
END
------------------------------------------------------------------------------------------------
; SUBR_EXCISE1.ASM
ORG 4000H
MOV PSW, #08H; BANK 1
;
MOV 20H, #1FH; (20H) <- 1FH
;
CALLASCII; 서브루틴 ASCII 콜
MOV 21H, B; (21H) <- '1'->31H(ASCII 코드값)
MOV 22H, A; (22H) <- 'F'->46H(ASCII 코드값)
;
MOV PSW, #0H; BANK 0
JMP 0057H; 모니터 프로그램으로
;
; 서브루틴 ASCII
; 각 자리를 추출해서 기준 ASCII 코드값을 더해준다.
; 10자리(상위 4비트): '0'-> 30H(ASCII 코드값)
ASCII:MOV A, 20H
ANL A, #0F0H; 상위 4비트 마스크 처리
SWAPA; 상위 4비트 <-> 하위 4비트
;
ADD A, #30H; A <- 01H + 30H
MOV B, A; B레지스터 <- 31H
; 1자리(하위 4비트): 'A'-> 41H(ASCII 코드값)
MOV A, 20H
ANL A, #0FH; 하위 4비트 마스크 처리
;
CLR C
SUBBA, #0AH; A <- 0FH - 0AH
ADD A, #41H; A <- 05H + 41H
RET
;
END
------------------------------------------------------------------------------------------------
; SUBR_EXCISE2.ASM
ORG 4000H
MOV PSW, #08H; BANK 1
;
MOV 21H, #'1'; (21H) <- '1'->31H(ASCII 코드값)
MOV 22H, #'F'; (22H) <- 'F'->46H(ASCII 코드값)
;
CALLHEX; 서브루틴 HEX 콜
MOV 20H, A; (20H) <- 1FH
;
MOV PSW, #0H; BANK 0
JMP 0057H; 모니터 프로그램으로
;
; 서브루틴 HEX
; 각 레지스터 값을 HEX값로 변환한다.
; 변환한 HEX값을 10자리와 1자리로 구분한 후 더해준다.
; 10자리(상위 4비트): '1'-> 10H(HEX값)
HEX:MOV B, 21H; B레지스터 <- 31H
MOV A, B
CLR C
SUBBA, #30H; A <- 31H - 30H
;
SWAPA; 상위 4비트 <-> 하위 4비트
MOV B, A; B레지스터 <- 10H
; 1자리(하위 4비트): 'F'-> 0FH(HEX값)
MOV A, 22H; A <- 31H
CLR C
SUBBA, #41H; A <- 46H - 41H
ADD A, #0AH; A <- 05H + 0AH
; 10자리 + 1자리
ORL A, B; A <- 0FH + 10H
RET
;
END
MOVX@DPTR, A; (DPTR) <- BCD 표현값
INC R1; R1값 갱신
INC DPTR; 저장위치 갱신
DJNZR2, LOOP; R2값을 1씩 감소시키면서 0이 될 때까지 LOOP사이 반복
;
MOV PSW, #0H; BANK 0
JMP 0057H; 모니터 프로그램으로
;
; BCD 표현 서브루틴
; 10으로 나누어 10자리와 1자리를 구함
; 16진 입력값 R1, BCD 표현 출력값 : A
BCDDP:MOV A, R1
MOV B, #10
DIV AB
SWAPA; 몫을 상위 4비트로 이동
ORL A, B; 10자리(상위4비트) 1자리(하위4비트)
RET
;
END
------------------------------------------------------------------------------------------------
; SUBR3.ASM
ORG 4000H
MOV PSW, #08H; BANK 1
;
MOV R0, #30H; R0 <- 소수값 저장초기위치
MOV R1, #2; R1 <- 조사할 초기값
MOV R2, #98; R2 <- 조사횟수
LOOP:CALLSOTEST; 소수 판정 루틴
JZ LEND; A=0이면 LEND로 점프
;
CALLBCDDSP; BCD 표현 서브루틴 콜
;
MOV @R0, A; (R0) <- BCD표현 소수값
INC R0; 저장위치 갱신
LEND:INC R1; 조사할 값 갱신
DJNZR2, LOOP; R2값을 1씩 감소시키면서 0이 될 때까지 LOOP사이 반복
;
MOV PSW, #0H; BANK 0
JMP 0057H; 모니터 프로그램으로
;
; 소수 판정 루틴
; 조사할 입력값 R1, 출력값 소수이면 A=1, 아니면 A=0
; 소수 : 1과 자기자신이외의 수로는 나누어지지 않는 수
; 2부터 (R1-1)까지의 수로 나누어지는 수가 하나라도 있으면 소수가 아님.
SOTEST:MOV A, R1
CJNEA, #2, SOTST1
SJMPSOSU; 조사할 수가 2이면 소수
; 2이외의 수 소수판정 루틴
SOTST1:MOV R4, #2 ; R4 <- 나누어 조사할 초기값
CLR C
SUBBA, #2
MOV R5, A; 조사할 횟수 (R1-2)
SLOOP1:MOV A, R1; A <- 조사할 값
MOV B, R4; B <- 나눌값
DIV AB; 나누기
MOV A, B; A <- 나머지
JZ NOSOSU; 나머지가 0이면 소수가 아님
INC R4; 다음에 나눌수 갱신
DJNZR5, SLOOP1; R2값을 1씩 감소시키면서 0이 될 때까지 SLOOP1사이 반복
SOSU:MOV A, #1; 소수이면 A에 1 저장
JMP SOEND
NOSOSU:MOV A, #0; 소수가 아니면 A에 0 저장
SOEND:RET; 소수판정 루틴 종료
;
; BCD 표현 서브루틴
; 1씩 더해가며 10진 보정
; 16진 입력값 R1, BCD 표현 출력값 : A
BCDDSP:MOV A, R1
MOV R4, A; R4 <- R1
CLR A; A <- 0
BCDLOP:ADD A, #1; A <- A + 1
DA A; 10진 보정
DJNZR4, BCDLOP; R4값을 1씩 감소시키면서 0이 될 때까지 BCDLOP사이 반복
RET; BCD 표현 서브루틴 종료
;
END
------------------------------------------------------------------------------------------------
; SUBR_EXCISE1.ASM
ORG 4000H
MOV PSW, #08H; BANK 1
;
MOV 20H, #1FH; (20H) <- 1FH
;
CALLASCII; 서브루틴 ASCII 콜
MOV 21H, B; (21H) <- '1'->31H(ASCII 코드값)
MOV 22H, A; (22H) <- 'F'->46H(ASCII 코드값)
;
MOV PSW, #0H; BANK 0
JMP 0057H; 모니터 프로그램으로
;
; 서브루틴 ASCII
; 각 자리를 추출해서 기준 ASCII 코드값을 더해준다.
; 10자리(상위 4비트): '0'-> 30H(ASCII 코드값)
ASCII:MOV A, 20H
ANL A, #0F0H; 상위 4비트 마스크 처리
SWAPA; 상위 4비트 <-> 하위 4비트
;
ADD A, #30H; A <- 01H + 30H
MOV B, A; B레지스터 <- 31H
; 1자리(하위 4비트): 'A'-> 41H(ASCII 코드값)
MOV A, 20H
ANL A, #0FH; 하위 4비트 마스크 처리
;
CLR C
SUBBA, #0AH; A <- 0FH - 0AH
ADD A, #41H; A <- 05H + 41H
RET
;
END
------------------------------------------------------------------------------------------------
; SUBR_EXCISE2.ASM
ORG 4000H
MOV PSW, #08H; BANK 1
;
MOV 21H, #'1'; (21H) <- '1'->31H(ASCII 코드값)
MOV 22H, #'F'; (22H) <- 'F'->46H(ASCII 코드값)
;
CALLHEX; 서브루틴 HEX 콜
MOV 20H, A; (20H) <- 1FH
;
MOV PSW, #0H; BANK 0
JMP 0057H; 모니터 프로그램으로
;
; 서브루틴 HEX
; 각 레지스터 값을 HEX값로 변환한다.
; 변환한 HEX값을 10자리와 1자리로 구분한 후 더해준다.
; 10자리(상위 4비트): '1'-> 10H(HEX값)
HEX:MOV B, 21H; B레지스터 <- 31H
MOV A, B
CLR C
SUBBA, #30H; A <- 31H - 30H
;
SWAPA; 상위 4비트 <-> 하위 4비트
MOV B, A; B레지스터 <- 10H
; 1자리(하위 4비트): 'F'-> 0FH(HEX값)
MOV A, 22H; A <- 31H
CLR C
SUBBA, #41H; A <- 46H - 41H
ADD A, #0AH; A <- 05H + 0AH
; 10자리 + 1자리
ORL A, B; A <- 0FH + 10H
RET
;
END
소개글