DCX и флаг Carry - PullRequest
       69

DCX и флаг Carry

0 голосов
/ 18 апреля 2019

Я изучаю 8080 сборку как часть курса, который я предпринимаю. Я имею в виду руководство по программированию на языке Intel 8080-8085 (от 1977 г.).

В главе 3 Инструкции по эксплуатации, я вижу следующее описание по отношению к DCX:

DCX уменьшает содержимое указанной пары регистров на единицу. DCX не влияет ни на один из флагов условия.

Соответствующий пример говорит:

Предположим, что регистры H и L содержат адрес 9800H, когда инструкция DCX H выполнена. DCX считает содержимое двух регистрируется как одно 16-битное значение и, следовательно, выполняет заимствование из регистра H для получения значения 97FFH.

Я попробовал математику самостоятельно, используя дополнение к двум дополнениям, и определенно есть сгенерированный перенос.

Итак, мой вопрос: установлен ли бит переноса только в случае арифметических операций?

ТИА

PV

Ответы [ 2 ]

2 голосов
/ 12 мая 2019

DCX H, безусловно, является арифметической инструкцией, но 16-битные инструкции увеличения и уменьшения не меняют никаких флагов на i8080, хотя 8-битные, такие как DCR H и DCR L, делают.Более подробную информацию об этом вы можете найти в Руководстве пользователя микрокомпьютерных систем Intel 8080, доступном здесь:

http://www.nj7p.info/Manuals/PDFs/Intel/9800153B.pdf

Также может помочь просмотр внутренних элементов эмуляторов Z80.Вот соответствующие фрагменты для сравнения с моей реализацией:

    void on_dec_rp(regp rp) {
        self().on_set_regp(rp, dec16(self().on_get_regp(rp)));
    }

DCX rp

    void on_dec_r(reg r) {
        fast_u8 n = self().on_get_reg(r);
        fast_u8 f = self().on_get_f();
        fast_u8 hf = (n & 0xf) > 0 ? hf_mask : 0;
        n = dec8(n);
        f = (f & (cf_mask | yf_mask | xf_mask | nf_mask)) |
                (n & sf_mask) | zf_ari(n) | hf | pf_log(n);
        self().on_set_reg(r, n);
        self().on_set_f(f);
    }

DCR r

2 голосов
/ 18 апреля 2019

Если оставить в стороне конкретный процессор и просто учесть двоичную арифметику, то при вычитании 1 из 9800H не создается заимствование.Однако при добавлении 0FFFF к 9800H создается перенос.В обоих случаях вы получите 97FFH в 16 младших разрядах результата.

Независимо от выбора дизайна, введенного в CPU, вам нужно просто следовать документации, например этого документа, MCS®-80/ 85 FAMILY USER'S MANUAL .

В 5.6.1 говорится, что в группе передачи данных:

Флаги условий не затрагиваются никакими инструкциями в этой группе.

5.6.2 Арифметическая группа:

Если не указано иное, все инструкции в этой группе влияют на флаги «Ноль», «Знак», «Четность», «Перенос» и «Вспомогательный перенос» в соответствии со стандартными правилами.

Аналогично в 5.6.3 Логическая группа:

Если не указано иное, все инструкции в этой группе влияют на флаги Zero, Sign, Parity, Auxiliary Carry и Carry в соответствии сстандартные правила.

5.6.4 Группа филиалов:

Флаги условий не затрагиваются никакими инструкциями в этой группе.

5.6.5 Стек, I / O и MacГруппа управления hine:

Если не указано иное, на флаги условий не влияют никакие инструкции в этой группе.

Вам необходимо запомнить, как общие команды влияют на флаги.Вы можете скомпилировать простую шпаргалку или, возможно, найти другую, созданную кем-то другим (некоторые книги по сборке имели таковые для удобства программиста).

Если вас интересует, почему некоторые инструкции не влияют на флаги илинекоторые влияют на них определенным образом, это зависит.Причины могут быть разными, в зависимости от конкретной инструкции: более дешевая схема, более простое программирование общих проблем, совместимость с более ранними конструкциями или просто перенос вперед того, что сработало, без дополнительных размышлений.

...