Outline
1.Loop and Jump Instructions
2.Call instructions
3.Time delay
Loop and Jump Instructions
Loop : DJNZ (decrease jump not zero) - Conditional Jump Instructions
DJNZ reg, label
->DJNZ는 레지스터의 값을 1 감소한다. 만일 초기 값이 0이면, 그 값을 감소하여 FFH로 만든다. 만일 결과의 레지스터 값이 0이 아니면 프로그램은 상대 주소에 의해 지시되는 주소로 분기한다. 만일 레지스터의 결과 값이 0이면, 제어는 DJNZ 다음의 명령에서 계속된다.
<Example>
MOV A, #0
MOV R2, #4
AGAIN: ADD A, #03
DJNZ R2, AGAIN ; reg: R2, label: AGAIN
MOV R5, A
Loop | 1 | 2 | 3 | 4 | |
A | 0 | 3 | 6 | 9 | 12 |
R2 | 4 | 3 | 2 | 1 | 0 |
<Example>
MOV R6, #200
BACK: MOV R5, #100
HERE: DJNZ R5, HERE
DJNZ R6, BACK
총 loop가 반복된 수 : 200 x 100 = 20000
Loop : JZ ( jump if A = 0) - Conditional Jump Instructions
JZ label
->JZ는 ACC(A 레지스터)의 값이 0이면 상대 주소에 의해 지시되는 주소로 분기한다. 만일 ACC의 값이 0이 아니면, 프로그램은 JZ 다음 명령을 실행한다.
<Example>
MOV A, #0FEH
ADD A, #1H
JZ OVER
ADD A, #1H
JZ OVER
ADD A, #1H
JZ OVER
OVER: MOV R0, #0H
Loop : JNZ (jump if A ≠ 0) - Conditional Jump Instructions
JNZ label
->JNZ는 ACC(A 레지스터)의 값이 0이 아니면, 상대 주소에 의해 지시되는 주소로 분기한다. 만일 ACC의 값이 0이면, 프로그램은 JNZ 다음 명령을 실행한다.
<Example>
MOV A, R5
JNZ NEXT
MOV R5, #55H
NEXT: NOP ; no operation
->만약 R5가 0이면 R5에는 55H값이 저장되고, R5가 0 값이면 지시되는 NEXT 주소로 분기된다.
Loop : JNC (jump if no carry) - Conditional Jump Instructions
JNC label
->JNC는 CY비트(carry bit)가 0이면, 상대 주소에 의해 지시되는 주소로 분기한다.
->JNC는 CY비트(carry bit)가 1이면 JNC 다음 명령을 실행한다.
<Example>
MOV A, #0
MOV R0, A
MOV R5, A
MOV A, #79H ; A = A + 79H = 79H
ADD A, #0F5H ; A = 79H + F5H
JNC N2 ; if CY = 0, jump to the next summation
INC R5 ; if CY = 1, increment R5 to record the carry
N2: ADD A, #0E2H ; A = A + E2H
JNC N3 ; if CY = 0, increment R5 to record the carry
INC R5
N3: MOV R0, A
NOP
Loop : SJMP (Short Jump) - Unconditional Jump
SJMP label
->SJMP는 표시된 상대 주소로 무조건 분기한다. 상대 주소는 SJMP의 다음 명령으로부터 -128에서 +127 바이트 범위이어야 한다.
*대상이 현재 PC의 [-128, 127] 범위를 벗어나면 어떻게 되는가?
->LJMP로 바꾸어줘야 한다.
*offset은 8bit으로 제한되어 있기 때문에 -128에서 +127 바이트 범위로 제한되어 있다. (offset = 타켓 주소 - PC)
Loop : LJMP (Long Jump) - Unconditional Jump
LJMP label
->LJMP는 지시된 16bit 코드 (PC는 16-bit을 가지고, ROM의 주소 범위는 0000-FFFFH이다.) 주소로 무조건 분기한다.
Call Instructions
Call : LCALL(3-byte instruction)
LCALL code address
->대상 주소를 나타내는 데 16bit (2바이트)가 사용된다.
->서브루틴은 ROM(64KB)의 어느 곳에나 배치될 수 있다.
->LCALL은 서브루틴을 호출한다. LCALL은 PC값을 3 증가하고(PC = 0300H) 스택에 그 값을 하위 바이트부터 우선하여 저장한다. 그런 후, PC는 LCALL 명령을 뒤따르는 16비트 값으로 설정되어, 이 위치부터 프로그램을 실행한다.
*서브루틴 후 CPU가 PC가 가리키는 위치를 어떻게 아는가?
->서브루틴(0300H) 주소로 PC를 로드하기 전에 CPU는 다음 명령의 주소를 스택에 자동으로 PUSH 한다.. RET가 실행된 후 CPU는 자동으로 주소를 PC로 다시 POP 한다.
Call : ACALL(Absolute Call within 2-byte instruction)
ACALL address(11 bit)
->ACALL은 지시된 코드 주소에 있는 서브루틴을 무조건 호출한다. ACALL은 ACALL 뒤에 있는 명령의 주소를 하위 바이트부터 스택에 저장한다. 그런 후, PC를 갱신함으로써 프로그램 실행을 지시된 주소에서 계속한다. PC를 위한 새로운 값은 PC의 하위 바이트를 ACALL 명령의 두 번째 바이트로 대체하고, 페이지를 지시하는 3비트로 PC 상위 바이트의 0-2 비트를 대체함에 의해 계산된다. PC 상위 바이트의 3-7비트는 변경되지 않는다. PC의 11비트만이 ACALL에 의해 영향받기 때문에 ACALL 뒤의 첫 바이트로 동일한 2KB 블록 내에 위치한 루틴으로만(ROM의 0번지부터 2K-1번지까지) 호출이 이루 어진다.
Time delay
Clock
->crystal oscillator는 8051에 연결되어 8051을 위한 clock source를 제공한다.
->clock 빈도수(f) : 11.0592 MHz, 16 MHz, 20 MHz
Machine cycle
->CPU가 명령을 실행하기 위해 수행하는 기본 작업
->초기 8051 : 1 Machine cycle(12 oscillator periods)
->DS89C450 : 1 Machine cycle(1 oscillator periods)
*명령어마다 실행하는데 걸리는 시간이 다르다.
Delay
<example> - 8051
MOV R3, #data ;1MC
MOV P3, R1 ;2MC
NOP ;1MC
DJNZ R2, AGAIN ;2MC
<example> - 8051
ORG 300H ; 8051 system machine cycle
DELAY: MOV R3, #200 ; 1 MC
HERE: DJNZ R3, HERE ; 2 MC
RET ; 2 MC
machine cycle : 2 X 200 + 1 + 2 = 403mc
11.0592 MHz delay : 403 * 1.085us(12/11.0592) = 437.255 us
12 MHz delay : 403 * 1us (12/12) = 403us
<example> - DS89C450
DELAY: ; DS89C450 Machine cycle
MOV R2, #200 ; 2
AGAIN: MOV R3, #250 ; 2
HERE: NOP ; 1
NOP ; 1
DJNZ R3, HERE ; 4
DJNZ R2, AGAIN ; 4
RET ; 3
machine cycle : ((1 + 1 + 4 ) x 250 + 2 + 4 ) x 250 + 2 + 3 = 376,505 mc
11.0592 MHz delay : 376,505 * 0.09042 us(1/ 11.0592) = 34,043.5821 us or 34,043,582.1 ns
12 MHz delay : 376,505 * 0.0833us(1 / 12) = 31,362.8665 us or 31,362,866.5 ns
'Computer Science > Micro Process' 카테고리의 다른 글
[마이크로프로세서] Ch.8 Hardware Connection - 컴도리돌이 (0) | 2020.11.05 |
---|---|
[마이크로프로세서] Ch.2 어셈블리 언어 프로그래밍(Assembly language programming) - 컴도리돌이 (0) | 2020.11.03 |
[마이크로프로세서] Ch.1 마이크로컨트롤러(Introduction to Microcontroller)- 컴도리돌이 (0) | 2020.11.02 |