본문 바로가기

Computer Science/Micro Process

[마이크로프로세서] Ch.3 Jump, Loop, and Call - 컴도리돌이

728x90
728x90

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

 

 

oscillator은 8051 내부에 내장되어 있다.

 

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


728x90
728x90