8080 上的签名溢出检测



如果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

相关内容

  • 没有找到相关文章

最新更新