如果x-y
溢出,我想分支。
我想出了将x-y存储到寄存器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。
如果没有溢出意味着算术结果可表示为 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:
...
作为优化措施,可以在jm else
之前将两条mov a, b
指令替换为单个mov a, b
。