3

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

4

1 回答 1

1

如果没有溢出意味着算术结果可以表示为 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

于 2019-05-13T12:20:17.213 回答