Обнаружение переполнения со знаком на 8080

Я хочу ветку, если x-y переполняется.

Мне пришла в голову идея сохранить xy в регистр A, сохранить 0 в регистр B и сравнить эти два регистра.

В отличие от 8086, 8080 не имеет флага OF или jo / jno инструкции

x db
y db

    lda x
    mov b,a
    lda y
    sub b
    mvi b,0
    cmp b
    jp overflow

notOverFlow HLT
overflow HLT    

Работает с x=128, y=127, но не со значениями x = 0, y = 0.

0 ответов

Если отсутствие переполнения означает, что арифметический результат может быть представлен как 8-битное значение со знаком, тогда должны применяться следующие правила:

  • если y = 0, то переполнения нет.
  • если y > 0, то переполнение, если truncate(x - y) > x.
  • если y < 0, то переполнение, если truncate(x - y) < x.

Вот truncate(x) означает усеченное 8-битное значение со знаком x.

Тогда код может выглядеть так:

    lda y       ; Load y.
    mov b, a

    lda x       ; Load x.
    mov c, a

    sub b       ; No overflow if truncate(x - y) = x, that is, y = 0.
    cmp c
    jz no_overflow

    jm else     ; Jump if truncate(x - y) < x.

                ; At this point y != 0 and truncate(x - y) > x.

    mov a, b    ; Overflow if y > 0.
    ana a
    jp overflow

no_overflow:
    ...

                ; At this point y != 0 and truncate(x - y) < x.
else:
    mov a, b    ; Overflow if y < 0.
    ana a
    jp no_overflow

overflow:
    ...

В качестве меры оптимизации два mov a, b инструкции можно заменить на одну mov a, b непосредственно перед jm else.

Другие вопросы по тегам