Assembly 8080上的签名溢出检测

Assembly 8080上的签名溢出检测,assembly,integer-overflow,intel-8080,Assembly,Integer Overflow,Intel 8080,如果x-y溢出,我想进行分支 我想到了将x-y存储到寄存器A,将0存储到寄存器B中,然后比较这两个寄存器 与8086不同 它适用于x=128,y=127,但不适用于x=0,y=0如果没有溢出意味着算术结果可表示为8位有符号值,则应适用以下规则: 如果y=0,则无溢出 如果y>0,则如果截断(x-y)>x则溢出 如果y

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

我想到了将x-y存储到寄存器A,将0存储到寄存器B中,然后比较这两个寄存器

与8086不同


它适用于x=128,y=127,但不适用于x=0,y=0

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

  • 如果
    y=0
    ,则无溢出
  • 如果
    y>0
    ,则如果
    截断(x-y)>x
    则溢出
  • 如果
    y<0
    ,则在
    截断(x-y)
    时溢出
此处
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:
    ...
lday;加载y。
莫夫b,a
lda-x;负载x。
莫夫c,a
b分项;如果truncate(x-y)=x,即y=0,则没有溢出。
cmp c
jz无溢出
jm-else;如果截断(x-y)x。
mov a,b;如果y>0,则溢出。
安娜a
jp溢出
无溢出:
...
; 此时y!=0并截断(x-y)

作为一种优化措施,在
jm else

之前,两条
mova,b
指令可以替换为一条
mova,b
指令,8080是否有
sub
设置的溢出标志?8086有一个签名溢出的
OF
标志(以及一个无符号环绕的CF标志),因此您可以只
sub
/
jo overflow
(即,如果溢出,只需执行并跳转。您可以始终
溢出
代码路径中添加b
以撤消)。有关溢出和进位的详细信息,请参阅。哦,您的意思是不能使用
jo
,因为8080没有
jo
指令或OF标志。这会更清楚。我假设您想要有符号算术,因为对于无符号
CF
来说,它已经起作用了。根据
x
y
的符号位,模拟自己的
,结果并不十分困难。具有相同符号的相减操作数不能溢出,否则结果应具有与
x
相同的符号<代码>OF=X7&!Y7&!R7 |!X7&Y7&R7
Z80使用P位表示ALU指令溢出。。。但是8080没有;这是一个Z80不能向后兼容的地方。相反,P位表示奇偶校验,这几乎是无用的
    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:
    ...