解释AF标志在x86指令中的工作原理?

我有一个小的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标志以获取此类指令?

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

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

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

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

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