2016-11-03 2 views
1

가 찍은 값이 원래 0이면 fibonnaci 시퀀스에 대한 코드 rosettacode.comintel 8080 :이 코드에서 뭔가 빠졌습니까? 여기

FIBNCI: MOV C, A ; C will store the counter 
    DCR C  ; decrement, because we know f(1) already 
    MVI A, 1 
    MVI B, 0 
LOOP: MOV D, A 
    ADD B  ; A := A + B 
    MOV B, D 
    DCR C 
    JNZ LOOP ; jump if not zero 
    RET   ; return from subroutine 

찍은 우리는 C가 감소하고, C는 -1 되는가? 만약 그렇다면 제 2 DCR에서 그 가치는 어떻게 될 것입니다. JNZ 교육구는 무엇을 보거나합니까?

이것은 어셈블리 언어에 대한 나의 첫 접촉이므로 약간 혼란 스럽습니다. C가 이미 -1이고 JNZ 명령에 도달하면이 코드가 루프에 걸리지 않을 것이라고 생각합니다. 아니면 JNZ가 다른 곳에서 찾고 있습니까?

+1

게시 된 코드에 'A'가 표시되지 않습니다. 원래. 'C'의 루핑에서'A'는 당신이 계산하길 원하는 피보나치 수의 숫자였던 것처럼 보입니다. –

답변

3

인텔 8080 레지스터 A, B, C, ...은 8 비트입니다. 그렇다면 A

다음 C0b11111111가 (1로 설정된 모든 8 비트)로 8 비트 인코딩 -1을하게되고, 0이었다. 이를 부호없는 8 비트 값으로 처리하면 255과 같습니다. 당신이 1로 그 값을 증가한다면

지금은 0b100000000 진수 인 256이 될 것입니다 - 8 비트 폭이다>C로, 그 값은 00b00000000에 잘립니다. 그래서 -1 + 1 = 0, 예상대로 (그리고 부호가없는 수학에서는 255 + 1 = 0입니다. 왜냐하면 8 비트 제한에 도달 했으므로 값이 "오버플로"이기 때문입니다).

DCR 그 -1/255 값 감소의 C는 포함 -2 (부호 254에 해당하는 255 - 254 = 1 0b11111110와 같은 이진 모양으로).

JNZC이 255에서 다시 0에 도달 할 때까지 루프가 255 회 (A = 0 인수의 경우 A = 1의 경우 256 회 실행 됨) 루프를 실행한다는 것을 의미합니다. F (n-2)와 F (n-1)을 포함하는 AB 레지스터가 여러 번 오버플로되어 결국 결과를 사용할 수 없게됩니다 ... 마지막 올바른 결과는 A = 13이 233 일 것입니다 (너무 게으르다)) 입력 < 2 시작 수표

2

:

FIBNCI: CPI  2   ;return if A < 2 
     RC     ;F(0) = 0, F(1) = 1 

코드의 나머지 부분을 괜찮을 것 같습니다.

16 비트 결과를 얻으려면 두 번 더하기 (DAD)를 사용하도록 코드를 수정할 수 있습니다. F (2) = 1, F (3) = 2, F (4) 최대 16 비트 결과 입력은 24 : F (24) = 46368입니다.