【问题标题】:Explain how the AF flag works in an x86 instructions?解释 AF 标志在 x86 指令中是如何工作的?
【发布时间】:2010-12-22 21:07:37
【问题描述】:

我有一个小的 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 标志?

【问题讨论】:

    标签: c assembly x86 x86-16


    【解决方案1】:
    flags.af = (((base-subt) & ~0xf) != 0);
    

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

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

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

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

    【讨论】:

    • 我可以看到按位版本与其他版本的等效性。要是我第一次写这个模拟器的时候就知道堆栈溢出就好了! 7行代码变成1。
    • @Earlz,我省略了你所在的行&amp;0xf,在这个版本中这些仍然是必需的。不过,您可以轻松地将它们放入表达式中,但最终仍然是单行。
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 2018-04-03
    • 2017-12-03
    • 1970-01-01
    • 2013-05-18
    • 2017-12-28
    • 1970-01-01
    • 2016-08-18
    相关资源
    最近更新 更多