8080上的有符号溢出检测

时间:2017-11-09 14:48:30

标签: assembly integer-overflow intel-8080

如果x-y溢出,我想分支。

我想出将 xy 存储到 注册A ,存储 0 进入 寄存器B 比较 这两个寄存器。

与8086不同,8080 doesn't have an OF flag or jo / jno instructions

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

1 个答案:

答案 0 :(得分:1)

如果没有溢出意味着算术结果可以表示为8位有符号值,则应遵循以下规则:

  • 如果y = 0,则没有溢出。
  • 如果y > 0,则如果truncate(x - y) > x溢出。
  • 如果y < 0,则如果truncate(x - y) < x溢出。

此处truncate(x)表示x的截断的8位带符号值。

然后代码可能看起来像这样:

    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指令。