Показать сообщение отдельно
  #3  
Старый 15.07.2012, 18:28
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Следом вопрос: А как устанавливается Флаг Ас в True (False)?…
Вот моя процедура обработки флагов (заодно посмотрите пожалуйста правильно ли реализованы)…
Результат передается дважды в процедуру (см.пример вызов процедуры установки флагов SetAllFlags, из асм-команды ADDB для обработки результата как «округленный» типом Байт, и второй как Integer… стоит ли передавать два результата в процедуру?... Или может как-то по другому можно?....
Код:
Procedure SetAllFlags(ResByte:byte;ResInteger:Integer);// проверка результаустановка ВСЕХ флаго
var wremb,wremb1:byte;
begin
if (ResByte and 128)=128 then SetFlagS(true) else SetFlagS(False); //(7) S (sign - знак) - флаг знака.  Условия формирования:

If ResByte=0 then SetFlagZ(True) else SetFlagZ(False);// (6) Z (zero - ноль) - флаг нуля.  Условия формирования: //если результат операции <>0, то "0" FZ, если результат операции = 0, то 1FZ.

// (2)P - флаг четности.  Условия формирования: если результат операции чётный, то  1 FР, если результат операции нечётный, то  0?FР).//(Четный - это результат, в двоичном эквиваленте которого четное количество единиц).
wremb:=0;
if (ResByte and 128) =128 then wremb:=wremb+1; if (ResByte and 64) =64 then wremb:=wremb+1;
if (ResByte and 32) =32 then wremb:=wremb+1; if (ResByte and 16) =16 then wremb:=wremb+1;
if (ResByte and 8) = 8 then wremb:=wremb+1; if (ResByte and 4) = 4 then wremb:=wremb+1;
if (ResByte and 2) = 2 then wremb:=wremb+1; if (ResByte and 1) = 1 then wremb:=wremb+1;
if (wremb mod 2) = 0 then SetFlagP(True) else SetFlagP(False);

If (ResInteger>255) or (ResInteger<0) then SetFlagC(true) else SetFlagC(false);// (0) FC - флаг переполнения результата //Если при получении результата произошло переполнение в старшем седьмом разря-де,//то единица записывается в ячейку флага переполнения результата (1?FC).
end;//SetAllFlags(ResByte:byte;ResInteger:Integer);// проверка результаустановка ВСЕХ флагов


Procedure ADDB;// сложение
Begin
SetAllFlags(RgA+RgB,RgA+RgB);
RgA:=RgA+RgB;
end;
Админ: Пользуемся тегами для оформления кода!
Ответить с цитированием