5

我有一个小的 8086 仿真器,而且我已经有一个长期存在的错误 2 年了,因为 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 标志?

4

1 回答 1

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

检查高位是否为除零以外的任何值,这将指示低 4 位溢出或下溢。

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

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

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

在布尔表达式周围加上括号只是我的一种风格偏好,我知道它们是多余的。

于 2010-12-22T21:12:04.587 回答