Объясните, как работает флаг AF в инструкциях x86? - PullRequest
6 голосов
/ 23 декабря 2010

У меня есть маленький эмулятор 8086, и у меня есть давняя ошибка в течение примерно 2 лет, когда AF не работает должным образом внутри саба и добавляет инструкции.

Мой текущий способ вычисления его значения таков: для 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 в моем эмуляторе для таких инструкций?

1 Ответ

4 голосов
/ 23 декабря 2010
flags.af = (((base-subt) & ~0xf) != 0);

Проверяет, являются ли верхние биты чем-либо, кроме нуля, что указывало бы на переполнение или недостаточное заполнение нижних 4 битов.

Вот версия, которая немного ближе к вашему оригиналу.Обратите внимание, что разница между двумя 4-битными величинами никогда не будет больше 15. Аналогично, сложение никогда не будет меньше 0.

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

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

Размещение круглых скобок вокруг логического выражения - просто мое предпочтение стиля,Я знаю, что они излишни.

...