如果没有溢出意味着算术结果可以表示为 8 位有符号值,则应适用以下规则:
- 如果
y = 0
,则没有溢出。
- 如果
y > 0
,则溢出 if truncate(x - y) > x
。
- 如果
y < 0
,则溢出 if 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
。