Обнаружение переполнения со знаком на 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
.