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:
...