我有一个小的8086仿真器,现在我有一个长时间的错误,大约两年了,AF在Sub内部的表现不正确并添加说明。

我目前计算其价值的方式是8位数字和减法:

uint8_t base=... , subt=...
base=base&0xF;
subt=subt&0xF; //isolate bottom nibble
if((int16_t)base-subt>7 || (int16_t)base-subt<-7){
    flags.af=1;
}else{
   flags.af=0;
}

(假设有这样的指示 sub base,subt )

并添加是这样的:

uint8_t base=... , adder=...
base=base&0xF;
adder=adder&0xF; //isolate bottom nibble
if(base+adder>7 || base+adder<-7){
    flags.af=1;
}else{
   flags.af=0;
}

(对于这样的指示 add base,adder)

如何正确计算模拟器中的AF标志以获取此类说明?

有帮助吗?

解决方案

flags.af = (((base-subt) & ~0xf) != 0);

检查上部位是否除了零以外的任何东西,这表明溢出或底流量从底部4位出现。

这是一个与您的原始版本更近的版本。请注意,两个4位数量之间的差异永远不会大于15。同样,添加永远不会小于0。

flags.af = ((int16_t)base-subt < -15);

flags.af = ((int16_t)base+adder > 15);

在布尔表达周围放置括号只是我的样式偏爱,我知道它们是多余的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top